0

このコードを例として使用すると、速度コンポーネントをオブジェクトに追加するにはどうすればよいですか?

class CircleFrame extends JPanel {
    static int x = 20;
    static int y = 20;
    int radius = 20;

    CircleFrame() {
        setSize(400,400);
    }

    @Override
    protected void paintComponent(Graphics g) {
        repaint();
        g.drawOval(x,y,radius,radius);
    }
}

このコードを使用すると、ユーザーは、左、右、上、下の矢印キーを使用して、JFrame内の小さな円を制御できます。速度を追加するにはどうすればよいですか?たとえば、彼らがそれを右に動かしている間、xvelocityは大きくなります。移動を停止すると、オブジェクトが停止するまで速度がゆっくりと低下します。ここではスレッドが答えだと思っていましたが、まだよくわかりません。

4

1 に答える 1

0

それぞれの動きはユニークなキープレスですか?つまり、キーを押したままにすると、1つの動きしか得られませんか?その場合、速度を大まかに計算したい場合は、各プレスイベントハンドラーでSystem.currentTimeMillis()を呼び出し、それをどこかの変数に保持し、次のときにもう一度呼び出して、合計を計算することができます。変位を時間の差で割ったもの...これがコメントしようとしているものである場合は、コードを記述します。

もう1つの(より可能性の高い)可能性は、キーを押したまま速度を上げたい場合です...その場合、課したい加速度を計算します。2番目のスレッドを使用して速度を上げ、そのアクションに減速を通知します。 keyUpイベントが発生すると停止します。

int accel = 1;
boolean accelerating = false;
public void keyPressed(KeyEvent e)
{
   ...
   accelerating = true;
   new Thread() //anonymous inner class 
   { 
     public void run()
     {
       while (accelerating) { x += vel; vel += 1; }
       //no longer accelerating
       x = 0; //or decelerate gracefully with a similar loop as accel.
     }
  }.run();
}
public void keyUp(KeyEvent e) //or however you get a key release event
{
   accelerating = false;
}

これを少し変更して、上/下/左/右に適応させ、自分に合った加速度を見つけます。限界まで加速することだけを検討し、特定の速度を超えて加速することは考えないかもしれません

于 2012-11-01T00:28:57.513 に答える