Box2d中刚体的纹理的几种实现方式

30 篇文章 5 订阅


Box2d中创建完刚体并将装置(fixture)附加到刚体上以后,还需要对刚体应用纹理才能够让刚体看起来像一个真正的物体,而不是一个个多边形或者圆形线框。因此,总结了下面几种为刚体添加纹理的思路。

1.   最简单的方式就是使用CCPhysicsSprite类,CCPhysicsSpritecocos2d 2.1之后引入的,支持ChipmunkBox2d两个框架,类中定义了b2Body成员用来存储其对应的刚体,该类重写了nodeToParentTransformpositionrotationget/set等方法,获取对应刚体的坐标和转角,然后使用坐标和转角来更新其纹理的位置和旋转,从而使纹理和刚体能够同步移动和旋转。

使用CCPhysicsSprite的方式很简单:

CCPhysicsSprite*sprite = [CCPhysicsSprite spriteWithTexture:texture rect:CGRectMake(x, y,width, height)];

[parentaddChild:sprite];

[spritesetPTMRatio:PTM_RATIO];

[spritesetB2Body:body];

[spritesetPosition: ccp( p.x, p.y)];

首先通过初始化方法初始化纹理texture和纹理的绘制区域(矩形区域),接着将该精灵对象添加到场景中(与一般的CCSprite对象用法相同),接着设置单位转换的比例(Box2d中的“米”与像素之间的转换比例,即PTM_RATIO),然后指定对应的刚体(body),最后设置其初始的位置即可。

不需要做额外的操作,精灵的纹理便会随着刚体的运动而运动。

有兴趣的朋友可以在cocos2d类库中找到CCPhysicsSprite.h和CCPhysicsSprite.mm文件看一下具体的实现方法。

2.   上面第一种方式,我们使用了cocos2d中为我们提供的类库来实现刚体和纹理的同步运动。同样,我们也可以自己定义一个类(暂且就叫它MyB2Body),MyB2Body中包含CCSPriteb2Body这两个成员(除了这两个成员,其它成员根据需求而定,不在我们的讨论范围内),然后在MyB2Body中定义自己的更新方法(就叫updateBodyAndSprite吧),接着在我们需要更新刚体位置的地方调用updateBodyAndSprite就可以了。

这种方式和第一种方式的区别在于,它为我们提供了更多的灵活性,当然你也可以说,因为cocos2d是开源的,所以我们也可以修改CCPhysicsSprite类,所以其同样具有灵活性,但是如果我们修改CCPhysicsSprite类,则会影响到你机器上其他使用cocos2d框架的应用程序。而且这里我们并不是重写position或者rotation的get/set方法,而是实现自定义的方法供手动调用。

具体的例子可以看一下另一篇博文手把手教你制作一款Box2D小游戏(一)中StepBlock类的实现(该类中使用CCPhysicsSprite,其实使用CCSprite即可满足需求)。

3.   上面两种方法我们通过定义类或者使用库中定义的类来完成,实际上,b2Body对象为我们提供了一个很好的属性来存储其对应的精灵,即userData这个属性。b2BodyuserData属性用来存放任何我们想存放的数据,那么我们干脆就在userData中存放其对应的精灵对象就好了(这里说是存放,其实是userData指向刚体对应的精灵对象)。PhysicsEditor附带的例子中实际上就用的是这种方法。在update方法中,首先通过world->Step(dt,velocityIterations, positionIterations)来计算并更新所有刚体的位置,接着通过下面的循环来更新所有刚体对应的精灵的纹理:

for(b2Body* b = world->GetBodyList(); b; b = b->GetNext())

  {

          if (b->GetUserData() != NULL)

          {

                   CCSprite *myActor = (CCSprite*)b->GetUserData();

                   myActor.position = CGPointMake(

b->GetPosition().x* PTM_RATIO, b->GetPosition().y * PTM_RATIO);

                   myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

          }      

  }

这种方式与我们第二种方式有些类似,都需要在其他方法中手动更新精灵的位置。

好了,以上就是关于刚体纹理的一点点心得,如果有说的不清楚的地方,欢迎留言指正~

  • 84
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值