我正在使用 C# 和 XNA 4.0,以及 Farseer 物理引擎(非常类似于 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 总是为空......