前回はアクティビティの中で画像を表示するようにしました。
しかし、これでは画像を追加する度にアクティビティのソースコード量が増えていきます。
これでは困るので画像を表示するクラスを作ってしまいましょう。
まずは”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クラスをいじらなくて済みますね。