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灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP