注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 

日志

 
 
关于我

喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr

网易考拉推荐

【原创】Box2d中刚体的纹理的几种实现方式  

2014-08-11 08:37:33|  分类: Box2D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

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

使用CCPhysicsSprite的方式很简单:

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

[parent addChild:sprite];

[sprite setPTMRatio:PTM_RATIO];

[sprite setB2Body:body];

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

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

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

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

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

这种方式和第一种方式的区别在于,它为我们提供了更多的灵活性,当然你也可以说,因为cocos2d是开源的,所以我们也可以修改CCPhysicsSprite类,所以其同样具有灵活性,但是如果我们修改CCPhysicsSprite类,则会影响到你机器上其他使用cocos2d框架的应用程序。而且这里我们并不是重写position或者rotationget/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());

           }      

   }

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

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

  评论这张
 
阅读(78)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017