ホームへ戻る

s2.4 自機を作る


 本節では、自機クラスを作ります。STGでもないのに自機と言うのは変ですが・・。(クラス名はPlayerとします)

本アプリでは、物体の移動はベクトルで表現し、計算します。
そこでまず、ベクトルを計算するクラスを作ります。


↓Vec.java (新規追加)

public class Vec {
        
        public float _x, _y;
        
        Vec(){
                _x = _y = 0;
        }
        
        Vec( float x, float y ){
                _x = x;
                _y = y;
        }
        
        //角度を取得する
        float getAngle(){
                return (float)Math.atan2(_y, _x);
        }

        //大きさを取得する
        float getLength(){
                return (float)Math.sqrt( _x*_x + _y*_y );
        }
        
}

内容は簡単です。
2次元ベクトルを表すx,yがあり、角度と大きさを取得するメソッドがあるだけです。

次に、自機は円で表現するので、円クラスを作ります。
↓Circle.java
(新規追加)
public class Circle {

        public float _x, _y, _r;

        Circle(){
                _x = _y = _r = 0;
        }
        
        Circle(float x, float y, float r){
                _x = x;
                _y = y;
                _r = r;
        }
        
}

今はただ、x,y,rがあるだけです。

次に自機を作ります。
↓Player.java
 (新規追加)
public class Player extends Task {
        private final static float SIZE = 20;           //自機の大きさ
        private Circle _cir = null;             //自機の円
        private Paint _paint = new Paint();     //描画設定
        private Vec _vec = new Vec();           //自機の移動ベクトル
        
        public Player(){
                _cir = new Circle( 240, 0, SIZE );//(240,0)の位置にSIZEの大きさの円を作る
                _paint.setColor(Color.BLUE);      //色を青に設定
                _paint.setAntiAlias(true);        //エイリアスをオン
                _vec._y = 2;                      //移動ベクトルを下に向ける
        }

        @Override
        public boolean onUpdate(){
                _cir._x += _vec._x;     //移動ベクトル_vecが指す方向に移動させる
                _cir._y += _vec._y;             
                return true;
        }

        @Override
        public void onDraw( Canvas c ){
                c.drawCircle(_cir._x, _cir._y, _cir._r, _paint);
        }

}

_vec が自機が向いている移動ベクトルです。
onUpdate関数内で、現在向いている位置に進めます。
コンストラクタでは、初期座標をセットし、_paintに描画設定をしているだけです。



実行結果はこのようになります。
画面解像度は端末によって変更するのがベストでしょうが、ここでは、スマホでよくある480x800にします。
左上が原点(0,0)で、yの下が正の方向なので、角度90゜は真下を意味します。

↓GameMgr.java (変更 
赤字部)
public class GameMgr {

        private LinkedList<Task> _taskList = new LinkedList<Task>();//タスクリスト
        
        GameMgr(){
                _taskList.add( new Player() );
                _taskList.add( new FpsController() );
        }
        
        public boolean onUpdate() {
                for(int i=0; i<_taskList.size(); i++){
                        if(_taskList.get(i).onUpdate() == false){       //更新失敗なら
                                _taskList.remove(i);                    //そのタスクを消す
                                i--;
                        }
                }
                return true;
        }

        public void onDraw(Canvas c) {
                c.drawColor(Color.WHITE);       //白で塗りつぶす
                for(int i=0; i<_taskList.size(); i++){
                        _taskList.get(i).onDraw(c);//描画
                }
        }

}

今回の設計で良い点は、新しいオブジェクトを追加しても、管理クラスをほとんど変更しなくて良いことです。
プレイヤーを管理クラスに追加し、以後、毎フレームUpdateとDrawメソッドを呼ぶようにしますが、
タスクリストに追加するだけで、これが可能になります。

今の自機はまだ操作することができず、ただ直線的に下に落ちて行くだけですが、次の節でセンサーを使って操作できるようにしてみましょう。

この章のプロジェクトをダウンロード

→分からないことがあれば掲示板で質問して下さい


Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

- Remical Soft -