ITPub博客

首页 > 应用开发 > IT综合 > 使用BOX2D来进行碰撞判断_浙江联通时代畅想张海波

使用BOX2D来进行碰撞判断_浙江联通时代畅想张海波

原创 IT综合 作者:浙江联通畅想张海波 时间:2014-12-18 00:38:05 0 删除 编辑

  在上一篇中,所完成的工程,虽然使用了BOX2D来进行碰撞判断,但基本思路是“控制sprite的位置,然后用sprite的位置来更新body的位置”,并没有充分利用BOX2D引擎,当时这样选择,在于对引擎了解还不充分,有好几个困难难以实现,但在项目完成后,通过一些实现过程中的思考,发现这个游戏完全可以使用BOX2D引擎来完成框架的。即修改为“用body的位置来更新sprite的位置”。废话不说,我们来看看浙江联通时代畅想张海波到底是些什么问题(其实都比较基本)。

  这里假定你已经掌握了BOX2D的最基本知识,已经可以实现子龙山人教程中的几个DEMO。对这些最基本的就不再介绍了。

  第一个难点就在于这些移动的板砖(即上图中的蓝色板,当然还有弹簧之类的其他板),让我们看看这些板有些什么特性:

  1)无视场景中的重力,不停的上移

  2)能够与主人公发生碰撞

  3)与主人公发生碰撞之后,本身速度完全不受影响

  如果你刚入门BOX2D引擎,就会发现问题所在:

  1)无视重力就很麻烦,是不是应该用一个关节马达来实现?

  2)板在碰撞之后受力,速度和位置就会发生变化,如何让这些事情不发生?是不是还要再设置一个关节来限制横向的移动?那随着板的上移,这个关节的锚点是不是还要跟着变化?

  这些问题想着就头大,幸好BOX2D已经为我们提供了一个简单快捷的方式:

  将这些板设置为 b2_kinematicBody。

  2、三种 body 类型

  在BOX2D中,有三种body类型:

  [cpp] view plaincopyprint?http://www.eoeandroid.com/thread-553096-1-1.html

  enum b2BodyType

  {

  b2_staticBody = 0,

  b2_kinematicBody,

  b2_dynamicBody

  };

  enum b2BodyType

  {

  b2_staticBody = 0,

  b2_kinematicBody,

  b2_dynamicBody

  };

  以我目前的使用情况来看,这三种类型区别如下:

  1)static body:http://beijing.jinti.com/zhuangxiu/18633974.htm没有速度,不受力,可以碰撞

  2)dynamic body:有速度,受力,可以碰撞。这前两种类型在各类教程中出现的频率更高一些。

  3)kinematic body:有速度,不受力,可以碰撞。

  这第三种正是我们想要的:一个不受重力,不受冲量,但是可以载着主人公按固定速度上移的蓝色板。只需要在完成body的初始化之后,给自己设定一个上移速度即可:

  [cpp] view plaincopyprint?

  void BlockBase::initPhysics(b2World * world) {http://f.hualongxiang.com/zhuangxiu/1787382.html

  PhysicalSprite::initPhysics(world);

  mBody->SetLinearVelocity(b2Vec2(0, SCOLLING_SPEED));(浙江联通时代畅想张海波日志)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30029683/viewspace-1371657/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-11-19

  • 博文量
    3
  • 访问量
    4952