Box2d中刚体的纹理的几种实现方式
来源:互联网 发布:通用编程器报价 编辑:程序博客网 时间:2024/06/05 19:11
Box2d中创建完刚体并将装置(fixture)附加到刚体上以后,还需要对刚体应用纹理才能够让刚体看起来像一个真正的物体,而不是一个个多边形或者圆形线框。因此,总结了下面几种为刚体添加纹理的思路。
1. 最简单的方式就是使用CCPhysicsSprite类,CCPhysicsSprite是cocos2d 2.1之后引入的,支持Chipmunk和Box2d两个框架,类中定义了b2Body成员用来存储其对应的刚体,该类重写了nodeToParentTransform,position和rotation的get/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中包含CCSPrite和b2Body这两个成员(除了这两个成员,其它成员根据需求而定,不在我们的讨论范围内),然后在MyB2Body中定义自己的更新方法(就叫updateBodyAndSprite吧),接着在我们需要更新刚体位置的地方调用updateBodyAndSprite就可以了。
这种方式和第一种方式的区别在于,它为我们提供了更多的灵活性,当然你也可以说,因为cocos2d是开源的,所以我们也可以修改CCPhysicsSprite类,所以其同样具有灵活性,但是如果我们修改CCPhysicsSprite类,则会影响到你机器上其他使用cocos2d框架的应用程序。而且这里我们并不是重写position或者rotation的get/set方法,而是实现自定义的方法供手动调用。
具体的例子可以看一下另一篇博文手把手教你制作一款Box2D小游戏(一)中StepBlock类的实现(该类中使用CCPhysicsSprite,其实使用CCSprite即可满足需求)。
3. 上面两种方法我们通过定义类或者使用库中定义的类来完成,实际上,b2Body对象为我们提供了一个很好的属性来存储其对应的精灵,即userData这个属性。b2Body的userData属性用来存放任何我们想存放的数据,那么我们干脆就在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());
}
}
这种方式与我们第二种方式有些类似,都需要在其他方法中手动更新精灵的位置。
好了,以上就是关于刚体纹理的一点点心得,如果有说的不清楚的地方,欢迎留言指正~
- Box2d中刚体的纹理的几种实现方式
- Cocos2d-x Box2d中实现刚体的移动
- Box2D中切割刚体效果的实现一览(一)
- Box2D中切割刚体效果的实现一览(二)
- Box2D中切割刚体效果的实现一览(完)
- Box2d中使用开源的PRKit库来制作任意形状的多边形刚体的纹理
- box2d刚体移动的方法
- quick-cocos2d中替换纹理的几种方式
- Box2D 的 debugDraw 的几种绘制方式 e_shapeBit、 e_jointBit....
- 【Box2D】刚体的作用ApplyForce、ApplyImpulse、SetLinearVelocity
- box2d显示我们画出的刚体
- BOX2D画出较为复杂的刚体
- 刚体加力的方式
- Box2D中控制一个刚体
- cocos2d-x中box2d的简单应用实例(点击屏幕产生刚体)
- 让刚体听我的——鼠标拖动Box2D刚体
- coco2d-x 中box2d选中刚体
- MFC 中 Tooltip 实现的几种方式
- python 学习笔记-操作mysql
- 简单树链剖分
- java--类加载相关知识点
- 装饰与继承的区别
- mysql分表的3种方法
- Box2d中刚体的纹理的几种实现方式
- 数制转换
- openstack配置项自动生成方法
- 【codeforces 750F】New Year and Finding Roots
- update优先级设置
- Android实现Canny算法
- 未能加载文件或程序集 Microsoft.ReportViewer.Common, Version=11.0.0.0
- R语言实战笔记--第十章 功效分析&样本量
- leetcode389