我正在尝试让我的玩家在我的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
)
答案 0 :(得分:0)
如果我出现问题,textureManager.Get()
会返回TextureData
。
您可以将子类型转换为其基本类型。但是你要将基类型的实例转换为子类型,而你不能。
AnimatedTextureData
是TextureData
,但TextureData
不是AnimatedTextureData
的特殊类型。
参考here。