TextureResourceクラスの全ソースコードです。
package <パッケージ名>;
import java.util.Iterator;
import java.util.Vector;
import java.io.IOException;
import java.io.InputStream;
import <パッケージ名>.DrawDevice;
import <パッケージ名>.Texture;
import <パッケージ名>.Picture;
// テクスチャリソース
public class TextureResource
{
// テクスチャタイプ
public enum TEXTURE_TYPE
{
CHARA,
MENU,
}
// コンストラクタ
public TextureResource( AppResource appRes, DrawDevice drawDevice )
{
m_AppRes = appRes;
m_DrawDevice = drawDevice;
m_LoadTexInfoVec = new Vector< TextureInfo >();
}
// ロード
public Texture Load( String fileName, TEXTURE_TYPE type )
{
TextureInfo info = new TextureInfo( fileName, type );
Texture tex = _GetTexture( info );
// すでに読み込まれていたらそれを返す
if( tex == null )
{
// 新しく作ってそれを返す
// ファイルパス作成
String filePath = String.format( "%s/%s.png", _GetDirectory( type ), fileName );
InputStream inputStream = m_AppRes.Load( filePath );
if( inputStream == null )
return null;
Picture picture = new Picture();
{
if( picture.Load( m_DrawDevice, inputStream ))
{
// ロードに成功!
tex = picture;
info.SetTexture( tex );
m_LoadTexInfoVec.add( info );
}
else
{
// ロードに失敗...
}
// ストリームを閉じる
try
{
inputStream.close();
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
return tex;
}
// 削除
public void Delete( TEXTURE_TYPE type )
{
for( Iterator< TextureInfo > it = m_LoadTexInfoVec.iterator(); it.hasNext(); )
{
TextureInfo info = it.next();
if( info.TypeEqual( type ))
{
info.GetTexture().Release();
it.remove();
}
}
}
// ロード済みテクスチャ情報
private class TextureInfo
{
// コンストラクタ
public TextureInfo( String fileName, TEXTURE_TYPE type )
{
m_FileName = fileName;
m_Type = type;
m_Tex = null;
}
// テクスチャ設定
public void SetTexture( Texture tex )
{
m_Tex = tex;
}
public Texture GetTexture()
{
return m_Tex;
}
// 比較
public boolean TypeEqual( TEXTURE_TYPE type )
{
return m_Type.equals( type );
}
public boolean Equal( TextureInfo rhs )
{
return ( m_FileName.equals( rhs.m_FileName )) && ( m_Type.equals( rhs.m_Type ));
}
private String m_FileName;
private TEXTURE_TYPE m_Type;
private Texture m_Tex;
}
// 読み込み済みテクスチャ取得
private Texture _GetTexture( TextureInfo texInfo )
{
for( Iterator< TextureInfo > it = m_LoadTexInfoVec.iterator(); it.hasNext(); )
{
TextureInfo info = it.next();
if( texInfo.Equal( info ))
return info.GetTexture();
}
return null;
}
// タイプに応じたディレクトリ取得
private String _GetDirectory( TEXTURE_TYPE type )
{
switch( type )
{
case CHARA: return "model/chara";
case MENU: return "model/menu";
default: return "";
}
}
private AppResource m_AppRes;
private DrawDevice m_DrawDevice;
private Vector< TextureInfo > m_LoadTexInfoVec;
}