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

キーボード入力で図形を動かす

キーボード・リスナーのクラス内に座標変換を組みこむ

キーボードの入力と、座標変換を組み合わせてみます。 キーボードが押されたときに呼ばれるkeyPress()メソッドの中でどのキーが押されたか判断し、 カーソルキーだった場合はその方向へ座標を動かす…という方法をとります。

座標変換を行うためには、“TransformGroup”を使うのでした。このTransformGroupに対して 各種の座標変換操作を登録すると、そのTransformGroupに登録されている図形オブジェクトが 動くという流れです。(ここらへんの階層構造は座標変換について 参照です)

ここで、キーボード入力クラスは今後いろいろなアプリケーションで使い回せるように 、独立したものにしたいと思います。 そのために、キーボード入力クラスはフィールドとしてTransformGroupを1つ持たせます。 キーボード入力クラスは、そこに図形オブジェクトが登録されているか否かによらず、 とりあえずカーソルキーの入力に従って座標変換操作を行い続けます。 もし、外部クラスの図形オブジェクトがキーボード入力クラスのTransformGroupに登録されていれば、 キー入力に従って外部クラスの図形が動く…という仕組みにします。(下図)

キーボード入力クラスには、登録されるであろう図形オブジェクトの座標を管理するために、 Vector3fクラスのオブジェクトをフィールドとして持たせます。 Vector3fクラスといっても、要はfloat型の変数3つを束ねた構造体のようなものです。 ただ3つの変数に“x”、“y”、“z”と名前がついていて分かりやすいことと、 平行移動の座標変換に使う“setTranslation()”メソッドの引数がVector3fクラスとなっているので、 コーディングしやすいという理由で使っています。Vector3fの各要素にアクセスするには、以下のように します。(そのまんまです)

Vector3f vector = new Vector3f();
vector.x = 1.0f;

最終的に描画するためには、座標変換についてで扱ったとおり、 座標変換のためのTransforGroupをBranchGroupに登録、さらにそのBranchGroupをSimpleUniverseに登録… と、仮想空間の一部として登録する必要がありました。 このBranchGroupはキーボード入力クラスのフィールドとしては持たせません。 結局、描画を行うCanvas3Dなどがあるのはメイン・クラス内なので、BranchGroupも メインクラス内に残します。 よって、キーボード入力クラス内のTarnsformGroupは、メインクラス内のBranchGroupに登録する ことになります。

ここら辺はややこしいので、上の図を見たり次ページのテストプログラムを直接見たほうが 分かりやすいと思います。。。




前へ   次へ