テクスチャ読み込み

テクスチャ読み込み




テクスチャをファイルから読み込みます。
ファイル名はタイプのルートディレクトリを指定しなくても大丈夫なようにします。

キャラを読み込むときにいちいち”chara/XXX.png”みたいにしないで”XXX.png”としたほうが
ディレクトリの管理が楽ですね。
Loadメソッドはタイプを指定したらディレクトリを勝手に判別してくれるようにします。

Loadメソッドの実装は以下のとおりです。

    //  ロード
    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;
    }

    //  読み込み済みテクスチャ取得
    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;
    }

まず最初にテクスチャがすでに読み込まれているかどうかをチェックします。

        TextureInfo info    = new TextureInfo( fileName, type );
        Texture     tex     = _GetTexture( info );

        //  すでに読み込まれていたらそれを返す
        if( tex == null )
        {
            :
            :
        }
        return tex;

_GetTextureで読み込み済みのテクスチャ情報を取得できるのでこれがnullでなければ読み込み済みです。
_GetTextureの中身は以下のようにベクタの中を調べているだけです。

    //  読み込み済みテクスチャ取得
    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;
    }

テクスチャ情報がなければ実際に読み込みます。
タイプごとにディレクトリは自動判別するようにパスを作ります。

            //  ファイルパス作成
            String      filePath    = String.format( "%s/%s.png", _GetDirectory( type ), fileName );

パスを作ったらAppResourceクラスからInputStreamをもらいます。

            InputStream inputStream = m_AppRes.Load( filePath );
            if( inputStream == null )
                return null;

次にPictureクラスを作ります。
このクラスはファイル(InputStream)からテクスチャを作ってくれるクラスです。

            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();
                }
            }

ファイルの読み込みに成功したらテクスチャ情報をベクタに登録します。
そしてストリームを閉じて終了です。

次は読み込んだテクスチャの削除を実装します。



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