XNAStudy/複数のテクスチャデータを管理するクラス

Last-modified: 2006-12-18 (月) 14:32:39

テクスチャ管理クラスとは

  • クラスAで使うテクスチャとクラスBで使うテクスチャが同じ場合、
    両方のクラスが同じテクスチャデータを保持することになる。
    それはメモリを圧迫するので、両方のクラスで使用する場合は外部からの参照を行うようにする。

設計

  • テクスチャを管理する配列を用意
  • ファイル名を保存する変数を用意
  • テクスチャファイル名を保存する。
  • ファイル名を保存する変数から、同じファイル名があるかチェック
    • ある場合
      読み込み動作を行わず、既に保持しているテクスチャ管理配列からメモリを相手に渡す。
    • ない場合
  • テクスチャ管理配列の未使用領域にテクスチャを確保

その他メモ

  • 双方向リストとして無限に作成できるようにするべきか?
  • ガベージコレクションがあるので開放は考えずに良いか?
  • 現状だと、ファイルからの読み込みをしないようになっているだけのような気がする。

ソース(作成中)

	using System;
	using System.Collections.Generic;
	using System.Text;
	using Microsoft.Xna.Framework.Graphics;
	namespace Shooting_Game
	{
	    //---- 構造体作成 ----
	    struct TextureData
	    {
	        public string filename;
	        public Texture2D texture;
	    }
	    static class TextureControllClass
	    {
	        //---- データテーブル作成----
	        static TextureData[] TextureTable;  // テクスチャテーブル
	        static int controllnum;             // テクスチャ管理数
	        //---- 静的クラスにコンストラクタは指定できない----
	        static public void Initialize(int controllNum)
	        {
	            // テクスチャ管理数分だけ配列を確保
	            TextureTable = new TextureData[controllNum];
	            controllnum = controllNum;
	        }
	        static public Texture2D AddTexture(string texfilename, Microsoft.Xna.Framework.GraphicsDeviceManager manager)
	        {
	            // テクスチャの追加
	            // テクスチャ管理テーブルから同じファイル名が無いかチェック
	            //IEnumerator e = TextureTable.GetEnumerator();
	            foreach (TextureData tempData in TextureTable)
	            {
	                if (texfilename.Equals(tempData.filename))
	                {
	                    // 一致するデータがあった場合
	                    return tempData.texture;
	                }
	            }
	            // 一致するデータが無かった場合
	            for (int i = 0; i < controllnum; i++)
	            {
	                // ファイルが入っていない要素を探す
	                //if (TextureTable[i].filename.Equals("test"))
	                //if (TextureTable[i].filename.Equals(null))
	                if(TextureTable[ i ].filename == null )
	                {
	                    // 入っていない要素を見つけた場合
	                    TextureTable[i].filename = texfilename;
	                    TextureTable[i].texture = Texture2D.FromFile(manager.GraphicsDevice, texfilename);
	                    return TextureTable[i].texture;
	                }
	            }
	            // 見つからなかった場合はnullを返す
	            return null;
	        }
	        // テクスチャの任意破棄
	        static public void ReleaseTexture(Texture2D releaseTexture)
	        {
	            for (int i = 0; i < controllnum; i++)
	            {
	                // 同じテクスチャを探す
	                if (TextureTable[i].texture.Equals(releaseTexture))
	                {
	                    // 同じテクスチャを見つけた場合
	                    TextureTable[i].filename = null;
	                    TextureTable[i].texture = null;
	                }
	            }
	        }
	    }
	}