2012-09-16 3 views
0

저는 Java로 2D 게임을 만들고 있습니다. KeyListener와 일부 부울을 사용하여 키를 감지했습니다. 그러나 문제는, 플레이어가 0.5 초 동안 움직이지 않고 움직이기 시작한 키를 누르고있을 때입니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?자바 - 게임에 컨트롤을 추가하는 가장 좋은 방법

공개 무효 keyPressed (...) { PlayerX + = 3; } 답변을 주시면 감사하겠습니다. 우리가 할 수

+0

관련 코드를 게시하십시오/프로젝트 정보를 참조하십시오. – moonwave99

+1

애니메이션과 키보드 입력 코드를 별도의 스레드로 분리하려고 했습니까? –

+0

@HernanVelasquez 아니요, 문제가 아닙니다. – Ewen

답변

2

는 자바 게임 컨트롤을 처리 할 수있는 여러 가지 방법이 있습니다 만,라는 클래스를 포함 할 것입니다 내 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; 
1

이것은 OS에서 누른 키의 반복 동작 (자동 반복)과 같습니다. 텍스트 편집기에서 키를 누른 채로두면, 표시되는 첫 번째 문자와 다음 문자 사이에 짧은 시간이 있음을 알 수 있습니다. Windows에서는 500ms이지만 다른 플랫폼에서는 그렇지 않습니다.

관련 문제