トップページ > Java3D入門 > Javaのキーボード入力(6)

キーボード入力クラスを改良する

なめらかな動き

ライトの問題は解決しましたが、いろいろ動かしているとキーボードの入力が気になります。 キーを押してから反応するまでの時間が長い気がします。さらに、[↑]と[→]を同時押ししたときに、 ななめに行ってくれません。もっとスムーズにキーボード入力できるように、 キーボード入力クラスを改良します。

内部クラスとしてタイマーを用意し、このタイマーの周期で更新を行います。 keyPressed()やkeyPressed()メソッドが呼ばれたときは、そのキーに対応するフラグを 立てたり無効にしたりするだけです。これで複数のボタンの入力も可能になり、反応時間も タイマーの周期で自由に設定できるようになります。

ソースコード : key_input3.java

//******************************************************************************
//キーボード入力のためのクラス“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を使うように変更します。




前へ   戻る