[問題] 遊戲攻防階段循環的loop
參考了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
→
11/20 05:28, , 1F
11/20 05:28, 1F
→
11/20 05:31, , 2F
11/20 05:31, 2F
不好意思,稍微自問自答一下
發文前雖然已經看過上面那個網址,但當時看不太懂
後來看了另一篇文章,加上自己實作(修改程式)後,
終於理解網址(同上面): 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)
推
11/27 11:21, , 3F
11/27 11:21, 3F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):