2016-06-06 3 views
1

아주 간단한 pong에 대해이 코드를 작성했습니다. KeyListener를 작동시키는 방법을 알아낼 수 없다는 점만 제외하면 모든 것이 잘 작동합니다. 리스너를 넣을 곳이나 사용 방법을 모르겠습니다. 다른 팁도 환영합니다, 나는 멍청이이므로 그 수준까지 설명해주십시오.KeyListener가 JFrame에서 응답하지 않습니다.

package pong; 

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

public class Pong extends JPanel implements KeyListener 
{ 
    int border = 15; 

    int enemyScore = 0; 
    int playerScore = 0; 

    int ballx = 248; 
    int bally = 170; 

    int playerx = 482; 
    double playery = 162; 
    int playeryy = 162; 

    int enemyx = 0; 
    double enemyy = 162; 
    int enemyyy = 162; 

    boolean gameReset = true; 

    boolean down; 
    boolean right; 

    //ball movement 
    private void moveBall() 
    { 
     Random rand = new Random(); 

     while (gameReset == true) 
     { 
      ballx = 240; 
      bally = 170; 
      down = rand.nextBoolean(); 
      right = rand.nextBoolean(); 
      gameReset = false; 
     } 

     if (right == true) 
     { 
      ballx++; 
     } 
     else 
     { 
      ballx--; 
     } 

     if (down == true) 
     { 
      bally++; 
     } 
     else 
     { 
      bally--; 
     } 

     if(bally == getHeight()-border) 
     { 
      down = false; 
     } 
     else if (bally == 0) 
     { 
      down = true; 
     } 

     if (playeryy < bally+14 && playeryy+59 > bally && ballx == 468) 
     { 
      right = false; 
     } 
     else if (ballx == getWidth()-border) 
     { 
      gameReset = true; 
      enemyScore ++; 
     } 
     else if (enemyyy < bally+14 && enemyyy+59 > bally && ballx == 13) 
     { 
      right = true; 
     } 
     else if (ballx == 0) 
     { 
      gameReset = true; 
      playerScore ++; 
     } 
    } 


    //enemy movement 
    private void moveEnemy() 
    { 
     if (right == false && bally > enemyy+8 && enemyy < 294) 
     { 
      enemyy += 0.8; 
      enemyyy = (int) enemyy; 
     } 
     else if (right == false && bally < enemyy+8 && enemyy > 0) 
     { 
      enemyy -= 0.8; 
      enemyyy = (int) enemyy; 
     } 
    } 

    //Drawing 
    @Override        
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     g.fillRect(enemyx, enemyyy, 15, 60); 
     g.fillRect(playerx, playeryy, 15, 60); 
     g.fill3DRect(ballx, bally, 15, 15, true); 
     System.out.println("Enemy Score: " + enemyScore + " Player Score: "+ playerScore); 
    } 

    public static void main(String[] args) throws InterruptedException 
    { 

     JFrame frame = new JFrame("p0ng");      //makes new frame 
     frame.setSize(512,384);         //sets the size 
     frame.setVisible(true);         //makes it visble 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //allows it to sleep 
     Pong game = new Pong(); 
     frame.add(game); 

     while(true) 
     { 
      game.moveBall(); 
      game.moveEnemy(); 
      game.repaint(); 

      Thread.sleep(10); 
     }  
    } 

    @Override 
    public void keyTyped(KeyEvent ke) { 
     //not being used 
    } 

    //Player movement 
    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_UP && playery < 294) 
     { 
      playery += .8; 
      playeryy = (int) playery; 
     } 
      else if (e.getKeyCode() == KeyEvent.VK_DOWN && playery > 0) 
     { 
      playery -= .8; 
      playeryy = (int) playery; 
     } 
     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent ke) { 
     //not being used 
    } 
} 
+1

최신 귀하의 프레임에 keylistener – Jens

+0

어디에 추가합니까? –

+0

Frame.addKeyListener (game) – Jens

답변

1
public Pong(){ 
addKeyListner(this); 
} 

당신은 당신의 panelkeyListner에 등록해야합니다. 에 Keylistner을 구현 했으므로 addKeyListner 방법을 사용할 수 있습니다. this 키워드를 사용할 수 있습니다.이 작업은 constructor에서 가능합니다.

+0

* "이것은 잘못된 대답입니다."* - 이렇게됩니다. "신뢰할 수있는"솔루션이며, 일반적으로 "KeyListener"는 신뢰할 수있는 솔루션이있을 때 특히 좋지 않습니다. – MadProgrammer

+0

왜 'KeyListener'가 왜 그런 말을 할 수 있는지 잘 모르겠습니까? . – Priyamal

+0

'KeyListener'는 신뢰할 수 없기 때문에 좋지 않습니다. OP 코드가 이러한 제약 조건을 모두 충족하지 못하기 때문에 등록 된 구성 요소가 포커스를받을 수 있고 포커스가있는 경우에만 이벤트가 트리거되고 계속해서 작동하지 않습니다. 구성 요소를 포커스 가능하게 만들고 구성 요소를 집중시킬 수있을지라도 초점을 변경하는 데 많은 시간이 필요하지 않으며 모든 것이 다시 끊어집니다. – MadProgrammer

2

다른 팁은 가능한 더 나은 옵션이 특히 너무 신뢰할 수있어,

  • 사용하지 마십시오 KeyListener 환영합니다. 살펴보기로 시작 How to Use Key Bindings
  • 일반적으로 대략적으로 대신 paint을 무시해야합니다. Performing Custom PaintingPainting in AWT and Swing
  • 스윙의 단일 스레드 규칙을 위반하고 있으며 핵심 논리와 UI 사이의 경쟁 조건이 위험합니다. 자세한 내용은 Concurrency in Swing, 간단한 솔루션은 How to use Swing Timers을 참조하십시오.
  • "main"루프가 잘못 설정되었습니다. 루프를 반복 할 때마다 칠할 필요가있는 현재 상태를 업데이트해야합니다. 상태를 "일시 중지"하기 위해 "보유"루프를 사용하면 안되며, 대신 if 문을 사용하여 현재 상태에 따라 실행할 필요가 있거나 실행할 필요가없는 섹션을 차단하십시오.
+0

이 코드를 어떻게 보일지 알려주시겠습니까? 키 바인딩을 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다. –

+0

[키 바인딩 예제] (http://stackoverflow.com/questions/17984912/java-key-bindings-not-working/17984949#17984949) – MadProgrammer

관련 문제