java 板


LINE

參考了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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP