-1

我正在开发弹丸射击游戏。

游戏的基本结构是坦克由用户使用方向键控制,敌人会从屏幕右侧进入并开始走向坦克。坦克将发射射弹,如果它击中敌人,则用户得分,如果敌人到达坦克而不是用户失败。

-坦克移动是使用 Animated_Sprite 类实现的,该类是 OpenGL 或者更确切地说是在主函数中创建的名为“hero”的 c++ 对象。- 敌人的移动也使用相同的动画精灵类来实现,该类将精灵表切成不同的帧,帧在对象运动期间使用 Update_Sprite_Animation() 函数发生变化。因此“敌人”对象也是在主函数中创建的 Animated_Sprite 类对象。- 随着坦克的移动,背景也向相反的方向移动。

- 主要问题(对我而言)-火箭(Box2d 圆形形状)将从坦克的位置发射)不是 Animated_Class 对象,它是这样制作的:

b2Body* addCircle(int x,int y,int r,bool dyn=true){...}
void drawcircle(b2Vec2 center,float r,float angle){...}
b2Body *mycircle;
float speed=6,angle=300*3.141/180;  ...

然后我将线速度应用于 box2d 的“mycircle”主体,以获得火箭(圆)的弹丸运动,如下所示:

void mouse( int button, int state,int x,int y)
{

           if(state==GLUT_DOWN)
           {

            mycircle=addCircle((hero->x)-5,(hero->y)+3,8,true);
            b2Vec2 vector = speed * b2Vec2(cos(angle), -sin(angle));
            mycircle->SetLinearVelocity(vector);
          }

}

-根据我的阅读,在 Box2d 中,通过创建另外两个对象并获取这样的联系人列表来检查对象之间的碰撞:

 for (b2Contact* contact = world->GetContactList(); contact; contact = contact->GetNext())
          contact->... //do something with the contact

- 由于英雄和敌人不是 b2body 对象而是 Animated_Sprite 类对象,你建议我应该怎么做?我可以对 Animated_Sprite 类对象进行类型转换以获得 b2body 对象吗?还是我必须创建一个新的 b2body 对象并给它一个英雄或敌人对象的引用?如果是,请指导我。还是我必须创建一个新的 b2body 对象并为其提供所有英雄和敌人的装置?必须有一种方法来检测我们自己在 b2world 之外的类对象和 b2body 对象(例如 box2d 的圆形)之间的碰撞,但我对此很陌生,我不知道该怎么做。

- 没有将英雄和敌人实现为 Box2d 身体的原因:因为我不知道如何在 b2body 对象上实现 Animated_sprite 类动画以及我使用 box2d 进行弹丸运动的原因是因为我不知道如何实现它使用原始 Opengl。

我无法阅读 Box2d 关于碰撞的完整手册,因为它会花费太多时间。

指导我并告诉我应该怎么做才能检测到 b2body 对象和 b2world 之外的对象之间的碰撞,即正常的 c++ Opengl 对象。

4

1 回答 1

0

[问题解决了]

为了使用 box2d 检测碰撞,我认为有必要将它们作为 box2d 主体,而不仅仅是 c++ 对象。同时制作一个 c++ 对象并将其映射到 Box2d 主体将解决问题,Box2d 可以使用其联系人侦听器来侦听碰撞。我如何将我的自定义类对象变成 b2body 对象如下->

我在我的 Animated_Sprite 类构造函数中附加了 box2d 物理体的代码,现在每次实例化 Animated_Sprite 的新对象时,也会使用它创建对新物理体的引用,因此创建 Animated_Sprite 类的对象基本上是 box2d 世界的物理对象还。现在我得到了我的目标。谢谢 -

顺便说一句,我遵循 iforce2d.net 网站上的教程来实现这一点,他们有很好的教程。如果有人想知道我是如何做到的,请按照此链接上的教程“在 BOX2d 世界中绘制您自己的对象并创建它们的物理体”> iforce2d.net/b2dtut/drawing-objects

于 2013-11-12T21:36:24.220 回答