我有一个游戏,其中两个椭圆出现在JFrame上,一个由a-s-d-w键控制,另一个由箭头键控制。下面是我的run方法:
public void run() {
while (animator != null) {
repaint();
player1.move(player1.direction);
player2.move(player2.direction);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
}
}这是我的个人玩家类。这是player 1类的paintComponent方法。(Player 1和Player 2相同)变量shape、xPos、yPos、size和Color都可以。(它们附加在值上)
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
switch(Shape) {
case 1: Ellipse2D.Double ball = new Ellipse2D.Double(xPos, yPos, size, size);
g2.setPaint(Color);
g2.draw(ball);
g2.fill(ball);
break;
case 2: Rectangle2D.Double rectangle = new Rectangle2D.Double(xPos, yPos, size, size);
g2.setPaint(Color);
g2.draw(rectangle);
g2.fill(rectangle);
break;
}
} 我通过使用一个名为KeyController的类来控制椭圆的方向。以下是该程序示例部分;其余部分相同(请记住,这只是一个摘录):
public void keyPressed(KeyEvent e) {
// Player 1 Left
if(e.getKeyCode() == KeyEvent.VK_A){
Player1.setDirection(270);
System.out.println("A pressed");
}
// Player 1 Down
if(e.getKeyCode() == KeyEvent.VK_S){
Player1.setDirection(180);
System.out.println("S pressed");
}
if(e.getKeyCode() == KeyEvent.VK_LEFT){
Player2.setDirection(270);
System.out.println("LEFT pressed");
}
if(e.getKeyCode() == KeyEvent.VK_DOWN){
Player2.setDirection(180);
System.out.println("DOWN pressed");
}程序的其余部分运行得很好。(它有一个keyTyped和一个keyPressed)
现在我的问题是,当我运行我的程序时,我看到一个椭圆,所有的键都可以控制它,包括a-s-d-w键和箭头键。
如果你需要更多的代码,尽管问我。(我有一个main方法,它工作得很好。)
如何让Ellipse响应控件?
发布于 2012-05-02 16:56:01
下面是一个使用关键点移动圆的小示例:
public static void main ( String[] args )
{
JFrame controls = new JFrame ();
controls.add ( new JComponent ()
{
private Point location = new Point ( 250, 250 );
private int speed = 5;
{
setFocusable ( true );
requestFocusInWindow ();
addKeyListener ( new KeyAdapter ()
{
public void keyPressed ( KeyEvent e )
{
boolean changed = false;
if ( e.getKeyCode () == KeyEvent.VK_W || e.getKeyCode () == KeyEvent.VK_UP )
{
location.y -= speed;
changed = true;
}
else if ( e.getKeyCode () == KeyEvent.VK_A ||
e.getKeyCode () == KeyEvent.VK_LEFT )
{
location.x -= speed;
changed = true;
}
else if ( e.getKeyCode () == KeyEvent.VK_S ||
e.getKeyCode () == KeyEvent.VK_DOWN )
{
location.y += speed;
changed = true;
}
else if ( e.getKeyCode () == KeyEvent.VK_D ||
e.getKeyCode () == KeyEvent.VK_RIGHT )
{
location.x += speed;
changed = true;
}
if ( changed )
{
repaint ();
}
}
} );
}
protected void paintComponent ( Graphics g )
{
Graphics2D g2d = ( Graphics2D ) g;
g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
g2d.setPaint ( Color.BLACK );
g2d.drawOval ( location.x - 10, location.y - 10, 20, 20 );
}
} );
controls.setSize ( 500, 500 );
controls.setLocationRelativeTo ( null );
controls.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
controls.setVisible ( true );
}当使用简单的按键侦听器时,请确保该组件具有焦点-否则它根本不会接收任何按键事件。所以有时你不得不强制改变聚焦组件:
component.requestFocusInWindow ();https://stackoverflow.com/questions/10405336
复制相似问题