nai*_*are 9 java events event-driven-design swingworker
我用Java创建了我的第一个游戏.这场比赛是垄断.我正在努力设计游戏以模拟其回合制结构(管理玩家转弯).我想允许单个人控和一个或多个AI控制的玩家玩游戏.
我的具体问题是我不知道是否实现游戏循环,这意味着可以管理玩家的循环以及与大富翁游戏直接相关的变量,(想想诸如提示每个玩家轮到他们的事情,将转弯增加到下一个玩家,或者依次从每个玩家获得骰子.我并不是指"游戏循环"这个术语的更低级含义,它更多地涉及屏幕上的绘图框架,更新物理或以特定的时间更新AI.
我的理解是,我尝试实现我需要的选择是:
当我第一次尝试解决这个问题时,我遇到了我的UI冻结的问题,因为我的游戏循环永无止境,并且完全消耗了它运行的线程(我只是做了一个非常简单的while循环来说明这一点) .所以我开始创建一个SwingWorker封装我的游戏循环的努力.这解决了UI冻结的问题,但仍然让我想知道我是否走错了路.
作为一般规则,我发现网上的大多数建议似乎都支持任何事件驱动的方法,因此我目前使用a的实现SwingWorker可能是朝错误方向迈出的一步.但是我无法完全理解如何为这个特定任务实现一个完全事件驱动的系统(意味着没有游戏循环存在).在我看来,一个循环必须存在于某个地方,以管理玩家转弯.
以下是我的具体问题:
SwingWorker)以避免冻结UI?我的情况是特定于Java的,但我想我也会对非Java特定情况的答案感兴趣.目前,我使用MVC模式组织了我的代码.我的控制器是我的游戏循环(实际SwingWorker线程)所在的位置.它远非完整,但它有助于说明我如何管理玩家转向我称之为"游戏循环".
SwingWorker 控制器的代码:
swingWorker = new SwingWorker<Void, Model>() {
@Override
protected Void doInBackground() throws InterruptedException {
gameLoopRunning = true;
while (gameLoopRunning) {
//to do: use a timer instead of thread.sleep
Thread.sleep(1000);
//user turn prompt
if (model.getActivePlayer().isUserControlled()) {
boolean userRolled = false;
while(!userRolled) {
System.out.println("Roll the dice please...");
Thread.sleep(3000);
}
}
//bot turn prompt
else {
//insert code for bot rolling dice here
model.rollDice();
}
publish(model);
Thread.sleep(1000);
model.incrementPlayerTurn();
publish(model);
}
return null;
}
@Override
protected void process(List<Model> chunks) {
Model gameModel = chunks.get(chunks.size() - 1);
//hard-coded for 6 players
for (int i = 0; i < 6; i++) {
view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn());
}
view.getGamePanel().getDice().setDie1(model.getDie1());
view.getGamePanel().getDice().setDie2(model.getDie2());
}
};
swingWorker.execute();
Run Code Online (Sandbox Code Playgroud)
SirDarius的评论很有见.
虽然,对于像推进玩家转弯这样简单的事情,你并不需要费心去实现一个完整的有限状态机.
就MVC而言,这是你应该为人类玩家做的事情:
模型:提供将活动玩家推进到下一个玩家以及通过"转弯过程"(即掷骰子,移动活动玩家的令牌等)的方法.由于大部分转弯过程都是事件驱动的,因此这些方法调用将来自控制器中的事件侦听器.
视图:在活动玩家完成转弯时提升事件,以及在各种其他输入上提升事件.
控制器:每当玩家完成转弯时,告诉模型前进到下一个玩家,并再次开始"转弯过程".每当玩家提供输入时,将触发一个事件,告诉模型前进到转弯的下一个阶段.
对于AI玩家,可以使用大多数相同的代码,但是通过视图驱动转弯进程是没有意义的.相反,该模型需要另一种"转弯过程"方法,该方法专门针对AI玩家.唯一的区别是代码将在不等待视图输入的情况下连续执行,而不是一系列事件侦听器.
| 归档时间: |
|
| 查看次数: |
12200 次 |
| 最近记录: |