使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)

分别用box2d和chipmunk实现了一下,不过box2d没整理,也懒得整理了。
chipmunk整理了一下,分享给大家吧。

刚开始研究,抛砖引玉

简要说明:
1、初始化物理环境,增加边界

initPhysics: function () {
        var space = this.space ;
        var staticBody = space.staticBody;

        //开启物体形状测试
        //this.initDebugMode();

        // Gravity
        space.gravity = cp.v(0, -980);      //重力
        space.sleepTimeThreshold = 0.5;     //休眠临界时间
        space.collisionSlop = 0.5;          //

        // Walls--四个边界
        var walls = [ new cp.SegmentShape( staticBody, cp.v(0,0-1), cp.v(winSize.width,0), 0-1 ),                // bottom
            new cp.SegmentShape( staticBody, cp.v(0,winSize.height), cp.v(winSize.width,winSize.height), 0),    // top
            new cp.SegmentShape( staticBody, cp.v(0,0), cp.v(0,winSize.height), 0),                // left
            new cp.SegmentShape( staticBody, cp.v(winSize.width,0), cp.v(winSize.width,winSize.height), 0)    // right
        ];
        for( var i=0; i < walls.length; i++ ) {
            var shape = walls<i>;
            shape.setElasticity(1);         //弹性
            shape.setFriction(0);           //摩擦
            //space.addStaticShape( shape );
            space.addShape( shape );
            if(i >= 2){
                shape.setCollisionType(3);
            }
            shape.setLayers(1);
        }
    },</i>

2、物体形状测试

initDebugMode: function () {
        this._debugNode = cc.PhysicsDebugNode.create(this.space);
        this.addChild(this._debugNode);
    },

3、物体定义

initBoxWithBody: function () {
        //物体的定义
        var mass = 1;
        var boxWidth = 32;

        var body = new cp.Body(mass, cp.momentForBox(mass, boxWidth, boxWidth) );
        body.setPos( cc.p(winSize.width/2, winSize.height/2) );
        this.space.addBody( body );
        var shape = new cp.BoxShape( body, boxWidth, boxWidth);
        shape.setElasticity( 0.5 );
        shape.setFriction( 0.3 );
        shape.setCollisionType(1);
        shape.setLayers(3);
        this.space.addShape( shape );

        //创建一个箱子
        var v_texture = cc.textureCache.addImage(res.box_png);
        this.box = cc.PhysicsSprite.create(v_texture,cc.rect(0,0,boxWidth,boxWidth));
        this.box.setBody(body);
        this.addChild(this.box,1);
        this.box.setTag(101);

        //上下移动
        var moveTo1 = cc.MoveTo.create(0.5, winSize.width / 2, this.box.y + 40);
        var moveTo2 = cc.MoveTo.create(0.5, winSize.width / 2, this.box.y - 40);
        this.downUpAction = cc.RepeatForever.create(cc.Sequence.create(moveTo1,moveTo2));
        this.box.runAction(this.downUpAction);
    },

4、增加点击事件、碰撞检测监听

onEnter: function () {
        this._super();

        cc.sys.dumpRoot();
        cc.sys.garbageCollect();

        //事件处理
        if( ‘touches‘ in cc.sys.capabilities ){
            cc.eventManager.addListener({
                event: cc.EventListener.TOUCH_ALL_AT_ONCE,
                onTouchesEnded: function(touches, event){
                    event.getCurrentTarget().processEvent( touches[0] );
                }
            }, this);
        } else if( ‘mouse‘ in cc.sys.capabilities ){
            cc.eventManager.addListener({
                event: cc.EventListener.MOUSE,
                onMouseDown: function(event){
                    event.getCurrentTarget().processEvent( event );
                }
            }, this);
        }

        //重置数据
        this.resetDatas();
        //
        this.scheduleUpdate();

        //添加碰撞监听事件
        // 1 & 2 检测box和上下BLOCK碰撞
        this.space.addCollisionHandler( 1, 2,
            this.collisionBegin.bind(this),
            this.collisionPre.bind(this),
            this.collisionPost.bind(this),
            this.collisionSeparate.bind(this)
        );
        // 1 & 3 检测box和左右边界碰撞
        this.space.addCollisionHandler( 1, 3,
            this.collisionBegin.bind(this),
            this.collisionPre.bind(this),
            this.collisionPost.bind(this),
            this.collisionSeparate.bind(this)
        );
        // 1 & 4 检测box和左右BLOCK碰撞
        this.space.addCollisionHandler( 1, 4,
            this.collisionBegin.bind(this),
            this.collisionPre.bind(this),
            this.collisionPost.bind(this),
            this.collisionSeparate.bind(this)
        );
    },

5、碰撞检测

collisionBegin : function ( arbiter, space ) {

        var shapes = arbiter.getShapes();

        var shapeA = shapes[0];
        var shapeB = shapes[1];

        var collTypeA = shapeA.collision_type;
        var collTypeB = shapeB.collision_type;

        if(collTypeB == 3){
            console.log( ‘Collision Type A:‘ + collTypeA );
            console.log( ‘end Collision Type B:‘ + collTypeB );

            this.boxDirectionX = -this.boxDirectionX;

            this.space.addPostStepCallback(function () {
                this.updateBoxAndBlocks();
            }.bind(this));
        }else if(collTypeB == 2 || collTypeB == 4)
        {//碰到上下墙壁 或者 左右出来的BLOCKS 就Gameover
            this.gameOver();
        }

        return true;
    },

    collisionPre : function ( arbiter, space ) {
        //console.log(‘collision pre‘);
        return true;
    },

    collisionPost : function ( arbiter, space ) {
        //console.log(‘collision post‘);
    },

    collisionSeparate : function ( arbiter, space ) {
        //console.log(‘collision separate‘);
    }
时间: 2024-10-18 05:48:54

使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)的相关文章

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

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

cocos2dx 3.2中的物理引擎初探(一)

cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需要修改对应的android工程或者是ios工程的配置文件. 在2.x版本的cocos中,使用物理引擎的步骤十分繁琐.但在3.x版本中变得非常方便了.我这次的学习目标是制作一个打砖块的小游戏. 首先,现在的Scene类提供了一个静态工厂方法,用以创造一个集成物理引擎的场景. Scene::initWi

Web 开发中很实用的10个效果【附源码下载】

在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记得收藏:) 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网

【转载】Web 开发中很实用的10个效果【附源码下载】

超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.美女很养眼吧 :) 源码下载      在线演示 网页边栏过渡动画 以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推

MyEclipse中android 项目如何解决第三方jar无法关联源码的问题( The JAR of this class file belongs to container &#39;Android Private Libraries&#39; which does not allow modifications to source attachments on its entries.)

若我们要为第三方jar(android-support-v4.jar)关联源码通常的做法是 右键项目 单击菜单Properties 单击菜单 Java Build Path 单击 Libraries 选项卡 单击展开 Android Private Libraries 单击展开 android-support-v4.jar 单击 Source attachment 再单击 右边的 Edit 选择源码路径 但是问题来了,我们在步骤8时会发现 edit 按钮是禁用的,这样我们就无法给jar选择源码路

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML 定义的 Bean 信息转换为 Spring 框架的 Bean Definition 对象的处理过程,向读者展示了 Spring 框架的奥妙之处,可以加深开发人员对 Spring 框架的理解. 0 评论: 秦 天杰, 软件工程师, IBM China 2013 年 9 月 02 日 内容 在 IBM

C#中的WinFrom技术实现串口通讯助手(附源码)

C#中的WinFrom技术实现串口通讯助手(附源码) ??实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口使用定时器进行定时发送数据. 5.可以打开文件夹,选择文件进行发送,并且将发送文件的内容显示在发送文本框中. 6.可以清空发送和接收文本框中的内容. 7.可以实时计算发送和接收的字节数. 8.实现打开文件夹保存发送和接收的文件内容(目前只支持.txt文件). 9.实时显示当前时间. ??功能演示 1

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应,但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Ma

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const