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

前端之家收集整理的这篇文章主要介绍了使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://www.cocoachina.com/bbs/read.PHP?tid=220250

管理提醒:本帖被 superdragon 执行加亮操作(2014-08-27)
分别用Box2d和chipmunk实现了一下,不过Box2d没整理,也懒得整理了。
chipmunk整理了一下,分享给大家吧。

演示地址: http://121.40.100.196/box/
刚开始研究,抛砖引玉
简要说明:
1、初始化物理环境,增加边界
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
initPhysics: @H_301_109@ function@H_301_109@ () {@H_301_109@
@H_301_109@ var@H_301_109@ space = @H_301_109@ this@H_301_109@ .space ;@H_301_109@
staticBody = space.staticBody;@H_301_109@
@H_301_109@ //开启物体形状测试@H_301_109@
//this.initDebugMode();@H_301_109@
// Gravity@H_301_109@
@H_301_109@ space.gravity = cp.v(0,-980);@H_301_109@ //重力@H_301_109@
space.sleepTimeThreshold = 0.5; @H_301_109@ //休眠临界时间@H_301_109@
space.collisionSlop = 0.5;@H_301_109@ //@H_301_109@
// Walls--四个边界@H_301_109@
walls = [ @H_301_109@ new@H_301_109@ cp.SegmentShape( staticBody,cp.v(0,0-1),cp.v(winSize.width,0),0-1 ),@H_301_109@ // bottom@H_301_109@
// top@H_301_109@
// left@H_301_109@
301_109@ // right@H_301_109@
];@H_301_109@
for@H_301_109@ ( @H_301_109@ i=0; i < walls.length; i++ ) {@H_301_109@
shape = walls<i>;@H_301_109@
shape.setElasticity(1); @H_301_109@ //弹性@H_301_109@
shape.setFriction(0); @H_301_109@ //摩擦@H_301_109@
//space.addStaticShape( shape );@H_301_109@
space.addShape( shape );@H_301_109@
if@H_301_109@ (i >= 2){@H_301_109@
shape.setCollisionType(3);@H_301_109@
}@H_301_109@
shape.setLayers(1);@H_301_109@
}@H_301_109@
},</i>@H_301_109@

2、物体形状测试
?
4
initDebugMode: @H_301_109@ ._debugNode = cc.PhysicsDebugNode.create(@H_301_109@ .space);@H_301_109@
.addChild(@H_301_109@ ._debugNode);@H_301_109@
301_109@

3、物体定义
28
initBoxWithBody: @H_301_109@ //物体的定义@H_301_109@
mass = 1;@H_301_109@
BoxWidth = 32;@H_301_109@
body = @H_301_109@ cp.Body(mass,cp.momentForBox(mass,BoxWidth,BoxWidth) );@H_301_109@
body.setPos( cc.p(winSize.width/2,winSize.height/2) );@H_301_109@
.space.addBody( body );@H_301_109@
shape = @H_301_109@ cp.BoxShape( body,BoxWidth);@H_301_109@
shape.setElasticity( 0.5 );@H_301_109@
shape.setFriction( 0.3 );@H_301_109@
shape.setCollisionType(1);@H_301_109@
shape.setLayers(3);@H_301_109@
.space.addShape( shape );@H_301_109@
//创建一个箱子@H_301_109@
v_texture = cc.textureCache.addImage(res.Box_png);@H_301_109@
.Box = cc.PhysicsSprite.create(v_texture,cc.rect(0,BoxWidth));@H_301_109@
.Box.setBody(body);@H_301_109@
.Box,1);@H_301_109@
.Box.setTag(101);@H_301_109@
//上下移动@H_301_109@
moveTo1 = cc.MoveTo.create(0.5,winSize.width / 2,@H_301_109@ .Box.y + 40);@H_301_109@
moveTo2 = cc.MoveTo.create(0.5,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important; background:none!important">.Box.y - 40);@H_301_109@
.downUpAction = cc.RepeatForever.create(cc.Sequence.create(moveTo1,moveTo2));@H_301_109@
.Box.runAction(@H_301_109@ .downUpAction);@H_301_109@
301_109@

4、增加点击事件、碰撞检测监听
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
onEnter: @H_301_109@ ._super();@H_301_109@
cc.sys.dumpRoot();@H_301_109@
cc.sys.garbageCollect();@H_301_109@
//事件处理@H_301_109@
( @H_301_109@ 'touches'@H_301_109@ in@H_301_109@ cc.sys.capabilities ){@H_301_109@
cc.eventManager.addListener({@H_301_109@
event: cc.EventListener.TOUCH_ALL_AT_ONCE,@H_301_109@
onTouchesEnded: @H_301_109@ (touches,event){@H_301_109@
event.getCurrentTarget().processEvent( touches[0] );@H_301_109@
}@H_301_109@
);@H_301_109@
} @H_301_109@ else@H_301_109@ if@H_301_109@ 'mouse'@H_301_109@ cc.sys.capabilities ){@H_301_109@
cc.eventManager.addListener({@H_301_109@
event: cc.EventListener.MOUSE,@H_301_109@
onMouseDown: @H_301_109@ (event){@H_301_109@
event.getCurrentTarget().processEvent( event );@H_301_109@
}@H_301_109@
);@H_301_109@
}@H_301_109@
//重置数据@H_301_109@
.resetDatas();@H_301_109@
//@H_301_109@
.scheduleUpdate();@H_301_109@
//添加碰撞监听事件@H_301_109@
// 1 & 2 检测Box和上下BLOCK碰撞@H_301_109@
.space.addCollisionHandler( 1,2,@H_301_109@
.collisionBegin.bind(@H_301_109@ ),@H_301_109@
.collisionPre.bind(@H_301_109@ 301_109@
.collisionPost.bind(@H_301_109@ 301_109@
.collisionSeparate.bind(@H_301_109@ )@H_301_109@
);@H_301_109@
// 1 & 3 检测Box和左右边界碰撞@H_301_109@
301_109@
301_109@
301_109@
301_109@
)@H_301_109@
);@H_301_109@
// 1 & 4 检测Box和左右BLOCK碰撞@H_301_109@
301_109@
301_109@
301_109@
301_109@
)@H_301_109@
);@H_301_109@
301_109@


5、碰撞检测
39
collisionBegin : @H_301_109@ ( arbiter,space ) {@H_301_109@
shapes = arbiter.getShapes();@H_301_109@
shapeA = shapes[0];@H_301_109@
shapeB = shapes[1];@H_301_109@
collTypeA = shapeA.collision_type;@H_301_109@
collTypeB = shapeB.collision_type;@H_301_109@
(collTypeB == 3){@H_301_109@
console.log( @H_301_109@ 'Collision Type A:'@H_301_109@ + collTypeA );@H_301_109@
'end Collision Type B:'@H_301_109@ + collTypeB );@H_301_109@
.BoxDirectionX = -@H_301_109@ .BoxDirectionX;@H_301_109@
.space.addPostStepCallback(@H_301_109@ () {@H_301_109@
.updateBoxAndBlocks();@H_301_109@
}.bind(@H_301_109@ ));@H_301_109@
}@H_301_109@ (collTypeB == 2 || collTypeB == 4)@H_301_109@
{@H_301_109@ //碰到上下墙壁 或者 左右出来的BLOCKS 就Gameover@H_301_109@
.gameOver();@H_301_109@
}@H_301_109@
return@H_301_109@ true@H_301_109@ ;@H_301_109@
301_109@
collisionPre : @H_301_109@ 301_109@
//console.log('collision pre');@H_301_109@
;@H_301_109@
301_109@
collisionPost : @H_301_109@ 301_109@
//console.log('collision post');@H_301_109@
301_109@
collisionSeparate : @H_301_109@ 301_109@
//console.log('collision separate');@H_301_109@
}@H_301_109@

猜你在找的Cocos2d-x相关文章