イントロダクション
前回までは、とりあえず動くところまで作りました。概要は以下の通りです。
- ゲームのタイトル表示
- ゲームの開始画面表示
- 「じゃんけん」の開始ボタン押下後の処理
「3」の部分で開始ボタンを押下後にイメージを表示して終了している状態で前回の作業を終わりました。
ここからは、プログラムでのアニメーション作成方法に注目します。
アニメーション作成の前に
参考にするサイトはこちらです。Oracleのチュートリアルになります。
- 変換の概要:transformations.zipリンクよりサンプルコードをダウンロードできます。
- このzipファイルをダウンロード、展開して(Eclipse上では)下のようにファイルを配置します。
展開後のファイル →
Eclipseに配置 → - とりあえず、プログラムを実行してみます。
おー素晴らしい!やはり操作して音が出ると違います。
本題
このコードを解析して中身を理解します。以前3次元表現(描画)に挑戦したけどうまくいかなかったので、自分自身ここで問題を解決したいと思っています。
1 変換の概要
サンプル・ソースコード(Gitにアップロードしています)をダウンロードできます。そして「以下の変換について記載してますよ」ということが書いてありました。
- 平行移動
- 回転
- スケーリング
- 変形
そして、次のトピックへ進む前にサンプルコードの内容を(大雑把に)理解します。
【前提】
- JavaFXを起動する部分(Applicationクラスの継承とMainメソッドの実装)は割愛します。よくわからない場合はここのページを読み返してみてください(それでもわからない場合は実行してみてください)
- サンプルソースは、ダウンンロードするソースが1ファイルで良いようにまとめてあります。1クラス1ファイルになっていないので注意が必要です。
(注)クラスの中に作成するクラス(インナークラス)に「Camクラス」「Cubeクラス」を実装しています。
ソース解析
実際のソースは、結構長いのでこちらを参照してください。(サンプルソースのリンクも同じ場所を参照しています)
まずはクラス構成から見ていきます。
1. インナークラス
大元のクラスは「Xylophone」クラスです、そしてこのクラスにインナークラスが下のようなクラスが2つあります。
- Camクラス
- Cubeクラス
「class」の左側に「public」がついているものと、ついていないものがありますが、これはフィールド変数と同様に
「class Cam」はパッケージ内でのみ使用、参照が可能なアクセス修飾子(何もない)状態を示します。
「public class Cube」はクラスの外部からも、全ての場所から参照することができます。(Xylophone.Cubeのような形で参照する)
しかし、インナークラスは「1クラス1ファイル」の作り方からは逸脱するのであまり使用しません。使用するのは以下のような場合のみです。
対象のクラスからのみ使用される(CubeがXylophneクラスからのみ使用される)
- start()メソッドを見る
JavaFXアプリケーションの場合は必ず「Application」クラスを継承したクラスを実装します。そしてこのクラスには「start()」メソッドを実装する(実装することを強制している)ので必ず実装します。
つまり、必ず動くメソッドということです。見ていきます。
フィールド変数に「Cam」クラスが2つあります。
このクラスは、位置と回転を制御するための仕組みがついています。
class Cam extends Group { Translate t = new Translate(); Translate p = new Translate(); Translate ip = new Translate(); Rotate rx = new Rotate(); { rx.setAxis(Rotate.X_AXIS); } Rotate ry = new Rotate(); { ry.setAxis(Rotate.Y_AXIS); } Rotate rz = new Rotate(); { rz.setAxis(Rotate.Z_AXIS); } Scale s = new Scale(); public Cam() { super(); getTransforms().addAll(t, p, rx, rz, ry, s, ip); } }
「Transrate」クラスは位置を管理するため、「Rotate」クラスは回転を管理するためのクラスです。
そして、赤い字で記載した部分に関してフィールド変数と同様に処理を実装するためのスコープ("{", "}")です。これを外すとエラーになります。
本来はメソッドを作成する方が良いのでしょうが、これ以外に処理がないのでここに作成したようです。
そして、ポイントは「Group」クラスを継承しているというところです。
つまり「Group」クラスを拡張しているので細かい処理は全て親クラス(Group)に実装してあるものを使用します。必要に応じてメソッドをオーバーライド、追加の実装を行います。
とりあえずは、キリが良いので今回はここまでにします。
でわでわ。。。
[rakuten ids="book:17734116"]