キー (具体的にはスペースバー) が押されたときに開始し、キーを押したままにしておくと実行を継続し、キーを離したときにのみ停止するイベントをコーディングするにはどうすればよいですか? 粗い表面を移動する車輪付きのオブジェクトをシミュレートしようとしています。元の KeyListener メソッドを使用してみましたが、問題は、スペース バーを押したままにすると、シミュレートしているオブジェクトが繰り返し停止して開始することです。可能な解決策はキーバインディングだと聞いたことがありますが、それについての Java チュートリアルを読んでもまだ理解できません。
シミュレーションに使用されるペイント メソッドは次のとおりです (10 ミリ秒ごとにスリープするスレッドによって制御されます)。
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Shape roadsurface = new Rectangle2D.Float(0, 85, 1000, 200);
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(10));
g2.draw(roadsurface);
g2.setColor(new Color(102, 102, 153));
g2.fill(roadsurface);
Image carimage = Toolkit.getDefaultToolkit().getImage("cargrey.png");
g2.drawImage(carimage, x_pos, y_pos, 60, 30, this);
g2.finalize();
}
x_pos を変更するために使用されるメソッドは次のとおりです (宣言されていない変数は、クラス本体で宣言されていると見なされます)。
public void accelerate()
{
do
{ acc = 15.0 - t;
vel = ( t * 15.0) - ( 0.5 * Math.pow(t, 2.0) );
disp = ( 0.5 * 15.0 * Math.pow(t, 2.0) ) - ( (1.0/6.0) * Math.pow(t, 3.0) );
x_pos = (int)disp;
t += 0.01; break;} while (acc > 0);
while (acc <= 0)
{ acc = 0;
disp = t * vel;
x_pos = (int)disp;
t += 0.01;
}
}
public void brake(double vel, double disp)
{
double u = 0;
double disp2;
while (vel > 0)
{
disp2 = (vel * u) + (0.5 * -100 * Math.pow(u, 2.0) );
vel = vel + (-100 * u);
x_pos = (int)(disp + disp2);
u += 0.01;
t += 0.01; break;}
while (vel <= 0)
{
u += 0.01;
t += 0.01;
}
}
これは、イベントに対する私の最初のアイデアでした。
class Key1 extends Thread implements KeyListener
{
Track g;
boolean keyIsPressed;
Key1(Track g)
{
this.g = g;
}
public void keyTyped(KeyEvent ke) {}
public void keyPressed(KeyEvent ke)
{
if (ke.getKeyCode() == KeyEvent.VK_SPACE)
keyIsPressed = true;
}
public void keyReleased(KeyEvent ke)
{
if (ke.getKeyCode() == KeyEvent.VK_SPACE)
keyIsPressed = false;
}
public void run()
{
while (keyIsPressed)
{
g.repaint();
g.accelerate();
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// swallowed
}
while (!keyIsPressed)
{
g.repaint();
g.brake(g.vel, g.disp);
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// swallowed
}
}
}