Eclipse Android〜Gluonでアプリを作る6: アニメーションを作る準備〜

イントロダクション

前回までは、とりあえず動くところまで作りました。概要は以下の通りです。

  1. ゲームのタイトル表示
  2. ゲームの開始画面表示
  3. 「じゃんけん」の開始ボタン押下後の処理

「3」の部分で開始ボタンを押下後にイメージを表示して終了している状態で前回の作業を終わりました。

ここからは、プログラムでのアニメーション作成方法に注目します。

アニメーション作成の前に

参考にするサイトはこちらです。Oracleのチュートリアルになります。

  1. 変換の概要:transformations.zipリンクよりサンプルコードをダウンロードできます。
  2. このzipファイルをダウンロード、展開して(Eclipse上では)下のようにファイルを配置します。
    展開後のファイル →
    Eclipseに配置 → 
  3. とりあえず、プログラムを実行してみます。

おー素晴らしい!やはり操作して音が出ると違います。

本題

このコードを解析して中身を理解します。以前3次元表現(描画)に挑戦したけどうまくいかなかったので、自分自身ここで問題を解決したいと思っています。

1 変換の概要

サンプル・ソースコード(Gitにアップロードしています)をダウンロードできます。そして「以下の変換について記載してますよ」ということが書いてありました。

  1. 平行移動
  2. 回転
  3. スケーリング
  4. 変形

そして、次のトピックへ進む前にサンプルコードの内容を(大雑把に)理解します。

【前提】

  1. JavaFXを起動する部分(Applicationクラスの継承とMainメソッドの実装)は割愛します。よくわからない場合はここのページを読み返してみてください(それでもわからない場合は実行してみてください)
  2. サンプルソースは、ダウンンロードするソースが1ファイルで良いようにまとめてあります。1クラス1ファイルになっていないので注意が必要です。
    (注)クラスの中に作成するクラス(インナークラス)に「Camクラス」「Cubeクラス」を実装しています。

ソース解析

実際のソースは、結構長いのでこちらを参照してください。(サンプルソースのリンクも同じ場所を参照しています)

まずはクラス構成から見ていきます。

1. インナークラス

大元のクラスは「Xylophone」クラスです、そしてこのクラスにインナークラスが下のようなクラスが2つあります。

  1. Camクラス 
  2. Cubeクラス 

「class」の左側に「public」がついているものと、ついていないものがありますが、これはフィールド変数と同様に

「class Cam」はパッケージ内でのみ使用、参照が可能なアクセス修飾子(何もない)状態を示します。

「public class Cube」はクラスの外部からも、全ての場所から参照することができます。(Xylophone.Cubeのような形で参照する)

しかし、インナークラスは「1クラス1ファイル」の作り方からは逸脱するのであまり使用しません。使用するのは以下のような場合のみです。

対象のクラスからのみ使用される(CubeがXylophneクラスからのみ使用される)

  1. 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)に実装してあるものを使用します。必要に応じてメソッドをオーバーライド、追加の実装を行います。

とりあえずは、キリが良いので今回はここまでにします。

でわでわ。。。



コメントを残す