2013-06-07 2 views
0

저는 Java로 게임을 만들고 있는데, 플레이어의 움직임을 연구하고 있습니다. 그러나 방향키를 누를 때마다 플레이어는 움직이지만 키를 놓으면 멈추지 않습니다.키를 놓을 때 플레이어의 움직임을 멈 춥니 다.

내가 잘못하고있는 것을 볼 수없는 것처럼 보입니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

// 입력 클래스는이 당신에게서 충분한 정보를 원하시면 아닌 모든 KeyListener

public static final int LEFT = 0; 
public static final int RIGHT = 1; 
public static final int UP = 2; 
public static final int DOWN = 3; 

public boolean[] keys = new boolean[64]; 

public void getKeys(KeyEvent e, boolean move) { 
    switch(e.getKeyCode()) { 
    case KeyEvent.VK_LEFT: 
     keys[LEFT] = move; 
     break; 
    case KeyEvent.VK_RIGHT: 
     keys[RIGHT] = move; 
     break; 
    case KeyEvent.VK_UP: 
     keys[UP] = move; 
     break; 
    case KeyEvent.VK_DOWN: 
     keys[DOWN] = move; 
     break; 
    case KeyEvent.VK_BACK_QUOTE: 
     keys[BQUOTE] = move; 
     break; 
    } 

    keys[OTHER] = move; 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    getKeys(e, true); 

} 

@Override 
public void keyReleased(KeyEvent e) { 
    getKeys(e, false); 

} 

@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

// 플레이어 클래스

public void tick() { 
    if (Engine.key_input.keys[KInput.LEFT]) { 
     dx  = -speed; 
    animDir = SpriteLoader.L; 
    sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir); 
} 
    if (Engine.key_input.keys[KInput.RIGHT]){ 
     dx  = speed; 
     animDir = SpriteLoader.R; 
     sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir); 
} 
if (Engine.key_input.keys[KInput.UP]){ 
     dy  = -speed; 
     animDir = SpriteLoader.U; 
     sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir); 
} 
if (Engine.key_input.keys[KInput.DOWN]){ 
     dy   = speed; 
     animDir = SpriteLoader.D; 
     sprite  = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir); 
} 
} 

// 엔진 클래스를

public class Engine { 
    public Input key_input; 
    public Engine() { 
     key_input = new Input(); 
    } 

    // add keyListener(Input) to component 
} 
+1

디버거를 단계별로 실행하고 무슨 일이 일어나는지 확인하십시오. – mwerschy

+0

어떤 클래스가'keys','getKeys()','keyPressed()'를 포함합니까? 그리고'getKeys()'를 대신'setKeys()'라고해야합니까? –

답변

0

핸들러에서는 키 [] = true 만 설정하지만 false로 되돌릴 수는 없습니다.

릴리스 된 모든 키를 이동 취소하는 keyReleased() 메소드를 추가해야합니다. 당신의 tick 방법에서

+0

아하, 그래, 내가 잊어 버린 것이있다. :) 고마워. – user2444217

1

을 구현합니다. "지금은 그것을 다음에 시간을 무시하려면, 나는이 keys 값을 사용했습니다"

public boolean[] keys = new boolean[64] 

어디 말한다 코드입니다 :하지만이 의심스러운입니까?

1

, 당신은 오직

public void tick() { 
    if (Engine.key_input.keys[KInput.LEFT]) { 
     dx  = -speed; 
    } else { 
     dx = 0; 
    } 

내가 animDirsprite의 결정을 만들 것입니다 ... 당신은 결코 이동 델타 예를 들어

를 재설정하지하는 "를 누르면"상태 확인 델타를 업데이트 한 후에 dxdy 개의 변수를 기반으로합니다.

나는 것 또한 확인 좌우측 및 상하 하나의 if 블록 ...

예를 들어

if (Engine.key_input.keys[KInput.LEFT]) { 
    dx  = -speed; 
} else if (Engine.key_input.keys[KInput.RIGHT]) { 
    dx  = speed; 
} else{ 
    dx  = 0; 
} 

이 실수로 움직임을 재설정하지 않도록합니다

관련 문제