2013-05-05 3 views
-1

좋아, 그래서 나는 학교를위한 2D 측면 스크롤러 게임을 만들고있다. Mario와 거의 비슷합니다. (마치 내가 마칠 때의 나의 희망입니다.) 오른쪽 화살표 키를 눌러 플레이어를지도를 따라 움직이면, 그는 한 번 움직이고 잠시 멈추고 부드럽게 움직이기 시작합니다. 이것은 키를 누르고있을 때 모든 사과 노트북에있는 일시 중지 때문이라고 생각하지만 내 게임에서이 문제를 해결하는 방법을 모르겠습니다. 어떤 충고? 고맙습니다.키를 누르는 방법을 일시 중지하지 않으시겠습니까?

+1

@ syb0rg : 예, 그 해결책은 키 바인딩과 스윙 타이머를 사용합니다. –

답변

1

한 가지 해결책은 키 입력 방식에서는 boolean keyUP = true이고 키 입력 방식에서는 keyUP = false으로 설정하는 것이 해결책입니다. 이렇게하면 키를 눌렀을 때 "Up was pressed move up, up was pressed move up....". 대신 키를 놓을 때까지 "keep moving up"으로 등록됩니다. 이렇게하면 입력시 초기 지연 (Linux에서 매우 눈에 띄는 것)이 제거됩니다. 우리 게임에서

:

private boolean up, down, left, right; 

public void keyReleased(KeyEvent e) { 
    switch (e.getKeyCode()) { 
    case KeyEvent.VK_S: 
     down = false; 
     break; 
    case KeyEvent.VK_W: 
     up = false; 
     break; 
    case KeyEvent.VK_A: 
     left = false; 
     break; 
    case KeyEvent.VK_D: 
     right = false; 
     break; 
    } 
} 


public void keyPressed(KeyEvent e) { 
    switch (e.getKeyCode()) { 
    case KeyEvent.VK_S: 
     down = true; 
     break; 
    case KeyEvent.VK_W: 
     up = true; 
     break; 
    case KeyEvent.VK_A: 
     left = true; 
     break; 
    case KeyEvent.VK_D: 
     right = true; 
     break; 
+0

이것이 효과가 있습니다! 정말 고맙습니다! – GrayW3

+0

당신은 환영합니다 :) – arynaq

1

당신은 내가 다음을 가정 할 수있는 코드를 전송하지 않았지만. 키를 누를 때 무언가를하는 키 리스너를 구현했다고 생각합니다. 사용자가 키를 누른 채로 있으면 프로그램이 약간의 지연 후에 두 번째 이벤트를 가져오고 이벤트를 더 빠르게 가져 오기 시작합니다.

이것은 필요한 것이 아닙니다. 처음에는 키가 눌려지지 않았을 때 한 번만 변경되는 응용 프로그램 상태 인 keyIsPressed을 유지해야합니다. 그런 다음 키가 눌러져있을 때만이 변수를 끄십시오. 키가 처음으로 작아지면 객체를 움직이는 백그라운드 스레드를 시작하고 플래그 keyIsPressed을 주기적으로 검사하여 언제 중지해야하는지 알 수 있습니다.

마리오의 경쟁자가 될 행운을 빕니다 ... :)

0
  • 이 스윙 GUI의 경우,
  • 가 키 누름에 스윙 타이머를 시작, 키 바인딩이 아닌 키 리스너 사용
  • 키 릴리스시 중지하십시오.
0

모든 KeyEvents는 정수이므로, KeyEvents의 모든 변경 사항을 저장할 부울 []을 만들 수 있습니다. Java2d의 경우 다음과 같이 사용합니다.

import java.awt.KeyEventDispatcher; 
import java.awt.event.KeyEvent; 

public final class Keyboard implements KeyEventDispatcher { 

    public static boolean[] keyPressed = new boolean[256]; 
    public static boolean[] keyHold = new boolean[256]; 
    public static boolean[] keyReleased = new boolean[256]; 

    public static void update() { 
     for (int i=0; i<128; i++) { 
      keyPressed[i] = false; 
      keyReleased[i] = false; 
     } 
    } 

    public boolean dispatchKeyEvent(KeyEvent e) { 
     if (e.getID()==KeyEvent.KEY_PRESSED) { 
      keyHold[e.getKeyCode()] = true; 
      keyPressed[e.getKeyCode()] = true; 
     } 
     else if (e.getID()==KeyEvent.KEY_RELEASED) { 
      keyHold[e.getKeyCode()] = false; 
      keyReleased[e.getKeyCode()] = true; 
     } 
     return false; 
    } 

} 

각 프레임마다 update()를 호출합니다.

관련 문제