我正在尝试让SFML.NET与Box2DX一起使用。
我正在制作一个简单的乒乓球游戏,只需要使用Box2DX中的碰撞检测和碰撞回调。
我已经用自己的方法覆盖了ContactListener,它运行正常。问题是当我使用body.SetUserData()并从SFML.NET传入Sprite对象时,我不知道如何比较哪些Sprite会发生碰撞。
这就是我现在所拥有的,它无效:
class MyContactListener : ContactListener
{
public override void Add(ContactPoint point)
{
Sprite spriteA = (Sprite)point.Shape1.GetBody().GetUserData();
Sprite spriteB = (Sprite)point.Shape2.GetBody().GetUserData();
if (spriteA == spriteB || spriteB == spriteA)
Console.WriteLine("Same sprites colliding.");
else
Console.WriteLine("Different sprites colliding.");
}
public override void Persist(ContactPoint point) { }
public override void Remove(ContactPoint point) { }
public override void Result(ContactResult point) { }
}
当添加联系人时,即使精灵相同,也会始终打印“不同的精灵碰撞”。
我想传入Sprite对象,因为我需要使用sprite来绘制 body.GetUserData();
答案 0 :(得分:0)
我添加了一个超类Entity,我继承了Ball,Enemy和Player类。 现在可以比较课程。
我不再将Sprite作为UserData传递。我传入了超类Entity。 我通过Draw()方法中的类实例访问sprite。
在类播放器:实体
中this.playerBody.SetUserData(this);
在课堂上MyContactListener:
class MyContactListener : ContactListener
{
public override void Add(ContactPoint point)
{
Body bodyA = point.Shape1.GetBody();
Body bodyB = point.Shape2.GetBody();
Entity typeA = (Entity)bodyA.GetUserData();
Entity typeB = (Entity)bodyB.GetUserData();
// Ball collision with Enemy
if ((typeA is Enemy && typeB is Ball) || (typeB is Ball && typeA is Enemy))
{
// Do something based on the collision
}