2012-04-11 93 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,所以程序不认为你一直按住当你不在时,钥匙。