[問題] 遊戲攻防階段循環的loop

看板java作者 (= =")時間10年前 (2013/11/20 03:48), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串1/2 (看更多)
參考了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: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
switch用if + bool 會更快點? 雖然沒什麼差..
11/27 11:21, 3F
文章代碼(AID): #1IYy2DiU (java)
文章代碼(AID): #1IYy2DiU (java)