我正在开发弹丸射击游戏。
游戏的基本结构是坦克由用户使用方向键控制,敌人会从屏幕右侧进入并开始走向坦克。坦克将发射射弹,如果它击中敌人,则用户得分,如果敌人到达坦克而不是用户失败。
-坦克移动是使用 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 对象。