【问题标题】:How to delay within a single method while not delaying the whole program in java?java - 如何在单个方法内延迟而不延迟整个Java程序?
【发布时间】:2017-09-09 00:12:54
【问题描述】:

我正在用 Java 编写一个绘制一系列矩形的蛇形程序。我不明白如何延迟块的方向变化,以便蛇形矩形在按下箭头键的同一位置改变方向。当程序的其余部分继续运行时,我需要在一种方法中等待。当按下箭头键时,它会触发此方法来改变我的矩形的方向(u 代表向上,d 代表向下......)

`public void changeDirection(String dir)
{
    for(int i = 0; i<snakearray.size(); i++)
    {
     //checks to make sure youre not changing straight from l to r or u to d
        if(dir.equals("r")||dir.equals("l"))
        {
            if(//direction of currect element is up or down)
            //makes the current element of the array change to the new direction
            {snakearray.set(i, snakearray.get(i).newDirection(dir));}
        }
        else if(dir.equals("u")||dir.equals("d"))
        {
            if(//current element's direction is right or left)
            {snakearray.set(i, snakearray.get(i).newDirection(dir));}
        }
        //pause method but not game method needed here????
    }
}`

有没有办法实现我需要的暂停?我已经尝试过 thread.sleep(20) 方法,但这会暂停我的整个程序......

【问题讨论】:

  • 这段代码需要在自己的线程中
  • 如果你想要这种行为,你应该创建另一个线程并使用它。但在你这样做之前,你会睡主线程
  • 在你的 main 方法中放 Thread t = new Thread(changeDirection) 然后 t.sleep(whatever)。
  • 听起来像是 XY 问题。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem 实现蛇游戏不需要线程和延迟。
  • @ammoQ 确实如此,更糟糕的是人们正在回答 Y。

标签: java thread-sleep pause delayed-execution


【解决方案1】:

忘记只为一种简单的方法创建新线程。您想要一个执行移动的时间,例如每秒一次,并且您应该改变移动蛇的方式。

首先是时机:

swing.Timer:https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html 它非常易于使用,并且具有很多功能。

或者您可以通过测量自上次移动以来的时间来实现一个非常基本的计时。

您将需要一个lastTime 和一个now 变量。

now = currentTime();
if(now - lastTime > delay){
    moveSnakeParts();
    lastTime = currentTime();
}

其次,您不想延迟蛇的部分。一条蛇有一个你可以控制的头和一个身体部位的列表。您所要做的就是移动头部以存储其先前的位置,将第一个身体部位移动到头部先前的位置并存储第一个身体部位的先前位置等等......我希望你能明白。

【讨论】:

  • 我已经设置了我的程序,以便它的流动运动,所以头部不会每次都移动它的长度,因为最终看起来太不稳定了,这就是为什么我没有尾巴移动到头部的先前位置,因为它们几乎完全在彼此之上
  • 你不必移动你的蛇的长度,你仍然可以将下一条蛇的位置移动到头部最后一个位置的末端。假设你的蛇块是 10 x 10 平方,它移动了 1px。如果头部左下角为 0 0,则其右下角为 10 0,这将是向左移动 1px 后第一个主体的位置。无论如何,您可以通过多种方式创建它的运动,但它不睡觉会解决您的问题。
  • 我建议您按照我回答的方式实施它,如果您对所需运动有疑问,请再问一个问题。
【解决方案2】:

您可以使用所谓的ScheduledExecutorService。这将允许您以给定的延迟在单独的线程中执行您的代码。


示例:

  @Test
  public void test() throws ExecutionException, InterruptedException {
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    ScheduledFuture<?> future = service.schedule(() -> changeDirection("r"), 2, TimeUnit.SECONDS);

    // Just for the test to wait until the direction change has been executed
    // In your code you would not need this if you want your program to continue
    future.get();
  }

  private void changeDirection(String dir) {
    System.out.println("Changing direction to " + dir);
    // Your code
  }

说明:

上面的代码会延迟 2 秒执行您的方法。此处称为future 的返回值可用于跟踪执行何时完成。如果你使用它,你的程序会一直等到执行完成。
由于您不希望您的主程序等待,只需忽略/不要使用调用future.get(),您的主代码将继续执行,不会延迟,只会延迟预定的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多