有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何睡眠/等待Java Swing计时器

在我的平台游戏中,我有一个swing计时器,它每17毫秒勾选一次下面的方法。就是在这里,我运行我需要运行的各种事件。我的计划是每当玩家死亡时,让计时器休眠1秒

我的问题是,我真的没有一个坚定的理解如何睡眠摆动计时器。我看到的每一个例子都涉及到使用一个线程,这不是我正在做的。当我执行以下操作时,我得到一个非法MonitorStateException错误

public void actionPerformed(ActionEvent e) 
{
    if (!louis.isDead)
    {
        if (louis.right)
        {
            louis.moveR();
        }
        if (louis.left)
        {
            louis.moveL();
        }
        if (!louis.left && !louis.right) 
            louis.friction();

        louis.gravity();

        louis.checkCol(charMap, mapX, mapY);

        mapX -= louis.moveX();
        mapY -= louis.moveY();

        louis.checkDeath(charMap, mapX, mapY);
    }
    else
    {
        try {
            time.wait(1000);
        } catch (InterruptedException e1) {e1.printStackTrace();}
        mapX = initMapX;
        mapY = initMapY;
        louis = new Player(spawnX, spawnY);
    }
    repaint();
}

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    My problem is that I don't really have a firm understanding of how to sleep a swing timer.

    你不会。你不会在秋千上睡觉,除非你想让整个GUI都睡着。相反,为什么不简单地记录开始时间,用每个刻度检查经过的时间,然后在经过的时间大于截止时间时激活任何你想要激活的代码呢

    不确定您想做什么,但可能是在这种范围内(代码未测试)

    private static final long TOTAL_DEATH_TIME = 1000L; // total time of your delay
    
    private long deathInitTime = -1L;  // start time of death throes
    
    public void actionPerformed(ActionEvent e) {
        if (!louis.isDead) {
    
            // .... etc... unchanged from your code
    
        } else {
            // he's dead
            if (deathInitTime < 0) {
                // if dead but just now dead, initialize deathInitTime
                deathInitTime = System.currentTimeMillis();
            } else {
                // he's been dead
                // check how long he's been dead
                long deathTime = System.currentTimeMillis() - deathInitTime;
                if (deathTime > TOTAL_DEATH_TIME) {
                    // if he's been dead long enough, call this code
                    mapX = initMapX;
                    mapY = initMapY;
                    louis = new Player(spawnX, spawnY);
                    deathInitTime = -1L;  // and re-initialize deathInitTime
                }
            }
        }
        repaint();
    }