저는 Java로 2D 게임을 만들고 있습니다. KeyListener와 일부 부울을 사용하여 키를 감지했습니다. 그러나 문제는, 플레이어가 0.5 초 동안 움직이지 않고 움직이기 시작한 키를 누르고있을 때입니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?자바 - 게임에 컨트롤을 추가하는 가장 좋은 방법
공개 무효 keyPressed (...) { PlayerX + = 3; } 답변을 주시면 감사하겠습니다. 우리가 할 수
저는 Java로 2D 게임을 만들고 있습니다. KeyListener와 일부 부울을 사용하여 키를 감지했습니다. 그러나 문제는, 플레이어가 0.5 초 동안 움직이지 않고 움직이기 시작한 키를 누르고있을 때입니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?자바 - 게임에 컨트롤을 추가하는 가장 좋은 방법
공개 무효 keyPressed (...) { PlayerX + = 3; } 답변을 주시면 감사하겠습니다. 우리가 할 수
는 자바 게임 컨트롤을 처리 할 수있는 여러 가지 방법이 있습니다 만,라는 클래스를 포함 할 것입니다 내 prefereble 방법은 .. "Key.class"
내부 Key.class을 말할 수 :
public class Key{
// Creating the keys as simply variables
public static Key up = new Key();
public static Key down = new Key();
public static Key left = new Key();
public static Key special = new Key();
/* toggles the keys current state*/
public void toggle(){
isDown = !isDown;
}
public boolean isDown;
}
이제 특정 키를 눌렀다면 액세스 할 수있는 클래스가 생겼습니다.하지만 먼저 키 .isDown 함수가 올바르게 토글되어야합니다. KeyListener를 구현하는 클래스에서이 작업을 수행합니다.
의이
지금이 클래스는 우리를 위해 우리의 키 바인딩을 모두 처리합니다} 우리는 "Controller.class"가
package game;
// Importing the needed packages
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.HashMap;
public class Controller implements KeyListener{
//Assigning the variable keys to actual letters
public Controller(Main main){
bind(KeyEvent.VK_W, Key.up);
bind(KeyEvent.VK_A, Key.left);
bind(KeyEvent.VK_S, Key.down);
bind(KeyEvent.VK_D, Key.right);
bind(KeyEvent.VK_SPACE, Key.special);
mainClass = main;
}
@Override
public void keyPressed(KeyEvent e) {
other[e.getExtendedKeyCode()] = true;
keyBindings.get(e.getKeyCode()).isDown = true;
}
@Override
public void keyReleased(KeyEvent e) {
other[e.getExtendedKeyCode()] = false;
keyBindings.get(e.getKeyCode()).isDown = false;
}
public boolean isKeyBinded(int extendedKey){
return keyBindings.containsKey(extendedKey);
}
@Override
public void keyTyped(KeyEvent e) {
}
public void bind(Integer keyCode, Key key){
keyBindings.put(keyCode, key);
}
public void releaseAll(){
for(Key key : keyBindings.values()){
key.isDown = false;
}
}
public HashMap<Integer, Key> keyBindings = new HashMap<Integer, Key>();
public static boolean other[] = new boolean[256];
을 가정 해 봅시다, 그리고 캔버스 나 게임이 실행되는 어떤 당신에게 addKeyListener 가정 그것에 따라 Key.up/down/left/right/special을 적절하게 변경하고 기능을 변경합니다.
마지막 단계는이 모든 것을 효율적이고 쉽게 움직이는 캐릭터로 구현하는 것입니다. 게임에서 엔티티를 가정
우리는 이제 간단하게 추가 할 수 있습니다 .. 모든 틱 또는 유사한 무언가를 실행 갱신() 메소드가로
if(Key.up.isDown) y+=3;
또는 경우에 우리는 메인 클래스에 넣어 수 있으며, 게임 틱 루프에서와 같은 방식으로하십시오.
if(Key.right.isDown) PlayerX += 3;
이것은 OS에서 누른 키의 반복 동작 (자동 반복)과 같습니다. 텍스트 편집기에서 키를 누른 채로두면, 표시되는 첫 번째 문자와 다음 문자 사이에 짧은 시간이 있음을 알 수 있습니다. Windows에서는 500ms이지만 다른 플랫폼에서는 그렇지 않습니다.
관련 코드를 게시하십시오/프로젝트 정보를 참조하십시오. – moonwave99
애니메이션과 키보드 입력 코드를 별도의 스레드로 분리하려고 했습니까? –
@HernanVelasquez 아니요, 문제가 아닙니다. – Ewen