トップページ > 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を使うように変更します。