我一直在研究这个非常基本的Java RPG游戏,当我尝试使用Thread.sleep让我的怪物移动得更慢时,它似乎也影响了玩家,换句话说,玩家的运动已经当怪物出现时减速,但当我移动到怪物不存在的地图的另一部分时变回正常
这是怪物运动的代码
int wolfRandNum;
if (isKilled() == false){
wolfRandNum = (int) (Math.random()*4);
if (wolfRandNum == 1){ // up
System.out.println("up");
if (playerRow -1 <= 0){
setCurrentEnemySprite(3);
} else {
moveUp();
playerRow--;
}
} else if (wolfRandNum == 2){ // down
System.out.println("down");
if (playerRow +1 >= 8){
setCurrentEnemySprite(0);
} else {
moveDown();
playerRow++;
}
} else if (wolfRandNum == 3){ // left
System.out.println("left");
if (playerColumn -1 <= 0){
setCurrentEnemySprite(1);
} else {
moveLeft();
playerColumn--;
}
} else{ // right
System.out.println("right");
if (playerColumn + 1 >= 9){
setCurrentEnemySprite(2);
} else {
moveRight();
playerColumn++;
}
}
}
上面的代码是一个名为update的方法,它来自敌人类。
以下是我称之为方法的地方:
public void paintComponent(Graphics g) {
super.paintComponent(g); //required to ensure the panel is correctly redrawn
map.draw(g);
player.draw(g);
for (Character character : characterList) {
character.draw(g);
}
for (Enemy enemy : enemyList){
enemy.draw(g);
try {
enemy.update();
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (Item item : bagList) {
item.draw(g);
}
repaint();
}
无论如何使用thread.sleep而不影响玩家的移动?如果没有,我可以用什么其他方法让怪物移动得更慢而不是玩家呢?
我不确定如何解决这个问题,任何建议都会有所帮助!谢谢:))
答案 0 :(得分:4)
这是一个事件驱动的Swing GUI,所以问题的答案是:
如何使用
Thread.sleep(...)
是你不。
您将其编码为线性控制台程序,此设计不适用于事件驱动的非线性程序。在Swing事件线程上调用Thread.sleep
,尤其是在任何绘制方法中,都可以保证整个GUI处于睡眠状态,以使其完全无响应。正确的解决方案是创建一个非GUI模型类来与您的GUI(您的&#34; View&#34;)一起使用,并根据 状态更改视图的响应方式 模型,即其关键字段的状态。
此外,如果您的游戏正在&#34;实时&#34;中运行,那么您将需要一个游戏循环来驱动您的游戏。这可以通过Swing Timer轻松完成,但不提供绝对精度。如果需要更高的精度,则使用Swing Timer,但不要假设每个时间片都是准确的,而是测量每个增量时间并将物理基础放在测量的切片上,而不是假定切片。创建游戏循环的其他方法包括在此线程中使用带有while循环的后台线程和Thread.sleep。
答案 1 :(得分:1)
你正在放慢速度的是你的怪物的渲染(绘图)。由于所有绘图都是在UI线程上完成的,正如您正确注意到的那样,这将对整个应用程序产生巨大的性能影响。作为一般规则,您绝不应在UI线程中调用阻塞操作,例如sleep
。
鉴于你只有两个角色,我会考虑尝试创建两个线程,一个用于你的角色,一个用于你的怪物。您将在每个线程中执行您需要执行的操作,然后在需要重绘时调用repaint()
。例如,如果你想减慢怪物的速度,你可以在怪物线程中调用sleep
。