【发布时间】:2013-02-03 09:22:25
【问题描述】:
我正在使用 C# 和 XNA 4.0,以及 Farseer Physics Engine(与 Box2D 非常相似),并且有一个 Block 类,我从中派生出 OBlock、LBlock 等。
区块如下:
class Block
{
public Body m_body;
public virtual void Draw(SpriteBatch spriteBatch) { }
public virtual void RemoveBody(World world)
{
//world.RemoveBody(m_body);
}
}
我只将这些方法、字段等放入其中,以便可以在列表中访问它们的覆盖版本
所以我的覆盖版本看起来像这样: OBlock.cs
class OBlock : Block
{
private static Texture2D blockImg; //I load this in LoadContent so I don't have loads of Texture2Ds
public new Body m_body; //Is this right?
public OBlock(World world, Vector2 position)
{
m_body = BodyFactory.CreateBody(world, position); // Create the body, changing it from null
FixtureFactory.AttachRectangle(Game1.blockSide *2, Game1.blockSide *2, 1.0f, new Vector2(0, 0), m_body); //This bit changes between classes
m_body.BodyType = BodyType.Dynamic;
}
public override void RemoveBody(World world)
{
world.RemoveBody(m_body);
}
public static void LoadImage(Texture2D tex)
{
OBlock.blockImg = tex;
}
public override void Draw(SpriteBatch spriteBatch)
{
Vector2 position = m_body.Position * Game1.MetreInPixels;
Vector2 origin = new Vector2(blockImg.Width / 2, blockImg.Height / 2);
float rotation = m_body.Rotation;
spriteBatch.Begin();
spriteBatch.Draw(blockImg, position, null, Color.White, rotation, origin, Game1.BLOCK_SCALE, SpriteEffects.None, 1);
spriteBatch.End();
base.Draw(spriteBatch);
}
}
还有 LBlock、ZBlock 等,除了我评论的那一点之外,它们看起来都非常相似。
然后我把它们都放进去
List<Block> blocks //As a field in Game1
blocks = new List<Block>(); // In LoadContent after loading images
我想要做的是访问列表中任何 Block 的 m_body,无论使用哪种类型
blocks[index].m_body.DOSTUFF();
显然 m_body 总是为空...
【问题讨论】:
-
当你一行一行地单步执行代码,观察对象上的 m_body 时会发生什么?
标签: c# list inheritance syntax polymorphism