作者togs (= =")
看板java
标题[问题] 游戏攻防阶段循环的loop
时间Wed Nov 20 03:48:27 2013
参考了google上一些文章,但对於游戏设计的loop还是不是很懂
我目前做的方法属於比较笨的方法
整体大致的架构为
public class CardBattleFrame extends JFrame{
... //游戏参数部分
public CardBattleFrame(){
... //放入JLabel,JButton等等
gameStart(); //自订method
然後陆续设了许多method,并且在每个method结尾执行另一个method,
以此达成循环对手回合与玩家回合的目的
简单说明如下:
玩家按下名为"玩家回合结束"的JButton後执行battle();
接着在battle方法的最後一行执行enemyStart(),
enemyStart方法里最後一行执行playerStart(),
以此步骤让达成玩家与敌人攻守交替的效果
程式就像是下面这样:
void playerStart(){ ........ }
玩家在画面点JButton执行battle()方法,
battle(){ ...
..
enemyStart(); //进入敌人回合
}
enemyStart(){ ...
..
playerStart(); //进入玩家回合
}
回到playerStart()後,让玩家点击"回合结束"按钮再次进入
於是我在public static void main里写入这一行
CardBattleFrame loginFrame = new CardBattleFrame();
游戏便开始进行 (直到玩家点选exit button)
老实说这方法感觉上相当新手 (也确实是新手
说不上来哪里不太对,但就是不对的感觉
於是後来有想过1个方法:
方法1.
让gameFrame(自订的class) extends JFrame implements Runnable
并在public static void main里头建立一个thread
如下:
while(gameIsRunning == true){
playerStart()
thread.pause //设法让thread停在玩家开始的阶段,
//等待玩家press"结束玩家回合"的按钮後才让thread继续下去,
//也就是执行下面的battle、enemyStart然後回到playerStart停住
battle()
enemyStart()
}
然而这方法有个难点 (Ans是从网上找来的
1. 如何藉由写在建构子里头的JButton操控main里面的thread继续执行与否?
Ans. 藉由改变boolean旗标值 用 Thread.interrupt(); 完成??
或者说其实根本不需要用到thread (简单说用thread是多此一举
在main里面就能够写出回合loop
while(gameIsRunning == true){
playerStart()
暂停 //等待玩家click button让程式继续执行下一行
battle()
enemyStart()
}
还是说,在main里面写game的loop根本就是不对的方式?
Java新手求方向,感谢~(‧ω‧‵)~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.224.211.167
2F:→ togs:该不会上面这是正确解答? 11/20 05:31
不好意思,稍微自问自答一下
发文前虽然已经看过上面那个网址,但当时看不太懂
後来看了另一篇文章,加上自己实作(修改程式)後,
终於理解网址(同上面):
http://www.java-gaming.org/index.php?topic=24220.0
里面一部分的意思,并且真的可行( ̄▽ ̄)b
虽然仍然不懂
doGameUpdates();
render();
这两段的意思
(doGameUpdates似乎是更新游戏资料?,
但render就真的不晓得了。该不会是重绘图形或GUI?)
但终於做出游戏攻防交替的动作了 (跪
程式大致如下:
public class CardBattleFrame extends JFrame{
boolean loopIsRunning = true;
... //中间省略 (设定参数
public CardBattleFrame() throws Exception {
... //中间省略 (设定JLabel位置 JPanel外观样式
loopGame(); //进入游戏回圈
}
void loopGame() throws InterruptedException{
while(loopIsRunning == true){
switch (nowRunningStepNumber) {
case -1: break;
case 0:
playerTurnStart(); //进入玩家回合
nowRunningStepNumber = -1; //之後每次进入loop则跳出
break;
case 1:
enemyTurnStart(); //进入敌人回合
nowRunningStepNumber = -1;
break;
default:
}
Thread.sleep(1); //每隔1毫秒重新进loop一次
}
当玩家点选名为"玩家回合结束"的JButton时,
将nowRunningStepNumber的值设为1,
此举使得(一毫秒过後)再次进入loop时,
enemyTurnStart()这个方法将会被执行
接着在enemyTurnStart()这个方法的最後一段叙述里
加上一行: nowRunningStepNumber = 0;
则程式再次进入玩家的回合
依此类推,玩家不断在loop间循环,
直到loopIsRunning被改为false
最後: (cardGame为自订名称)
public static void main(String[] args) throws Exception {
CardBattleFrame cardGame = new CardBattleFrame();
}
如此一来游戏程式就可以开始跑了
目前(正在学习中的初学者)在下的体认只到这里
感觉上switch可以换成更为简单的写法,(换言之可能没必要用到switch
虽然实作上这样的程式可以让玩家在攻防之间来回跑
但不晓得这样做是否恰当与适合?
还请多指教<(_ _)>
※ 编辑: togs 来自: 36.224.211.167 (11/20 06:36)
3F:推 ypsps:switch用if + bool 会更快点? 虽然没什麽差.. 11/27 11:21