这几天都在学习cc3.x的物理引擎,自从3.x版本之后,cc就把两大引擎Box2d和chipmunk封装起来了啊,用起来方便多了,对于我这个对物理引擎从没了解的人也上手起来了啊。物理引擎对于在什么跑酷之类的游戏中还是作用蛮大的啊,碰撞还是在所难免的。对于物理引擎中的各种基本概念,比如物理边界,重力加度,关节等等,网上一大堆资料,我就不罗嗦了。cc3.x默认用的是chipmunk,你也可以改用Box2d。
以前我遇到一个大神用html5做了一个简单的晃绳子的小demo.链接是http://www.html5cn.org/article-5149-1.html。
这个游戏是模仿一个小人抓在一条绳子上,然后你开始用鼠标按住屏幕,然后左右来回动,小人也跟着来回晃动,有没有一点真实的赶脚啊,松开鼠标之后人就被抛出去了。然后计算人抛出去的距离,计算你的排名。大神用了2,3个小时就搞定了。对于我这个菜鸟,用了2,3天才琢磨出来。虽然耗费了更多的时间,但是也学到了东西,我想这就是成长吧。
这个demo中没多少代码,但是就是模仿绳子来回晃的样子要花时间。一下是一个样子图片:
1.绳子的绘制
首先说明绳子必须要有物理特性,不能是一根全是直的,要在外力的作用下能模仿实际的弯曲现象,所以你用图片,做成动画Animation就明显不行了。用drawNode画线条呢,也不行,因为线条无法加入物理特性。
想了好久才,看了大神的文章,才明白了。一根绳子可以是很多刚体连在一起,刚体之间用关节连在一起,如下图所示
所以代码中要设置成:
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
这句话原本是在调试模式下显示所有的刚体和关节,碰撞,一般游戏做好之后是要删除的。但是我们这个绳子的制作就不能删除这句话了,不然什么都看不见。
但是我们不想看到红色的刚体,只留下关节。所以要设置成:
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_JOINT);
但是你会发现绳子上一节有一个圆点,这个圆点怎么删除呢。想了半天,去看源代码吧。
在PhysicsDebugDraw类中,drawJoint函数就是绘制关节的,以下是这个函数的源代码的一部分
void PhysicsDebugDraw::drawJoint(PhysicsJoint& joint)
{
const Color4F lineColor(0.0f,0.0f,1.0f,1.0f); //绘制关节线条的颜色
const Color4F jointPointColor(0.0f,1.0f);//绘制关节点的颜色
我们可以看到线条是蓝颜色,关节点是绿颜色,我们要不显示节点,所以节点颜色要和线条一样
const Color4F jointPointColor(0.0f,1.0f)
真正绘制线条的语句是
_drawNode->drawSegment(PhysicsHelper::cpv2point(a),PhysicsHelper::cpv2point(b),3,lineColor);
真正绘制节点的语句是
_drawNode->drawDot(PhysicsHelper::cpv2point(a),2,jointPointColor);
}
这个函数中所有的绘制节点的语句_drawNode->drawDot,我们都要屏蔽掉,这样子就看不到节点的绘制了
简单的来说源代码中要修的就是两点,一个修改节点颜色,一个是屏蔽掉节点的绘制语句。
改完之后就是下面这个样子:
有点绳子的样子了吧,不过有点锯齿状啊,将线条绘制语句中半径设置小点,默认是3,改成1,会好点。
再下来就是选择何种关节类型了,3.x physics中给出了11种关节类型
最后我选择了PhysicsJointDistance,其中PhysicsJointLimit晃动性太大了,满足不了,PhysicsJointSpring是弹簧类型,满足不了。下面是运行的一个图片
触摸检测和碰撞检测了,没什么好说的,代码写的很乱,大家多多包涵啊,我已上传到了http://download.csdn.net/detail/fanzhang1990/8241783
原文链接:https://www.f2er.com/cocos2dx/345627.html