物理引擎 - chipmunk :

生成物理世界 :

第一步 :

新建项目打开 project.json 将chipmunk模块导入 .

    "modules" : ["cocos2d", "chipmunk"],

第二步 :

在 app.js 的 ctor 函数中里添加3个函数

    ctor:function () {this._super();//初始化物理世界this.initPhysics();//开启计时器this.scheduleUpdate();//显示碰撞框体this.showDebug();},

初始化物理世界 :

initPhysics: function(){var width = cc.winSize.width;var height = cc.winSize.height;this.space = new cp.Space();this.space.gravity = cp.v(0, -200);     //设置重力  重力向下为 200var staticBody = this.space.staticBody;var walls = [new cp.SegmentShape(staticBody, cp.v(0, 0), cp.v(width, 0), 0),    //最后一个参数是墙的厚度 , 很重要 , 没有厚度的墙体容易被穿透.new cp.SegmentShape(staticBody, cp.v(0, height), cp.v(width, height), 0),new cp.SegmentShape(staticBody, cp.v(0, 0), cp.v(0, height), 0),new cp.SegmentShape(staticBody, cp.v(width, 0), cp.v(width, height), 0)];for (var i = 0; i < walls.length; i++){var shape = walls[i];shape.setElasticity(1);     //设置弹性系数shape.setFriction(1);       //设置摩擦力this.space.addStaticShape(shape);}
},

update计时器 :

update: function (dt) {var timeStep = 0.03;this.space.step(timeStep);    //timeStep 控制物理世界的时间流速
}

显示物理框体 :

 showDebug: function () {this._debugNode = new cc.PhysicsDebugNode(this.space);this._debugNode.visible = true;     // 为true 时, 显示物理框体this.addChild(this._debugNode);},

第三步 :

onEnter中添加点击事件 , onExit中移除 :

onEnter: function () {this._super();cc.eventManager.addListener({event: cc.EventListener.TOUCH_ONE_BY_ONE,onTouchBegan: this.TouchBegan.bind(this)}, this);
},onExit: function () {this._super();cc.eventManager.removeListener(cc.EventListener.TOUCH_ONE_BY_ONE);
},

点击生成物理精灵 :

    TouchBegan: function (touch, event) {cc.log("TouchBegan");var p = touch.getLocation();var body = new cp.Body(1, cp.momentForBox(1, 50, 50));    //其中参数 1 是质量(mass) |  50是框体的 宽和高body.setPos(p);this.space.addBody(body);var shape = new cp.BoxShape(body, 50, 50);shape.setElasticity(0.5);             //设置弹性系数shape.setFriction(0.5);               //设置摩擦力this.space.addShape(shape);//创建物理精灵var sprite = new cc.PhysicsSprite("res/box.png");sprite.setBody(body);sprite.setPosition(cc.p(p.x, p.y));this.addChild(sprite);return true;},

这样就可以生成一个简单的物理空间了.


物理引擎常用API :

设置冲量 :

  • 只能对 Body 设置, 提供一个向上为1000的冲量 , 冲量相当于瞬间的力 , 通常做跳跃时使用.
body.applyImpulse(cp.v(0,1000),cp.v(0,0))

设置力 :

  • 只能对 Body 设置, 提供一个向上为1000的力 , 和冲量不同 , 力会一直存在.
body.applyForce(cp.v(0,1000),cp.v(0,0))

设置碰撞类型 :

  • 只能对 Shape 设置 , 设置了类型才可以做碰撞检测
shape.setCollisionType(1001);   

设置分组、层 :

  • 只能对 Shape 设置 , 设置了分组 , 同组之间相互没有碰撞 .
    注意 : 同层之间才会发生碰撞 , 不同组之间会发生碰撞 .
shape.group = 5;
shape.layers= 5;

获取碰撞类型 :

  • 没有get函数 直接获取属性
var type = shape.collision_type;

给两个特定碰撞类型添加碰撞事件 :

  • 第1 、第2 参数是需要检测碰撞的2个碰撞类型
  • 后4个参数 是回调函数 , 分别是 :
    刚接触时(Begin) | 接触的每次step(Pre) | 接触并碰撞相应已经处理(Post) | 分离(Separate)
this.space.addCollisionHandler(1001, 1002, Begin, Pre, Post, Separate);Begin: function(araiber, space)
{cc.log("CollisionBegin")
}//...

特别注意 :

1. 碰撞检测的回调函数参数 araiber , 它可以获取碰撞的两个 shape 和 body, 但是无法确定A 和 B 分别是哪个对象 , 需要自己判断 .

2. 在碰撞移除处理时 , 需要调用指定函数addPostStepCallback 在下一帧进行处理 , 处理方式是 移除body , shape , 物理精灵自身.

space.removeBody(body);
space.removeShape(shape);
sp.removeFromParent();

3. 移除处理的时候 容易出现A物体 碰撞 两个B物体 , A物体调用两次移除 , 第二次移除的时候会报错 , 所以我的处理是用try - catch方法 .

4. 碰撞组 和 层的关系 , 同层之间才会发生碰撞 , 不同层没有碰撞 , 优先级高于组 , 不同组之间会发生碰撞 .

5. walls数组成员的最后一个参数是墙的厚度 , 很重要 , 没有厚度的墙体容易被穿透.(强够厚,就不怕穿透)

完整碰撞处理代码 :

Begin: function(araiber, space)
{var shapeA = araiber.getA();var shapeB = araiber.getB();var bodyA = araiber.body_a;var bodyB = araiber.body_b;var bullet_shape;var enemy_shape;// 假设1001是子弹 1002是敌人// 判断shapeA的碰撞类型如果是1001 shapeA就是子弹 shapeB就是敌人if(shapeA.collision_type == 1001){bullet_shape = shapeA;enemy_shape = shapeB;}else{bullet_shape = shapeB;enemy_shape = shapeA;}var bullet_body;var enemy_body;//body的_type属性不是自带的, 在创建body的时候添加上去的.if(bodyA._type == 1001){bullet_body = bodyAenemy_body = bodyB}else{bullet_body = bodyBenemy_body = bodyA}// 移除处理需要调用特定函数 addPostStepCallback 意为在下一帧处理 .space.addPostStepCallback(function(){try{space.removeBody(bullet_body);space.removeShape(bullet_shape);}catch (error){cc.log("已经被移除了")}for(var i = 0; i < gameLayer.bullet.length; i++){if(gameLayer.bullet[i].getBody() == bullet_body){cc.log("找到子弹 消除")gameLayer.bullet[i].removeFromParent();gameLayer.bullet.splice(i,1);}}for(var i = 0; i < gameLayer.enemy.length; i++){if(gameLayer.enemy[i].getBody() == enemy_body){cc.log("找到敌人 - 掉血")gameLayer.enemy[i].hp--cc.log(gameLayer.enemy[i].hp)if(gameLayer.enemy[i].hp <= 0){space.removeBody(enemy_body);space.removeShape(enemy_shape);gameLayer.enemy[i].removeFromParent();gameLayer.enemy.splice(i,1);}}}}.bind(this));}

cocos2d - JS 物理引擎 - chipmunk相关推荐

  1. 物理引擎chipmunk

    chipmunk本是一个独立的开源项目,用纯c编写.cocos2d同时整合了chipmunk和box2d两个物理引擎. 相比之下,chipmunk更轻量易用,但是相关的文档很少. box2d还没开始学 ...

  2. JS物理引擎p2.js中文文档

    本文复制于Github p2.js项目的中文维基页面,鉴于国内访问Github网速不稳定,特粘贴到CSDN,促进知识更快传播,也希望有能力者继续完善此文档. 以下是原文,更新内容请查阅Github p ...

  3. 【Canvas】HTML5游戏开发的基本流程+P2.js物理引擎实战开发

    <HTML5游戏开发的基本流程> * 1. HTML5的简述 * 2. HTML5游戏开发所需的环境与工具 * 2.1. 开发环境 * 2.1.1. 浏览器 * 2.1.2. 开发语言 * ...

  4. Three.js物理引擎与物体的相互作用——关联材质对摩擦力弹性影响、物体运动方式、作用力相关

    vetor new CANNON.ContactMaterial构造方法用于设置Three.物理世界两种材质碰撞的参数 const defaultContactMaterial = new CANNO ...

  5. cocos2dx 物理引擎chipmunk

    local PhysicsScene = class("Scene",function()     return cc.Scene:createWithPhysics() -- 物 ...

  6. 一篇上手LayaAir的3D物理引擎

    昨天,我们分享了一篇2D物理文档<LayaAirIDE的可视化2D物理使用文档>. 今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本 ...

  7. python 物理引擎 摩擦力_Python 愤怒的小鸟代码实现:物理引擎pymunk使用

    游戏介绍 最近比较忙,周末正好有时间写了python版本的愤怒的小鸟,使用了物理引擎pymunk,图片资源是从github上下载的,实现了一个可玩的简单版本. 功能实现如下:支持小鸟类型:红色小鸟,蓝 ...

  8. Python 愤怒的小鸟代码实现(1):物理引擎pymunk使用

    python 愤怒的小鸟代码实现(1):物理引擎pymunk使用 游戏介绍 完整代码 Pymunk介绍 代码实现 pymunk相关初始化 创建一个pymunk物体 pymunk 状态更新 编译环境 游 ...

  9. 【cocos2dx3.5接入chipmunk物理引擎】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.chipmunk接入. 1.开启chipmunk选项 2.手动编译arm64-v8a架构的chipmunk静态库 ...

最新文章

  1. 查看Linux 硬件配置
  2. 月活675万 三翼鸟以三大能力“重建”行业赛道
  3. epoll的使用实例
  4. 排序算法——快速排序算法
  5. 封装(私有化成员变量,获取变量值)
  6. 一个伟大计划终于完成了(粉丝联盟网正式上线了)
  7. 我的世界java占用太多内存_Java 进程占用内存过多,幕后元凶原来是线程太多
  8. Hexo+next的侧边栏背景与字体颜色设置方法
  9. qq linux五笔输入法下载官网,【qq五笔官方下载】qq五笔输入法官方下载电脑版 最新版-开心电玩...
  10. Linux磁盘ext3变成ext4,从Ext3迁移到Ext4
  11. ss导航java宝典_ss导航绅士宝典app下载-ss导航绅士宝典百度网盘官方版下载v1.1.0-七度网...
  12. 每日一题《青蛙跳步》
  13. easyui datagrid 多列排序,该如何处理[多列同时order,只针对某一列order]
  14. 【百度网盘】 个人资源共享
  15. linux 查看内存地址 rw,如何查看Linux内存中的程序所有堆的地址
  16. Android之CardView
  17. 翻译Prism4碰到生单词
  18. 想通过参加会议年入30万,没这些能力可不行——百格活动
  19. 问渠那得清如许?为有源头活水来。——java面向对象的思想
  20. oracle exadata 多少钱,oracle exadata

热门文章

  1. C语言常见字符串处理string.h库函数strstr、strchr、strcat、strcmp、strcpy、strlen的介绍
  2. matlab_app实现一个简单的色彩分析可视化程序
  3. JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
  4. 指尖江湖鸿蒙抽奖,剑网3指尖江湖鸿蒙始清活动怎么玩
  5. Eigen的介绍、安装
  6. vscode里面如何配置库_怎么为vscode添加库文件_编程开发工具
  7. vue将页面html导出为pdf
  8. @Transactional注解回滚(事物)
  9. ZEMAX常用操作数及常见用法(更新中。。。)
  10. 大一 计算机应用基础 进制转换