2013-10-30 103 views
0

我試圖讓我的播放器在我的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

回答

0

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

您可以將子類型轉換爲其基本類型。但是您將基本類型的實例轉換爲子類型,而您不能。

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

參考文獻here