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

标签 java multithreading swing

我一直在开发这个非常基本的 Java RPG 游戏,当我尝试使用 Thread.sleep 让我的怪物移动得更慢时,它似乎也会影响玩家,换句话说,玩家的移动当怪物出现时减速,但当我移动到 map 上没有怪物的地方时又恢复正常

这是怪物移动的代码

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而不影响玩家的移动?如果不是,我可以使用什么其他方法来让怪物移动速度变慢而不是玩家移动速度变慢?

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

最佳答案

这是一个事件驱动的 Swing GUI,所以问题的答案是:

How to use Thread.sleep(...)

你不吗?

您将其编码为线性控制台程序,并且此设计不适用于事件驱动的非线性程序。在 Swing 事件线程上(尤其是在任何绘画方法中)调用 Thread.sleep 可以保证让整个 GUI 进入休眠状态,从而使其完全无响应。正确的解决方案是创建一个非 GUI 模型类来配合您的 GUI(您的“ View ”),并根据以下状态更改 View 的响应方式:状态模型,即其关键字段的状态。

此外,如果您的游戏是“实时”运行的,那么您将需要一个游戏循环来驱动您的游戏。这可以通过 Swing Timer 轻松完成,尽管它不提供绝对精度。如果需要更高的精度,则使用 Swing 计时器,但不要假设每个时间切片都是准确的,而是测量每个增量时间并将物理基于测量的切片,而不是假设的切片。创建游戏循环的其他方法包括使用带有 while 循环的后台线程以及该线程内的 Thread.sleep。

关于java - 如何在基本 RPG 游戏中使用 Thread.sleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41795315/

相关文章:

java - 项目中所需库 tomcat-embed-websocket 的存档无法读取或不是有效的 ZIP 文件

java - 在资源文件夹中找不到 logback.xml

java - 使用多线程在java中下载文件

c# - 防止线程不必要地执行 CoSTLy 任务

java - JButton不会显示

java - 在 Java 中过滤组合框数据

java - JOptionPane 输入对话框

java - 输入已知的算法的时间复杂度?

java - Web 应用程序中的图像在重新部署之前不会显示?

java - Java 同步失败