试图制作一个动画精灵

时间:2013-10-30 13:15:37

标签: c# casting xna textures

我正在尝试让我的玩家在我的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控制数据,当你在main中使用这些类时,你调用textureManager.Add("Example"); 我在这里遇到的问题是它要我施展,所以我试图施放到AnimatedTextureData,但它不会让我。有什么想法吗?

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

AniSpri已放入TextureManager

中的字典中

1 个答案:

答案 0 :(得分:0)

如果我出现问题,textureManager.Get()会返回TextureData

您可以将子类型转换为其基本类型。但是你要将基类型的实例转换为子类型,而你不能。

AnimatedTextureDataTextureData,但TextureData不是AnimatedTextureData的特殊类型。

参考here