私はC#とXNA 4.0、およびFarseer Physics Engine(Box2Dに非常に似ています)を使用しており、OBlock、LBlockなどを派生させるBlockクラスを持っています。
ブロックは次のとおりです。
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
私がやろうとしているのは、タイプに関係なく、リスト内の任意のブロックのm_bodyにアクセスすることです。
blocks[index].m_body.DOSTUFF();
どうやらm_bodyは常にnullです...