如何在box2d和cocos2dx中创建像body一样的蛇?

我的工作类似于蛇.我想制作蛇体.

游戏逻辑是这样的:

蛇上下移动.移动应该像真正的蛇运动.

在这里,我受到了打击.

如何制作蛇的身体?

任何想法或参考应该对我有所帮助.

提前致谢.

解决方法

好的,这将是一个很长的答案.

我使用其他项目中的一些代码和“蛇”部分组合了一个快速示例.您可以找到整个(cocos2d-x)代码库here on github.

最容易(也是第一件)要做的就是建造蛇体.从Box2D的角度来看,你可以用一系列段来构建它们,每个段都由一个旋转关节连接起来.

>你想从单头开始
>然后使用相对于它的偏移进行迭代,从而创建分段
他们排成一列.
>在创建每个细分时,使用a将其链接到上一个细分
旋转关节.
>当你靠近尾巴时,开始逐渐减小身高.

以下是我们的目标:

这是我用来创建它的“粗略”代码:

// Constructor
    MovingEntity(b2World& world,const Vec2& position) :
   Entity(Entity::ET_MISSILE,10),_state(ST_IDLE)
   {
      // Create the body.
      b2BodyDef bodyDef;
      bodyDef.position = position;
      bodyDef.type = b2_dynamicBody;
      Body* body = world.CreateBody(&bodyDef);
      assert(body != NULL);
      // Store it in the base.
      Init(body);

      // Now attach fixtures to the body.
      FixtureDef fixtureDef;
      PolygonShape polyShape;
      vector<Vec2> vertices;

      const float32 VERT_SCALE = .5;
      fixtureDef.shape = &polyShape;
      fixtureDef.density = 1.0;
      fixtureDef.friction = 1.0;
      fixtureDef.isSensor = false;

      // Nose
      vertices.clear();
      vertices.push_back(Vec2(4*VERT_SCALE,2*VERT_SCALE));
      vertices.push_back(Vec2(4*VERT_SCALE,-2*VERT_SCALE));
      vertices.push_back(Vec2(8*VERT_SCALE,-0.5*VERT_SCALE));
      vertices.push_back(Vec2(8*VERT_SCALE,0.5*VERT_SCALE));
      polyShape.Set(&vertices[0],vertices.size());
      body->CreateFixture(&fixtureDef);
      body->SetLinearDamping(0.25);
      body->SetAngularDamping(0.25);

      // Main body
      vertices.clear();
      vertices.push_back(Vec2(-4*VERT_SCALE,2*VERT_SCALE));
      vertices.push_back(Vec2(-4*VERT_SCALE,-2*VERT_SCALE));
      vertices.push_back(Vec2(4*VERT_SCALE,2*VERT_SCALE));
      polyShape.Set(&vertices[0],vertices.size());
      body->CreateFixture(&fixtureDef);

      // NOW,create several duplicates of the "Main Body" fixture
      // but offset them from the previous one by a fixed amount and
      // overlap them a bit.
      const uint32 SNAKE_SEGMENTS = 4;
      Vec2 offset(-4*VERT_SCALE,0*VERT_SCALE);
      b2Body* pBodyA = body;
      b2Body* pBodyB = NULL;
      b2RevoluteJointDef revJointDef;
      revJointDef.collideConnected = false;

      // Add some "regular segments".
      for(int idx = 0; idx < SNAKE_SEGMENTS; idx++)
      {
         // Create a body for the next segment.
         bodyDef.position = pBodyA->GetPosition() + offset;
         pBodyB = world.CreateBody(&bodyDef);
         _segments.push_back(pBodyB);
         // Add some damping so body parts don't 'flop' around.
         pBodyB->SetLinearDamping(0.25);
         pBodyB->SetAngularDamping(0.25);
         // Offset the vertices for the fixture.
         for(int vidx = 0; vidx < vertices.size(); vidx++)
         {
            vertices[vidx] += offset;
         }
         // and create the fixture.
         polyShape.Set(&vertices[0],vertices.size());
         pBodyB->CreateFixture(&fixtureDef);

         // Create a Revolute Joint at a position half way
         // between the two bodies.
         Vec2 midpoint = (pBodyA->GetPosition() + pBodyB->GetPosition());
         revJointDef.Initialize(pBodyA,pBodyB,midpoint);
         world.CreateJoint(&revJointDef);
         // Update so the next time through the loop,we are
         // connecting the next body to the one we just
         // created.
         pBodyA = pBodyB;
      }
      // Make the next bunch of segments get "smaller" each time
      // to make a tail.
      for(int idx = 0; idx < SNAKE_SEGMENTS; idx++)
      {
         // Create a body for the next segment.
         bodyDef.position = pBodyA->GetPosition() + offset;
         pBodyB = world.CreateBody(&bodyDef);
         _segments.push_back(pBodyB);
         // Add some damping so body parts don't 'flop' around.
         pBodyB->SetLinearDamping(0.25);
         pBodyB->SetAngularDamping(0.25);
         // Offset the vertices for the fixture.
         for(int vidx = 0; vidx < vertices.size(); vidx++)
         {
            vertices[vidx] += offset;
            vertices[vidx].y *= 0.75;
         }
         // and create the fixture.
         polyShape.Set(&vertices[0],we are
         // connecting the next body to the one we just
         // created.
         pBodyA = pBodyB;
      }
      // Give the tail some real "drag" so that it pulls the
      // body straight when it can.
      pBodyB->SetLinearDamping(1.5);
      pBodyB->SetAngularDamping(1.5);

      // Setup Parameters
      SetMaxAngularAcceleration(4*M_PI);
      // As long as this is high,they forces will be strong
      // enough to get the body close to the target position
      // very quickly so the entity does not "circle" the
      // point.
      SetMaxLinearAcceleration(100);
      SetMaxSpeed(10);
      SetMinSeekDistance(1.0);
   }

这将是你的第一部分,一个基本的身体.以下是有关代码的一些注意事项:

>我增加了身体的阻尼,甚至更多的尾巴,所以它可以
拖着并“拉下”剩下的链接.这使得
拖动它时看起来更平滑.
>相邻的身体部分不会碰撞,但非相邻的部分会发生碰撞,所以蛇
可以“击中”自己.您可以选择其他部件是否应该碰撞或
不.

现在,让身体按照你想要的方式移动会有点棘手.我先给你看一张图片(和视频),这样你就可以看到我得到的地方了.所有这些都在我引用的代码库中,因此如果您愿意,可以调整它.

首先,这是我将它拖了一下之后蛇的样子的截图.

我拍了一些视频,你可以看到它碰撞,减速等等(see it here).

当你看到它在运动中,它仍然不完美,但我认为它看起来相当不错的几个小时的工作.

为了使蛇移动,我采取了“拖动”它的头部的方法.当我拖动它时,头部朝我的手指旋转(或者你可以使它遵循代码中的路径,追逐某些东西等)并将其头部朝向目标.身体的其他部分“拖拽”,这使它看起来很“好”.

控制器使用两种不同的机制来移动身体:

使用寻求行为的身体方向

正文使用“搜索”行为,其行为如下:

下面是MovingEntity类的ApplyThrust(…)方法的代码.

void ApplyThrust()
   {
      // Get the distance to the target.
      Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
      toTarget.Normalize();
      Vec2 desiredVel = GetMaxSpeed()*toTarget;
      Vec2 currentVel = GetBody()->GetLinearVelocity();
      Vec2 thrust = desiredVel - currentVel;
      GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
   }

该方法施加推力以使b2Body朝向目标方向移动.它具有最大速度(GetMaxSpeed())和最大线性加速度(GetMaxLinearAcceleration())作为类的属性.

如果您按照代码并绘制矢量,您将看到它的作用是施加推力来驱动您的速度,使其指向目标的位置.

另一种看待它的方法:它就像一个反馈循环(在矢量中),以保持你的速度与所需的速度匹配.如果您只是根据标量来考虑它,它会更容易看到.

如果你以5米/秒的速度向右移动(currentVel)并且你的最大速度(desiredVel)是6米/秒,那么推力将向右推,向右推得更快(desiredVel – currentVel = 1) .也就是说,你会加速到右边.

如果你以7米/秒的速度向右移动(currentVel)并且你的最大速度(desiredVel)是6米/秒,推力将为负,指向左侧,减慢你的速度(desiredVel – currentVel = -1) .

从物理的更新到更新,这使您的身体以您想要的速度朝目标方向移动.

在你的情况下,你只想向左和向右移动,让重力拉下你的身体.所有这一切都应该在物理学的背景下很好地发挥作用.您可以通过控制线性加速度来控制代理加速/减速的速度.

使用PID控制器进行车身旋转

这有点复杂(好像前一部分不是).

我们的想法是根据您想要的角度与您的身体所面对的角度之间的差异向身体施加扭矩. PID控制器使用当前角度差(乘以比例常数),最近历史的差值(积分)和角度差(变量)的变化率.前两个让身体转动,最后一个让它在达到目标角度时减速.

You can see more details on the theory and implementation here.

所有这些都封装在代码中的一个类中,称为PIDController.

注意:代码库中的PIDController是通用的.它对box2d,物理或它的用途一无所知.它就像一个排序算法……它只关心它被输入的数据以及你设置的参数如何工作.它可以很容易地在其他环境中使用……并且有大约100年的时间.

希望这能让你朝着正确的方向前进.这可能有点矫枉过正,但我​​有点挖掘这些东西,所以很有趣.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是