前回はアクティビティの中で画像を表示するようにしました。
しかし、これでは画像を追加する度にアクティビティのソースコード量が増えていきます。
これでは困るので画像を表示するクラスを作ってしまいましょう。
まずは”Model.java”のソースを追加します。
Modelフォルダを作ってその下に作ってみました。
ソースの中身は↓のようにします。
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の中身を置き換えてみましょう!
// コンストラクタ 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メソッドを↓のように置き換えます。
// 背景作成 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クラスをいじらなくて済みますね。