我试图用我的计算机科学课程重新创建Java的DigDug游戏。
由于我只是一个初学者,我只会让怪物向上移动然后向下移动,而不是追逐玩家。我很难让怪物不断移动。它会上升,但它不会再回落,并且它不会重复。
以前,如果玩家到达该点,它将立即飞离屏幕,或者它根本不会移动。我尝试了一个for循环,一个while循环和一个do-while循环。我也尝试了延迟,但它停止了我的整个程序。目标是当玩家到达某个点时(340,270)使所有怪物上下移动。
Session_End
答案 0 :(得分:1)
首先,您需要了解Painting in AWT and Swing和Concurrency in Java。我也不鼓励使用Applet
,applets有一堆你可能现在不需要处理的问题。
paint
方法不是更新UI状态的地方,paint
方法应该只绘制当前状态。您也不应该在paint
方法中更改UI的状态,这可能会导致问题无法结束
首先,您需要某种“游戏循环”,此循环负责更新游戏状态并安排更新到UI
在主循环中,我们维持一个移动“delta”,它描述了特定对象的变化量以及在哪个方向,在本例中,我只处理enemies1
,但是你可以想象任何移动都需要它自己。
在游戏循环的每个循环中,我们将delta应用于对象的当前位置,进行边界检查并根据需要反转delta ...
e1y += moveDelta;
if (e1y >= 210) {
e1y = 209;
moveDelta *= -1;
} else if (e1y <= 120) {
e1y = 121;
moveDelta *= -1;
}
下面的mainLoop
应该采用init
或start
方法,具体取决于您是否可以找出如何“暂停”Thread
Thread mainLoop = new Thread(new Runnable() {
@Override
public void run() {
int moveDelta = -1;
gameOver = false;
while (!gameOver) {
if (ifEntered) {
if (digx > 330) {
digx--;
} else if (digy < 247) {
digy++;
}
repaint();
}
// Removed some code here for testing
e1y += moveDelta;
if (e1y >= 210) {
e1y = 209;
moveDelta *= -1;
} else if (e1y <= 120) {
e1y = 121;
moveDelta *= -1;
}
if (digy > e1y && digy < (e1y + 20) && digx > e1x && digx < (e1x + 20) || e1y == digy || e1x == digx) {
gameOver = true;
} else if (digy > e2y && digy < (e2y + 20) && digx > e2x && digx < (e2x + 20) || e2y == digy || e2x == digx) {
gameOver = true;
} else if (digy > e3y && digy < (e3y + 20) && digx > e3x && digx < (e3x + 20) || e3y == digy && e3x == digx) {
gameOver = true;
}
try {
Thread.sleep(40);
} catch (InterruptedException ex) {
}
repaint();
}
}
});
mainLoop.start();
然后,您需要使用仅描绘游戏当前状态的代码替换paint
方法
@Override
public void paint(Graphics g) {
super.paint(g);
score(g);
background(g);
g.setColor(Color.white);
//g.fillRect(player.x, player.y, 10, 10);
if (gameOver) {
g.setColor(Color.white);
g.drawString("GAME OVER", 294, 260);
} else {
g.drawImage(diggy, digx, digy, 20, 20, null);
g.drawImage(flower, 680, 41, 20, 20, null);
g.drawImage(enemies1, e1x, e1y, 20, 20, null);
g.drawImage(enemies2, e2x, e2y, 20, 20, null);
g.drawImage(enemies3, e3x, e3y, 20, 20, null);
}
}
现在,我建议您转储Applet
以支持JPanel
(针对核心逻辑)和JFrame
(用于显示)和Swing {{1}而不是Timer
。你可以免费获得双缓冲