cocosjs-Box2d

  最近使用cocosjs-3.12在写捕鱼,总结一下使用box2d:

  创建物理世界:

  var b2World = Box2D.Dynamics.b2World;            //创建物理世界;  var b2Vec2 = Box2D.Common.Math.b2Vec2;            //重力矢量,因为是捕鱼,所以不需要重力;  this.m_b2World=new b2World(new b2Vec2(0, 0),true);     //赋值给全局函数并且设置重力;  this.m_b2World.SetContinuousPhysics(true);         //连续碰撞检测,避免物体穿过另一个物体;
  this.initPhysics();                       //碰撞检测函数--自定义;
initPhysics: function () {

var b2ContactListener = Box2D.Dynamics.b2ContactListener;    //检测碰撞 设置接收碰撞回调函数    var listener = new b2ContactListener;

listener.BeginContact = function (contact) {      //两个物体开始接触时会响应,但只调用一次       var bodyA = contact.GetFixtureA().GetBody();       var bodyB = contact.GetFixtureB().GetBody();       var spriteA = bodyA.GetUserData();       var spriteB = bodyB.GetUserData();

if (spriteA != null && spriteB != null)       {         //碰撞检测逻辑编写;      setTimeout(function(){********************* 延时0.05秒 当正在碰撞时不能删除,此时删除将无效,稍微延时;        },50);       }   };    //另外3方法;  //void EndContact(b2Contact* contact)。分离时响应。但只调用一次。  //virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold)。持续接触时响应,它会被多次调用。  //virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)。持续接触时响应,调用完preSolve后调用。    this.m_b2World.SetContactListener(listener);},
/**[[--    --添加鱼的刚体]]*/addBodyForFish:function(fishObj){

//获取当前坐标    var x = fishObj.getFishPosition().x;    var y = fishObj.getFishPosition().y;

//鱼的刚体ID    var  fishRigidId = FISH_RIGID_PREFIS+fishObj.m_fishID;

//鱼是否需要旋转    var  isNeedRotate = fishObj.getFishIsNeedRotate();

//是否是子鱼 都需要获取父坐标    var  isNeedParentPos = fishObj.getFishIsChild();

//是否需要获取父节点的旋转角度(这个用来处理 杂乱鱼群和环绕鱼在box2d中是否需要实时旋转)    var  isNeedParentAngle = fishObj.getFishIsNeedParentAngle();

  //定义一个对象,用于将属性传个刚体;    var  mTransparentId={};    mTransparentId.g_Id=fishRigidId;    mTransparentId.g_FishSprite=fishObj.FishComponent;    //鱼的骨骼动画;    mTransparentId.g_IsNeedRotate=isNeedRotate;    mTransparentId.g_NeedParentPos=isNeedParentPos;    mTransparentId.g_IsNeedParentAngle=isNeedParentAngle;    mTransparentId.m_previousPos=cc.p(0,0);

var b2BodyDef = Box2D.Dynamics.b2BodyDef                            //物体定义;        , b2Body = Box2D.Dynamics.b2Body                                //刚体;        , b2FixtureDef = Box2D.Dynamics.b2FixtureDef                    //夹具定义        , b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;       //形状;

var  bodyDef = new b2BodyDef();                      //创建一个刚体;    bodyDef.type = b2Body.b2_dynamicBody;                   //刚体属性;    bodyDef.position.Set(x/PTM_RATIO, y/PTM_RATIO);            //将像素转换为box2d的米 PTM_RATIO=32;    //将数据部署到box2d中    bodyDef.userData = mTransparentId;

//添加鱼的刚体    var _body =this.m_b2World.CreateBody(bodyDef);              //添加刚体;

//鱼的刚体信息 多边形    var  fishBodyInfo = FishCommon.getFishBodyInfo(fishObj.fishType);    var  _pshape = new b2PolygonShape();    _pshape.SetAsBox(0.5, 0.5);    //-------m_vertices[i]改变他的值-----------    _pshape.Reserve(parseInt(Common.getTableSize(fishBodyInfo["posTable"])));  //刚体形状数组设置,js特有,lua与C++方法不一样,这地方需要注意;    for (var i=0;i<Common.getTableSize(fishBodyInfo["posTable"]);i++)    {        var x = fishBodyInfo["posTable"][i][0] * fishObj.m_fishScale;        var y = fishBodyInfo["posTable"][i][1] * fishObj.m_fishScale;        _pshape.m_vertices[i].Set(x /PTM_RATIO, y /PTM_RATIO);    }    //Common.log("addBodyForFish =================")

//可以理解成多边形的包装    var  shapeDef = new b2FixtureDef();    shapeDef.shape = _pshape;    shapeDef.isSensor = true;    shapeDef.filter.groupIndex = RIGID_FISH;                     //刚体分类,用于区分子弹、鱼、网;    _body.CreateFixture(shapeDef);

this.body_list[fishRigidId] = _body;},

/**[[--    --删除刚体 (用ID)    通过id获取刚体      ]]*/removeBodyForRigidId:function(RigidId)                {    var  body = FishBox2DConsole.body_list[RigidId];    if (body  != null)    {        FishBox2DConsole.m_b2World.DestroyBody(body);        body=null;        FishBox2DConsole.body_list[RigidId] = null;        delete FishBox2DConsole.body_list[RigidId];          //js特有,如果只是等于null的话,这属性还在,只是等于null了,应该删除;    }},

          


  
时间: 2024-10-21 04:49:14

cocosjs-Box2d的相关文章

cocos2dx box2d使用(一)

出处:https://www.evernote.com/shard/s262/sh/bf561bda-0458-4502-835b-903846f81d68/68e6634bddec74c5a2d5f8dd839eba0a 本例子使用的是cocos2d-x 3.0版本 首先创建一个cocos2d的c++工程,这里就不多做说明了!本例子的项目名称是MyGame 其次,在MyGame的工程设置里Build Settings下,把CC_ENABLE_CHIPMUNK_INTEGRATION=1改为CC

Visual Studio 2012下Box2D开发环境设置

Cocos2d-x 3.x默认情况下采用的物理引擎是Chipmunk,如果我们要使用Box2D引擎,需要进行一些设置和调整,而且不同的开发平台下这些设置也有所不同.由于本书在此之前介绍的都是基于微软的Visual Studio 2012下开发的Win32平台,所以这一节我们介绍Visual Studio 2012下Box2D开发环境设置.这些需要设置和调整的方面包括如下:在解决方案中添加libBox2D库工程.添加libBox2D库引用.开启Box2D预编译开关. 1.在解决方案中添加libBo

cocos2d-x之Box2d初试

物理引擎:用来模拟一套物理事件的物理代码. #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include <Box2D/Box2D.h> #define RATIO 80.0f class HelloWorld : public cocos2d::Layer,public b2ContactListener { private: b2World *wor

《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)

从最热门游戏排行榜和flash游戏网站上,你能看到什么?许多2D游戏都有非常出色的物理学和美术设计.现在我们要学习那些游戏使用了什么物理学以及如何用Box2D制作它们. 除了知道是“什么”,更重要的是知道“如何做”,首先,我想问读者一个问题:如果你想复制物理游戏的机制或行为,你需要什么技术和方法? 一年以前,我问了自己同样的问题,<6 Dimensions>就是问题的答案.这款游戏是一个创意的盒子,每一面都包含一组使用Box2D物理学再加上视觉美学技术制作的不同的游戏机制.在此,我将与大家分享

Box2D物理引擎模拟炸弹爆炸效果

今天咱们来模拟炸弹效果.于是问题一来了:"为什么要模仿这么暴力的效果呢?莫非几日不见,Yorhom人品煞变?" 其实玩过愤怒的小鸟的同学都应该对这种效果似曾相识,因为据非官方报道,第二厉害的小鸟--黑色鸟的特技就是自爆.问题二出现了:"那第一厉害的小鸟是哪一种呢?"据Yorhom我本人测试,那只红色大鸟应该是最厉害的,不过貌似没有特技?愤怒的小鸟这种肤浅的游戏,Y某我最擅长了,以后有时间会专门写写这个游戏的攻略.这两种鸟的靓照如下: 敷衍了问问题二的同学,问题三就来

Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

关节在Box2D的对象组织结构中,与b2Body(刚体)并列.因此两种对象都是由b2World创建并直接管理. 然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节也会被销毁.此时再访问关节指针,将得到一个错误,因此,在销毁body的时候应该遍历其涉及到的Joint并销毁之. 除此之外,可算是并列于b2Body的b2World另一大组成成分.我们就得到了这么一个物理世界:有一堆刚体,也有一堆关节.这一堆刚体根据物理定律运行,这一堆关节限制或驱动某些刚体的运动.

Libgdx Box2D实战---放开那小球(三:规则常用的body和精灵结合)

上一篇文章我介绍了box2D的基本知识,如果你用心的话,你会搜索网上相关简单demo吧.那些我就不写了.那么如果我用图片表示我的那个body,而不是简单线条,那该怎么办? 下面,我以我的项目中小球对象生成为例,介绍精灵和body如何结合: 下面是创建一个小球类,重要的都注释了: public class Ball { private static final float BALL_RADIUS = 0.15f;// 球半径 private final Random rand = new Rand

Libgdx Box2D实战---放开那小球(二:Box2D介绍)

 Box2D官网 : http://box2d.org/ Box2D v2.1.0用户手册翻译 : http://blog.csdn.net/complex_ok/article/category/871440 Libgdx使用jni封装了box2d的c++版本,使得其运行效率比其他同级的物理引擎如jbox2d快不少. 一.基础类 BodyDef  A body definition holds all the data needed to construct a rigid body. Y

实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行自由落体运动. HelloBox2D实例 使用Box2D引擎进行开发过程,如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件,它的代码如下: [html] view plaincopy #ifndef __H

Cocos2d-x 3.1.1 学习日志10--一进来你就知道了Box2D了

error LNK2019: 无法解析的外部符号 "public: __thiscall b2Draw::b2Draw(void)" ([email protected]@[email protected]),该符号在函数 "public: __thiscall GLESDebugDraw::GLESDebugDraw(float)" ([email protected]@[email protected]@Z) 中被引用 _thiscall b2World::~b