如何在基本的RPG游戏中使用Thread.sleep

时间:2017-01-22 19:37:42

标签: java multithreading swing

我一直在研究这个非常基本的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而不影响玩家的移动?如果没有,我可以用什么其他方法让怪物移动得更慢而不是玩家呢?

我不确定如何解决这个问题,任何建议都会有所帮助!谢谢:))

2 个答案:

答案 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