试图制作一个动画精灵

问题描述:

我试图让我的播放器在我的XNA游戏中行走,所以我设置了一个AnimatedTextureData类来接受一个动画雪碧表,它继承了普通的纹理数据。试图制作一个动画精灵

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]; 
       } 
      } 
     } 
    } 
} 

纹理Manager控制数据,当你在主使用这些类你打电话textureManager.Add("Example"); 我在这里的问题它是想让我演员,所以我试图投到AnimatedTextureData但它不会让我。有任何想法吗?

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

AniSpri已经投入字典中TextureManager

+0

我没有看到描述纹理管理器或'textureManager.Get()'的代码。 – pinckerman

如果我得到你的问题,textureManager.Get()返回TextureData

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

AnimatedTextureDataTextureData,但TextureData不是一种特殊的AnimatedTextureData

参考文献here