2017-04-13 12 views
3

나는 일련의 직사각형을 그리는 자바에서 뱀 프로그램을 작성 중이다. 나는 뱀 사각형이 화살표 키가 눌려진 동일한 지점에서 방향을 모두 바꿀 수 있도록 순서대로 블록의 방향 변경을 지연시키는 방법을 이해하지 못합니다. 프로그램의 나머지 부분이 계속 실행되는 동안 한 가지 방법으로 기다려야합니다. 화살표 키를 누를 때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???? 
    } 
}` 

제가 필요 일시 정지를 구현하는 방법이있다 (... 다운 들어 처리를 위해 D를 U)를이 방법 내 직사각형의 방향을 변경하는 트리거? thread.sleep (20) 메서드를 시도했지만 내 전체 프로그램을 일시 중지했습니다 ...

+0

이 코드는 자체 스레드에 있어야합니다. –

+0

이 동작을 원할 경우 다른 스레드를 만들어 사용해야합니다. 하지만 당신이 할 때까지 주 스레드를 잠을 것입니다 –

+1

그냥 주 방법 스레드 넣어 스레드 = 새로운 스레드 (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

하나의 간단한 방법에 대해서만 새 스레드를 만드는 것을 잊어 버리십시오. 예를 들어 1 초에 한 번 움직이는 타이밍을 원하면 뱀을 움직이는 방향을 변경해야합니다.

먼저 타이밍 :

swing.Timer : https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html 그것의 매우 사용하기 쉬운하고 funcionalities 많이있다.

또는 마지막 이동 이후의 시간을 측정하여 매우 기본적인 타이밍을 구현할 수 있습니다.

lastTimenow 개의 변수가 필요합니다.

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

두 번째로 뱀의 부분을 지연시키고 싶지 않습니다. 뱀에는 당신이 통제 할 수있는 머리와 신체 부위의 목록이 있습니다. 당신이해야 할 일은 이전 위치를 저장하는 머리를 움직이는 것, 첫 번째 신체 부위를 머리 이전 위치로 이동시키고 첫 번째 신체 부위를 이전 위치에 저장하는 것 등등.

+0

나는 내 프로그램이 그렇게 흐름을 움직일 수 있도록 머리가 너무 길어지는 것을 보았 기 때문에 머리 길이가 그 길이만큼 움직이지 않도록 설정했다. 그래서 꼬리가 머리의 이전 위치로 움직이지 않기 때문이다. 거의 전적으로 서로의 상단에있을 것입니다 –

+0

길이로 뱀을 움직여야하지 않아도 뱀의 다음 위치를 머리 마지막 위치로 이동할 수 있습니다. 말하자면 뱀 조각은 10 제곱으로 10 픽셀이고 1px 씩 움직입니다. 왼쪽 하단 머리글이 0 0이면 오른쪽 하단이 10 0이고 왼쪽으로 1 픽셀 이동 한 후 첫 번째 본문 부분의 위치가됩니다. 어쨌든 당신은 여러 가지 방법으로 그것의 움직임을 만들 수 있습니다. 그러나 당신의 골칫거리를 해결할 수있는 것은 자지 않습니다. – eldo

+0

나는 내가 대답 한 것과 같은 방식으로 그것을 구현하도록 권하고 만약 당신이 원하는 움직임에 문제가 있다면 그것에 대해 한 가지 더 질문하십시오. – eldo