用Java连续移动图像

时间:2015-06-14 07:42:38

标签: java loops if-statement graphics applet

我试图用我的计算机科学课程重新创建Java的DigDug游戏。

由于我只是一个初学者,我只会让怪物向上移动然后向下移动,而不是追逐玩家。我很难让怪物不断移动。它会上升,但它不会再回落,并且它不会重复。

以前,如果玩家到达该点,它将立即飞离屏幕,或者它根本不会移动。我尝试了一个for循环,一个while循环和一个do-while循环。我也尝试了延迟,但它停止了我的整个程序。目标是当玩家到达某个点时(340,270)使所有怪物上下移动。

Session_End

1 个答案:

答案 0 :(得分:1)

首先,您需要了解Painting in AWT and SwingConcurrency 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应该采用initstart方法,具体取决于您是否可以找出如何“暂停”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。你可以免费获得双缓冲