トップページ > Java3D入門 > Javaのキーボード入力(6)
ライトの問題は解決しましたが、いろいろ動かしているとキーボードの入力が気になります。 キーを押してから反応するまでの時間が長い気がします。さらに、[↑]と[→]を同時押ししたときに、 ななめに行ってくれません。もっとスムーズにキーボード入力できるように、 キーボード入力クラスを改良します。
内部クラスとしてタイマーを用意し、このタイマーの周期で更新を行います。 keyPressed()やkeyPressed()メソッドが呼ばれたときは、そのキーに対応するフラグを 立てたり無効にしたりするだけです。これで複数のボタンの入力も可能になり、反応時間も タイマーの周期で自由に設定できるようになります。
//******************************************************************************
//キーボード入力のためのクラス“key_input3”
//なめらかな動きに改良
//******************************************************************************
//インポート
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import java.util.*;
import java.util.Timer;
public class key_input3 implements KeyListener
{
//=============================================================================
//クラスのフィールド
//=============================================================================
int KeyCode;
JLabel x_label1;
JLabel y_label1;
JLabel z_label1;
JLabel x_label2;
JLabel y_label2;
JLabel z_label2;
Transform3D transform1;
TransformGroup transform_group1;
Vector3f vector1;
boolean right_flag=false;
boolean left_flag=false;
boolean forward_flag=false;
boolean back_flag=false;
boolean shift_flag=false;
//=============================================================================
//コンストラクタ
//=============================================================================
public key_input3()
{
x_label1 = new JLabel("X座標 :");
y_label1 = new JLabel("Y座標 :");
z_label1 = new JLabel("Z座標 :");
x_label2 = new JLabel();
y_label2 = new JLabel();
z_label2 = new JLabel();
transform1 = new Transform3D();
transform_group1 = new TransformGroup();
transform_group1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
vector1 = new Vector3f();
Timer timer = new Timer();
//ここの数値で入力の周期を調節
timer.schedule(new input_check(),0,30);
}
//=============================================================================
//keyPressed
//=============================================================================
public void keyPressed(KeyEvent event)
{
KeyCode = event.getKeyCode();
switch(KeyCode)
{
case 37:
left_flag=true;
break;
case 38:
forward_flag=true;
break;
case 39:
right_flag=true;
break;
case 40:
back_flag=true;
break;
case 16:
shift_flag=true;
break;
}
}
//=============================================================================
//keyReleased
//=============================================================================
public void keyReleased(KeyEvent event)
{
KeyCode = event.getKeyCode();
switch(KeyCode)
{
case 37:
left_flag=false;
break;
case 38:
forward_flag=false;
break;
case 39:
right_flag=false;
break;
case 40:
back_flag=false;
break;
case 16:
shift_flag=false;
break;
}
}
//=============================================================================
//keyTyped
//=============================================================================
public void keyTyped(KeyEvent event)
{
//何もしない
}
//=============================================================================
//内部クラスとしてタイマーを定義
//=============================================================================
class input_check extends TimerTask
{
public void run()
{
//Shiftキーが押されていないときは高速
if(shift_flag==false)
{
if(right_flag==true)
{
vector1.x+=1.0f;
}
if(left_flag==true)
{
vector1.x-=1.0f;
}
if(forward_flag==true)
{
vector1.z-=1.0f;
}
if(back_flag==true)
{
vector1.z+=1.0f;
}
}
//Shiftキーが押されている場合は低速
else
{
if(right_flag==true)
{
vector1.x+=0.5f;
}
if(left_flag==true)
{
vector1.x-=0.5f;
}
if(forward_flag==true)
{
vector1.z-=0.5f;
}
if(back_flag==true)
{
vector1.z+=0.5f;
}
}
transform1.setTranslation(vector1);
transform_group1.setTransform(transform1);
x_label2.setText(Integer.toString((int)vector1.x));
y_label2.setText(Integer.toString((int)vector1.y));
z_label2.setText(Integer.toString((int)vector1.z));
}
}
}
//******************************************************************************
//key_inputクラスここまで
//******************************************************************************
前回のテストプログラム、“Key_test3.java”の中でキーボード入力クラスをコンストラクトする所の 記述を変えます。“key_input3 key = new key_input3();”と、key_input3を使うように変更します。