-2

私は単純なプロジェクトに取り組んでいますが、ドローアブル オブジェクトを (a) クロスとして移動する方法を達成できません。つまり、たとえば、上矢印キーと左矢印キーを同時に押すと、ドローアブルを正確な北西に向かって移動させたいということです。しかし、メソッド内で単純な if ステートメントを使用したKeyListenerだけでは、それを実現できませんでした。それを行う特別な方法や追加のパッケージはありますか?これが私のコードです:

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;  
    }
  }
}

*このコードには、楕円を正確に上下左右に移動する機能しかありません *

4

2 に答える 2

0

左、右、上、下の各方向にブール値を使用します。そのため、別のキーボード イベントが発生すると、矢印キーの 1 つがまだ押されているかどうかがチェックされます。たとえば、右矢印キーを押した (離さない) 場合、右矢印キーのブール値は true に設定されます。

これは、変数を設定するためだけのもので、今では斜め方向を処理するためです。もう一度、keyPressed メソッドに移動します。上下キーの場合、フォーマットは次のようになります...

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

}

keyReleased メソッドについては、必ずブール値を false に設定してください。そうしないと、キーを押し続けているとプログラムが認識しません。

于 2012-04-11T20:13:29.080 に答える
0

を使用しKeyListenerてキーボード イベントをリッスンし、押された特定のキーに従って正しい場所にオブジェクトを再描画する必要があります。repaint()イメージの実装方法によっては、JPanel同様に必要になる場合があります。

何をしようとしているのかを示すコードを投稿していただけないでしょうか。問題を解決できるように努めます。最初に行うことは、 が正しく機能していることを検証することですKeyListener。そのため、コードKeyListenerはおそらく良い出発点になるでしょう。

于 2012-04-11T13:52:58.427 に答える