cocos2dx 3.1.1物理引擎做个晃绳子的小demo


这几天都在学习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中没多少代码,但是就是模仿绳子来回晃的样子要花时间。一下是一个样子图片:

cocos2dx 3.1.1物理引擎做个晃绳子的小demo_第1张图片


1.绳子的绘制

   首先说明绳子必须要有物理特性,不能是一根全是直的,要在外力的作用下能模仿实际的弯曲现象,所以你用图片,做成动画Animation就明显不行了。用drawNode画线条呢,也不行,因为线条无法加入物理特性。

   想了好久才,看了大神的文章,才明白了。一根绳子可以是很多刚体连在一起,刚体之间用关节连在一起,如下图所示

                                            cocos2dx 3.1.1物理引擎做个晃绳子的小demo_第2张图片

     所以代码中要设置成:

   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, 0.0f, 1.0f);//绘制关节点的颜色

    我们可以看到线条是蓝颜色,关节点是绿颜色,我们要不显示节点,所以节点颜色要和线条一样

       const Color4F jointPointColor(0.0f, 0.0f, 1.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

  


你可能感兴趣的:(cocos2d-x基础学习)