좋아, 그래서 나는 학교를위한 2D 측면 스크롤러 게임을 만들고있다. Mario와 거의 비슷합니다. (마치 내가 마칠 때의 나의 희망입니다.) 오른쪽 화살표 키를 눌러 플레이어를지도를 따라 움직이면, 그는 한 번 움직이고 잠시 멈추고 부드럽게 움직이기 시작합니다. 이것은 키를 누르고있을 때 모든 사과 노트북에있는 일시 중지 때문이라고 생각하지만 내 게임에서이 문제를 해결하는 방법을 모르겠습니다. 어떤 충고? 고맙습니다.키를 누르는 방법을 일시 중지하지 않으시겠습니까?
-1
A
답변
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;
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()를 호출합니다.
관련 문제
- 1. + 키를 누르는 방법을 결정 하시겠습니까?
- 2. 배경을 입력 한 후 앱을 일시 중지하지 않으시겠습니까?
- 3. 일시 중지하는 방법, Swift에서 앱/프로그램을 중지하지 않으시겠습니까?
- 4. 키를 누르는
- 5. 응용 프로그램을 일시 중지하지 않고 일시 중지
- 6. Powershell 타이머가 일시 중지하지 않고
- 7. 키를 누르는 방법은?
- 8. 각도기가 디버그를 일시 중지하지 않습니다
- 9. FragmentStatePageAdapter는 단편을 일시 중지하지 않습니다.
- 10. Java 입력을 일시 중지하지 않고
- 11. RPG : 누르는 키를 결정하십시오
- 12. 프로그램을 일시 중지하지 않고 콘솔에서 읽음
- 13. 전체 프로그램을 일시 중지하지 않고 메서드를 일시 중지하려면 어떻게해야합니까?
- 14. 키보드의 키를 누르는 기능이 있습니까?
- 15. 키를 누르는 것을 감지하려고 시도합니다.
- 16. 셀렌에서 2 키를 누르는 방법
- 17. Mac에서 마지막 키를 누르는 방법?
- 18. 공개 키를 Java에서 누르는 방법
- 19. 프로그램을 일시 중지하지 않고 문자를 얻는 방법
- 20. 코코스 2d 안드로이드가 게임을 일시 중지하지 않습니다.
- 21. 실행을 일시 중지하지 않는 C++ 루프
- 22. 스위프트 타이머 지연이 실행을 일시 중지하지 않습니다.
- 23. While 루프 문제 : 일시 중지하지 않음
- 24. 응용 프로그램을 일시 중지하지 않고 MsgBox 사용
- 25. 키를 누른 상태에서 누른 상태에서 키를 누르는 것 사이의 지연
- 26. 데이터베이스 설계 : OK? 외래 키를 사용하지 않으시겠습니까?
- 27. 문자열 테이블 : int 키를 추가하거나 추가하지 않으시겠습니까?
- 28. 애니메이션 GIF를 일시 중지하지 않고 어떻게 이동할 수 있습니까?
- 29. wp8 키를 길게 누르는 경우 이벤트 처리 방법
- 30. HTML5 게임의 키를 사용하여 일시 중지 토글
@ syb0rg : 예, 그 해결책은 키 바인딩과 스윙 타이머를 사용합니다. –