简体   繁体   中英

How to sleep/wait Java Swing Timer

In my platforming game, I have a swing timer that ticks the following method every 17 milliseconds. It is here that I run the various events that I need to run. My plan was to sleep the timer for 1 second whenever the player died.

My problem is that I don't really have a firm understanding of how to sleep a swing timer. Every example that I look at involves using a Thread which is not what I am doing. When I do the following I get a IllegalMonitorStateException error.

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();
}

Thanks in advance

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

You don't. You don't sleep anything in Swing, not unless you want to put your entire GUI asleep. Instead why not simply record the start time, check the elapsed time with each tick, and then activate whatever code you want activated when the elapsed time is greater than your cut-off?

Not sure what you're trying to do, but perhaps something in this sort of range (code not tested)

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();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM