2012-07-09 35 views
0

我正在嘗試做一個pong遊戲,但由於某種原因,我的pong槳沒有正確移動。按下UP鍵時Pong Paddle底部不會向上移動

當我按下向下箭頭鍵時,它向下移動就好了。但是當我按下UP箭頭鍵時,整個槳葉就會長得更長......如果我調整窗口大小,那麼槳葉就會恢復到正常長度。如果我按下UP鍵,它會再次向上延伸。

我不認爲它我的代碼邏輯,但一些有關清除以前繪製的槳......這裏是我的代碼,

代碼槳:

import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JPanel; 

public class Paddle extends JPanel { 

    int x; 
    int y; 
    int width; 
    int height; 

    Paddle(){ 
     this.x = 0; 
     this.y = 0; 
     this.height = 40; 
     this.width = 10; 
    } 

    Paddle(int x, int y, int width, int height){ 
     this.x = x; 
     this.y = y; 
     this.height = height; 
     this.width = width; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, width, height); 
    } 

    public void moveDown(){ 
     this.y += 3; 
     repaint(); 
     System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight()); 
    } 

    public void moveUp(){ 
     this.y -= 3; 
     repaint(); 
     System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight()); 
    } 

    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    public int getWidth() { 
     return width; 
    } 

    public void setWidth(int width) { 
     this.width = width; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

} 

守則整場比賽:

import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Pong extends JFrame { 

    Pong() { 
     final Paddle p1Paddle = new Paddle(); 

     Paddle p2Paddle = new Paddle(); 
     p1Paddle.addKeyListener(new KeyAdapter() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       // TODO Auto-generated method stub 
       //super.keyPressed(arg0); 

       switch (e.getKeyCode()) { 
        case KeyEvent.VK_DOWN: 
         p1Paddle.moveDown(); 
         break; 
        case KeyEvent.VK_UP: 
         p1Paddle.moveUp(); 
         break; 
        default: 
         System.out.println("please press up or down"); 
       } 

      } 
     }); 

     setLayout(new BorderLayout()); 
     add(p1Paddle, BorderLayout.CENTER); 

     //only focused components can recieve key events... 
     p1Paddle.setFocusable(true); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame frame = new Pong(); 
     frame.setTitle("Pong"); 
     frame.setSize(650, 300); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

對這個問題或一般的代碼建議的任何幫助將不勝感激。

+0

爲什麼你已經clearRect(0,0,650,300)硬編碼? – 2012-07-09 18:42:09

+0

我想清楚了整個窗口,並確保我沒有錯過槳的任何部分......但槳不會受到影響的某些原因。 – user772401 2012-07-09 18:43:06

+0

爲什麼每次moveUp和moveDown都改變高度? – 2012-07-09 18:43:16

回答

1

有點難以告訴代碼片段,但KeyListeners不是很可靠。如果鍵擊已被使用(通過UI和底層實現),您可能不會收到通知。

請嘗試查看InputMap和ActionMap。

InputMap im = getInputMap(JTable.WHEN_FOCUSED_COMPONENT); 
ActionMap am = getActionMap(); 

KeyStroke downKey = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); 
KeyStroke upKey = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 

im.put(downKey, "Action.down"); 
im.put(upKey, "Action.up"); 

am.put("Action.down", new DownAction()); 
am.put("Action.up", new UpAction()); 

,看看它需要你......

更新: 啊,現在是如此明顯,你覆蓋的期待佈局面板的X/Y寬度/高度的方法經理用它們來佈局組件,但並不真正提供一個知道如何處理它的佈局管理器。

BorderLayout不關心你的「尺寸」或「位置」要求,它會用它認爲你的組件應該覆蓋它們。

你想要做的是使用絕對佈局管理器(null)。此外,您不希望實施X/Y,寬度/高度管理,因爲這已經被照顧好了。

所以。

在傍班。將佈局管理器從BorderLayout更改爲null(同時更新add(paddle)方法以除去BorderLayout引用,但不是必需的,但會消除混淆)。

在槳類,刪除對X/Y,寬度/高度的所有引用,你不需要他們。而是使用setBounds/setLocation。

public class Paddle extends JPanel { 

Paddle(){ 

     this(0, 0, 20, 40); 

} 

Paddle(int x, int y, int width, int height){ 

     setBounds(x, y, width, height); 

} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    // The graphics context has already been translated to x/y for use, 
    // so we don't need to care about it 
    g.fillRect(0, 0, getWidth(), getHeight()); 
} 

public void moveDown(){ 

     setLocation(getX(), getY() + 3); 

} 

public void moveUp(){ 

     setLocation(getX(), getY() - 3); 

} 

}

和中提琴,它的工作原理。

+0

我沒有接收鍵盤按鍵的問題。我只是不知道爲什麼槳圖不能正確渲染。我在原始問題中附加了我的所有代碼。如果你發現任何問題,請告訴我。謝謝。 – user772401 2012-07-10 18:07:40

+0

啊,很明顯:) – MadProgrammer 2012-07-10 22:47:23

+0

哇!謝謝,那很完美。我有一些問題,所以我可以更好地理解這一點。如何在第一個paddle構造函數中使用「this(0,0,20,40)」,但在另一箇中使用set bounds。爲什麼不「this(x,y,width,height)」,反之亦然 - 只是試圖理解不一致的原因。如果我理解這個權利,槳正在「絕對」佈局上浮動,所以如果我想做碰撞檢測。我將不得不回到我的乒乓球課。或者創建一個'table'jpanel類,其中槳和球可以自由浮動在......感謝你的幫助 – user772401 2012-07-11 12:51:20

相關問題