0

XNA ゲームでプレーヤーを歩かせようとしているので、AnimatedTextureData通常の textureData を継承するアニメーション スプライト シートを取り込むクラスを設定します。

AnimatedTextureData

namespace GDLibrary
{
    public class AnimatedTextureData : TextureData
    {
        //width and height of a single frame inside the animation
        private int frameWidth, frameHeight, numberOfFrames;

        //this is a list containing all the source rectangle color data
        protected List<Color[,]> sourceColorDataList;

        public Color[,] this[int index]
        {
            get
            {
                return sourceColorDataList[index];
            }
        }

        public int FRAMECOUNT
        {
            get
            {
                return numberOfFrames;
            }
        }
        public int FRAMEWIDTH
        {
            get
            {
                return frameWidth;
            }
        }
        public int FRAMEHEIGHT
        {
            get
            {
                return frameHeight;
            }
        }

        public AnimatedTextureData(Main game, string path, int numberOfFrames, int frameWidth, int frameHeight)
            : base()
        {
            this.texture = game.Content.Load<Texture2D>(@"" + path);

            this.numberOfFrames = numberOfFrames;
            this.frameWidth = frameWidth;
            this.frameHeight = frameHeight;

            this.sourceColorDataList = new List<Color[,]>(numberOfFrames);
            setColorData(texture);
        }

        /// <summary>
        /// Converts a Texture2D into a list of Color[,] array data
        /// e.g. an image with 8 frames will have 8 Color[,] entries in the list.
        /// Each Color[,] is a 2D array of color data for the frame.
        /// This 2D color array is used for Non-AA CDCR - see Collision class
        /// </summary>
        /// <param name="texture"></param>

        protected override void setColorData(Texture2D texture)
        {
            int width = texture.Width;
            int height = texture.Height;

            //read data into 1d array
            Color[] colors1D = new Color[width * height];
            texture.GetData(colors1D);

            //create 2d array to store data
            Color[,] colors2D = new Color[frameWidth, frameHeight];

            //read each frame into a seperate colors2D array and add it to the list
            //then when we want to now the color data for a particular frame we just query the list
            for (int i = 0; i < numberOfFrames; i++)
            {
                for (int x = 0; x < frameWidth; x++)
                {
                    for (int y = 0; y < frameHeight; y++)
                    {
                        colors2D[x, y] = colors1D[x + (y * frameWidth) + frameWidth * frameHeight * i];
                    }
                }
                sourceColorDataList.Add(colors2D);
            }
        }
    }
}

textureData

  private Vector2 centreOrigin;
        private int halfWidth;
        private int halfHeight;
        private Integer2 dimensions;

        #region PROPERTIES
        public Integer2 DIMENSIONS
        {
            get
            {
                return dimensions;
            }
            set
            {
                dimensions = value;
            }
        }

        public float WIDTH
        {
            get
            {
                return texture.Width;
            }
        }
        public float HALFWIDTH
        {
            get
            {
                return halfWidth;
            }
        }
        public float HEIGHT
        {
            get
            {
                return texture.Height;
            }
        }
        public float HALFHEIGHT
        {
            get
            {
                return halfHeight;
            }
        }
        public Color[,] TEXTURECOLORDATA2D
        {
            get
            {
                return textureColorData2D;
            }
            set
            {
                textureColorData2D = value;
            }
        }
        public Texture2D TEXTURE
        {
            get
            {
                return texture;
            }
            set
            {
                texture = value;
            }
        }
        public string NAME
        {
            get
            {
                return texture.Name;
            }
        }
        public Vector2 CENTREORIGIN
        {
            get
            {
                return centreOrigin;
            }
        }
        public Rectangle FULLSOURCERECTANGLE
        {
            get
            {
                return fullSourceRectangle;
            }
        }
        #endregion

        //Called by AnimatedTextureData - does nothing because AnimatedTextureData() does everything instead
        public TextureData()
        {
        }

        public TextureData(Main game, string path)
        {
            this.texture = game.Content.Load<Texture2D>(@"" + path);
            setColorData(texture);

            this.fullSourceRectangle = new Rectangle(0, 0, texture.Width, texture.Height);
            this.centreOrigin = new Vector2(texture.Width / 2, texture.Height / 2);
            this.halfWidth = texture.Width / 2;
            this.halfHeight = texture.Height / 2;
            this.dimensions = new Integer2(texture.Width, texture.Height);
        }

        //converts color data from texture from 1d to 2d array
        protected virtual void setColorData(Texture2D texture)
        {
            System.Diagnostics.Debug.WriteLine("once");

            int width = texture.Width;
            int height = texture.Height;

            //read data into 1d array
            Color[] colors1D = new Color[width * height];
            texture.GetData(colors1D);

            //create 2d array to store data
            this.textureColorData2D = new Color[width, height];

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    textureColorData2D[x, y] = colors1D[x + y * width];
                }
            }
        }
    }
}

Texture Manager はデータを制御し、呼び出すメインでこれらのクラスを使用している場合、textureManager.Add("Example"); ここでの問題は、キャストする必要があるため、にキャストしようとしてAnimatedTextureDataいますが、許可されません。何か案は?

AnimatedTextureData aniSpri = (AnimatedTextureData)textureManager.Get("AniSpri");

(AniSpriは の辞書に既に登録されていますTextureManager)

4

1 に答える 1

0

問題が発生した場合は、 をtextureManager.Get()返しますTextureData

サブタイプをそのベース タイプにキャストできます。しかし、基本型のインスタンスをサブタイプにキャストしていますが、できません。

anAnimatedTextureDataは ですがTextureData、aTextureDataは特別な種類の an ではありませんAnimatedTextureData

ここを参照してください。

于 2013-10-30T16:09:12.990 に答える