2017-04-13 93 views
3

我正在写一个用java绘制一系列矩形的蛇程序。我不明白如何按顺序延迟块的方向更改,以便蛇形矩形在与箭头键相同的位置全部改变方向。我需要在一种方法中等待程序的其余部分继续运行。当按下箭头键,它会触发这个方法来改变我的矩形的方向(U最多,d为降...)如何在一个单一的方法内延迟,而不是延迟在java中的整个程序?

`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)方法,但暂停了我的整个程序...

+0

此代码将需要在它自己的线程 –

+0

如果你想要这种行为,你应该创建另一个线程并使用它。 但直到你这样做,你会睡主线程 –

+1

只是在你的主要方法把线程t =新线程(changeDirection),然后t.sleep(无论)。 –

回答

0

您可以使用所谓的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()并且您的主代码将继续执行而不会延迟,只有计划的方法会被延迟。

1

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

首先时机:

swing.Timer:https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html 它非常容易使用,它有很多fun​​cionalities的。

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

您将需要一个lastTimenow变量。

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

其次,你不想耽误蛇的部件。蛇有一个你可以控制的头部和一个身体部位列表。所有你需要做的就是移动头部存储它的前一个位置,移动第一个身体部位到头部先前的位置和存储第一个身体部位先前的位置,等等......我希望你明白了。

+0

我有我的程序设置,使其流动的运动,使头像每次都不会移动它的长度,因为最终看起来太过分了,这就是为什么我没有将尾巴移动到头的前一个位置,因为他们将几乎完全在另一个之上 –

+0

你不必移动你的蛇的长度仍然可以移动下一块蛇的位置到头最后位置的末尾。让我们说你的蛇片是10×10平方英尺,移动1px。如果头左下角为0 0,那么它的右下角为10 0,这将是1px向左移动后的第一块体的位置。无论如何,你可以用很多方式创造它的运动,但是不睡觉什么可以解决你的问题。 – eldo

+0

我建议你按照我回答的方式来实现它,如果你对你想要的动作有问题,可以再问一个问题。 – eldo