モデルクラスを作ってみる

モデルクラスを作ってみる




前回はアクティビティの中で画像を表示するようにしました。
しかし、これでは画像を追加する度にアクティビティのソースコード量が増えていきます。
これでは困るので画像を表示するクラスを作ってしまいましょう。

まずは”Model.java”のソースを追加します。
Modelフォルダを作ってその下に作ってみました。

Model.java追加

ソースの中身は↓のようにします。

Model.java
package com.hitman.Model;

import android.graphics.PointF;
import android.graphics.Rect;

import com.hitman.Graphics.Texture;



//  モデル
public class Model
{
    //  コンストラクタ
    public  Model()
    {
        super();

        m_Image         = null;
        m_ImgaeCenter   = null;
        m_ImageRect     = null;
    }



    private Texture m_Image;
    private PointF      m_ImgaeCenter;
    private Rect        m_ImageRect;
}

では、モデルの作成メソッドを作りましょう。
作成するメソッドは↓のような感じです。

    //  作成
    public void Create( String imageName, float cx, float cy, int left, int top, int right, int bottom, TextureResource.TEXTURE_TYPE texType, TextureResource texRes )
    {
        m_Image         = texRes.Load( imageName, texType );
        m_ImgaeCenter   = new PointF( cx, cy );
        m_ImageRect     = new Rect( left, top, right, bottom );
    }

ここで画像ファイルの情報と表示情報を保存しておきます。
あとは表示メソッドを作れば完成です!

    //  描画
    public void Draw( float posX, float posY, DrawDevice drawDevice )
    {
        Sprite      sprite      = drawDevice.GetSprite();
        DrawParam   drawParam   = sprite.CreateDrawParam( m_Image );
        {
            drawParam.m_Pos.set( posX, posY );
            drawParam.m_ImageCenter.set( m_ImgaeCenter );
            drawParam.m_ImageRect.set( m_ImageRect );
        }
        sprite.Draw( drawParam );
    }

これでひと通り完成しました!
さっそくMainActivityの中身を置き換えてみましょう!

MainActivity.java
    //  コンストラクタ
    public  MainActivity()
    {
        super();

            :

        m_Hitman        = null; //<  リネーム
        m_Back          = null;
        m_Bill          = null;
    }

        :

    //  描画フレーム
    @Override
    public void onDrawFrame( GL10 gl )
    {
        //  シーンの更新
        m_DrawDevice.Begin( gl );
        {
                :

            //  モデルがなければ作る
            if( m_Hitman == null )
            {
                m_Hitman    = new Model();
                m_Back      = new Model();
                m_Bill      = new Model();

                m_Hitman.Create(    "test_ene",   16.0f,  32.0f,  0,  0,  32,                             32,                             TEXTURE_TYPE.CHARA, m_TexRes    );
                m_Back.Create(      "back",       0.0f,   0.0f,   0,  0,  ( int )DrawDevice.DRAW_WIDTH,   ( int )DrawDevice.DRAW_HEIGHT,  TEXTURE_TYPE.BACK,  m_TexRes    );
                m_Bill.Create(      "bill",       0.0f,   0.0f,   0,  0,  ( int )DrawDevice.DRAW_WIDTH,   ( int )DrawDevice.DRAW_HEIGHT,  TEXTURE_TYPE.BACK,  m_TexRes    );
            }

            //  描画
            if( m_Back != null )
            {
                //  まず、背景を描画
                m_Back.Draw( 0.0f, 0.0f, m_DrawDevice );
            }
            if( m_Hitman != null )
            {
                //  次にキャラを描画
                for( int y = 0; y < 3; ++y )
                {
                    for( int x = 0; x < 3; ++x )
                    {
                        m_Hitman.Draw(( float )x * 92.0f + 108.0f, ( float )y * 72.0f + 71.0f, m_DrawDevice );
                    }
                }
            }
            if( m_Bill != null )
            {
                //  最後にビルを描画する
                m_Bill.Draw( 0.0f, 0.0f, m_DrawDevice );
            }
        }
        m_DrawDevice.End();

            :
    }

        :

    private Model               m_Hitman;   //<  Modelクラス使用&リネーム
    private Model               m_Back; //<  Modelクラス使用
    private Model               m_Bill; //<  Modelクラス使用

随分とすっきりしました。
しかし、モデルを作るときにテクスチャタイプを指定するのは面倒ですね。
さらに言うと背景関連はサイズも同じなので省略できそうです。
なのでCreateメソッドをそれぞれのタイプに合わせたものを作ってみましょう!
Createメソッドを↓のように置き換えます。

Model.java
    //  背景作成
    public void CreateBack( String imageName, TextureResource texRes )
    {
        _LoadImage( imageName, TextureResource.TEXTURE_TYPE.BACK, texRes );
        _CreateDrawInfo( 0.0f, 0.0f, 0, 0, ( int )DrawDevice.DRAW_WIDTH, ( int )DrawDevice.DRAW_HEIGHT );
    }

    //  キャラ作成
    public void CreateChara( String imageName, TextureResource texRes )
    {
        _LoadImage( imageName, TextureResource.TEXTURE_TYPE.CHARA, texRes );

        final float width   = m_Image.GetWidth();
        final float height  = m_Image.GetHeight();

        _CreateDrawInfo( width * 0.5f, height, 0, 0, ( int )width, ( int )height );
    }

        :

    //  テクスチャ読み込み
    private void    _LoadImage( String imageName, TextureResource.TEXTURE_TYPE texType, TextureResource texRes )
    {
        m_Image = texRes.Load( imageName, texType );
    }

    //  描画情報を作成
    private void    _CreateDrawInfo( float cx, float cy, int left, int top, int right, int bottom )
    {
        m_ImgaeCenter   = new PointF( cx, cy );
        m_ImageRect     = new Rect( left, top, right, bottom );
    }

背景、キャラクタともに画像名とテクスチャリソースを渡すだけにしました。
キャラクタの描画中心位置をXは画像の中心、Yは画像の下にしています。
これをMainActivityで使うと↓のようになります。

            //  モデルがなければ作る
            if( m_Hitman == null )
            {
                    :

                m_Hitman.CreateChara(   "test_ene",   m_TexRes    );
                m_Back.CreateBack(      "back",       m_TexRes    );
                m_Bill.CreateBack(      "bill",       m_TexRes    );
            }

これで他のキャラを追加するのが楽になりますね!
ちなみに、今回はCreateメソッドを複数作りましたがクラスを分ける方法もあります。
クラスを分けるとModelクラスをいじらなくて済みますね。



<前のページ
次のページ>