2014-05-18 8 views
0

간단한 질문입니다. 나는 Pong 게임을 다시 만들려고합니다. KeyEvents로 이동하는 두 개의 패들로 화면에 원하는 그래픽이 있습니다. 내 유일한 문제는 하나의 키를 놓으면 다른 패들도 멈 춥니 다 (둘 다 동시에 움직이는 경우). 왜 이런 일이 일어나는지 정확히 알지만 문제를 파악할 수는 없습니다. keyReleased 메서드가 호출 될 때 양쪽 패들이 속도 0으로 설정되기 때문에 일어납니다. keyReleased 메서드를 사용하여 두 패를 개별적으로 이동/중지 할 수있는 방법을 다르게 코드화 할 수 있습니까?KeyEvents에 대한 도움이 필요하십니까

코드 : 당신의 keyPressed 방법 및 당신의 keyReleased 방법의 차이에서

package pong.main; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class PongGame extends JPanel implements ActionListener,KeyListener { 

private final int WIDTH = 750; 
private final int HEIGHT = 750; 
private int DELAY = 20; 
private int IMAGE_SIZE = 35; 

private ImageIcon paddle_one; 
private ImageIcon paddle_two; 
private ImageIcon pong_logo; 
private ImageIcon pong_ball; 
private Timer timer = new Timer(DELAY, this); 

private int p1_x = 10; 
private int p1_y = 325; 

private int p2_x = 710; 
private int p2_y = 325; 

private int p1_moveX; 
private int p1_moveY; 

private int p2_moveX; 
private int p2_moveY; 

public PongGame(){ 

    timer.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 

    paddle_one = new ImageIcon("C:\\Users\\Bryan\\Pictures\\paddle.gif"); 
    paddle_two = new ImageIcon("C:\\Users\\Bryan\\Pictures\\paddle.gif"); 
    pong_logo = new ImageIcon("C:\\Users\\Bryan\\Pictures\\pong_logo.gif"); 
    pong_ball = new ImageIcon("C:\\Users\\Bryan\\Pictures\\pong_ball.gif"); 

    setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    setBackground(Color.black); 

} 

public void paintComponent(Graphics g){ 

    super.paintComponent(g); 

    paddle_one.paintIcon(this, g, p1_x, p1_y); 
    paddle_two.paintIcon(this, g, p2_x, p2_y); 
    pong_ball.paintIcon(this, g, 350, 350); 
    pong_logo.paintIcon(this, g, 220, -100); 

} 

public void actionPerformed(ActionEvent e){ 

    repaint(); 

    p1_x += p1_moveX; 
    p1_y += p1_moveY; 

    p2_x += p2_moveX; 
    p2_y += p2_moveY; 
} 

public void paddle_one_up(){ 
    p1_moveX = 0; 
    p1_moveY = -5; 
} 

public void paddle_one_down(){ 
    p1_moveX = 0; 
    p1_moveY = 5; 
} 

public void paddle_two_up(){ 
    p2_moveX = 0; 
    p2_moveY = -5; 
} 

public void paddle_two_down(){ 
    p2_moveX = 0; 
    p2_moveY = 5; 
} 

public void keyPressed(KeyEvent e){ 
    int code = e.getKeyCode(); 

    if(code == KeyEvent.VK_W){ 
     paddle_one_up(); 

    } 
    if(code == KeyEvent.VK_S){ 
     paddle_one_down(); 

    } 

    if(code == KeyEvent.VK_UP){ 
     paddle_two_up(); 

    } 
    if(code == KeyEvent.VK_DOWN){ 
     paddle_two_down(); 

    } 
} 

public void keyReleased(KeyEvent e){ 

    int code = e.getKeyCode(); 

    if(code != KeyEvent.VK_W){ 
     p1_moveX = 0; 
     p1_moveY = 0; 
    } 

    if(code != KeyEvent.VK_S){ 
     p1_moveX = 0; 
     p1_moveY = 0; 
    } 

    if(code != KeyEvent.VK_UP){ 
     p2_moveX = 0; 
     p2_moveY = 0; 
    } 
    if(code != KeyEvent.VK_DOWN){ 
     p2_moveX = 0; 
     p2_moveY = 0; 
    } 
public void keyTyped(KeyEvent e){} 

} 
+0

순차적 'if'문으로 가정하면 'else if'를 사용해보십시오. 그것이 현재하고있는 것은 "키가 W가 아닌 경우 속도 == 0"입니다. . . 그리고 나서 "키가 S가 아닌지, 속도 == 0"인지를 확인합니다. 따라서 키가 W이면 두 번째 검사가 실패합니다. 그 반대. – Gorbles

답변

1
  1. 봐.
  2. keyReleased에서도 비슷한 작업을 수행합니다. KeyEvent 객체의 키 코드를 확인한 다음 그에 따라 작동합니다. 이 두 가지 방법의 차이점과이를 해결할 수 없다는 점은 keyPressed 코드가 빌린 코드임을 시사합니다. 먼저 코드를 이해한다면 코드를 빌릴 수 있습니다. 아이디어를 빌리고 자신의 코드를 작성하는 것이 좋습니다.
  3. KeyListeners를 사용하는 것보다 안전하고 좋은 솔루션 인 Key Bindings를 사용하는 것이 더 좋습니다. 당신의 keyPressed() 방법의 조건부 논리의 구조를 사용
+0

나는 keyRelease에 대한 또 다른 체크를했는데, 여전히 똑같은 일을하고있다. 나는 keyevents에 아직도 새롭다 그래서 나가 간단한 무언가를 놓치고있는 경우에 저를 정정하십시오. – Bfrank

+0

@Bfrank : 당신은 똑같은 일을하지 않습니다. 당신은'! ='가 아닌'=='을 사용하고 있습니다. 이것은 완전히 다른 논리를 줄 것입니다. –

+0

좋아요, 나는 ==로 바꿨지만 같은 결과를 얻고 있습니다. – Bfrank

0

, 당신은 당신이 중 하나를 패의 속도를 설정하기 전에 출시 된 키를 확인할 keyReleased()에서 유사한 검사가 필요합니다. 그대로두면 어떤 키도 놓을 수 있고 keyReleased()은 p1과 p2의 값을 0으로 할당합니다.