2012-04-11 97 views
-2

我正在研究一個簡單的項目,但我無法實現如何將一個可繪製對象移動爲(a)十字。我的意思是,例如,當我同時向上按下左箭頭鍵時,我希望我的繪圖向西北方向移動。但是,通過在KeyListener方法中使用簡單的if語句,我無法實現它。有沒有一種特殊的方式來做到這一點或有額外的包裝?這裏是我的代碼:java移動球

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.Ellipse2D; 
import javax.swing.*; 
import javax.swing.JPanel; 


public class Top extends JPanel implements ActionListener, KeyListener { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
Timer t = new Timer(5, this); 
int xR = 0;int yR = 0; int zR = 0; 
double x = 0, y = 0, xVel = 0, yVel = 0, width = 0, height = 0; 

public Top() { 
    t.start(); 
    setBackground(Color.black); 
    addKeyListener(this); 
    setFocusable(true); 
} 
public void actionPerformed(ActionEvent e) { 
    repaint(); 
    x+=xVel; 
    y+=yVel; 
} 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 

    g2d.setPaint(Color.blue); 
    g2d.fill(new Ellipse2D.Double(this.x, this.y, 50, 50)); 
} 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 
} 
@Override 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 

    if(keyCode == KeyEvent.VK_DOWN) { 
     down(); 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     up(); 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     right(); 
    } 
    if(keyCode == KeyEvent.VK_LEFT) { 
     left(); 
    } 
} 
public void down() { 
    this.yVel= 1; 
    this.xVel= 0; 
} 
public void up() { 
    this.yVel = -1; 
    this.xVel = 0; 
} 
public void left() { 
    this.xVel = -1; 
    this.yVel = 0; 
} 
public void right() { 
    this.xVel = 1; 
    this.yVel = 0; 
} 
@Override 
public void keyReleased(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_DOWN || 
       keyCode == KeyEvent.VK_UP ||    
       keyCode == KeyEvent.VK_RIGHT || 
       keyCode == KeyEvent.VK_LEFT) { 
        xVel=0; 
        yVel=0; 
    } 
    } 
} 

* 這個代碼只能移動究竟向左向右向上或向下*

+0

您可能需要發佈您的代碼才能獲得幫助。 – Jonatan 2012-04-11 13:50:06

+0

我們不知道你已經嘗試過沒有一些代碼看,請張貼一些,所以我們不必猜測解決方案 – Chris 2012-04-11 13:50:58

+0

看到接受的答案在這裏:http://stackoverflow.com/questions/752999/如何處理多個按鍵在java中 - 多鍵沒有「事件」,因爲鍵盤將它們作爲單獨的事件發送 – 2012-04-11 13:56:21

回答

0

你需要使用一個KeyListener監聽鍵盤事件,然後重新橢圓能力根據按下的特定鍵將對象拖放到正確的位置。您可能還需要repaint()JPanel,具體取決於您如何實現圖像。

您可以發表一些代碼來說明您正在嘗試做什麼,我們將嘗試幫助您解決問題。首先要做的是驗證KeyListener工作正常,所以KeyListener的代碼可能是一個好的開始。

0

我會爲每個方向,左,右,上,下使用布爾值。所以當另一個鍵盤事件發生時,它會檢查是否有一個箭頭鍵仍然被按下。例如,如果您按(並且不釋放)右箭頭鍵,右箭頭鍵的布爾值將被設置爲true。

這只是設置變量,現在處理對角線方向。再次,轉到您的keyPressed方法。對於上下鍵,格式應該是這樣的......

if (keyCode == VK.DOWN) { 
    if (leftKeyHeld) { 
     DownLeft(); 
    } else if (rightKeyHeld) { 
     DownRight(); 
    } else { 
     Down(); 
    } 

} 

只要確保你的keyReleased方法,您設置的布爾值false,所以程序不認爲你一直按住當你不在時,鑰匙。