标签:c++ cocos2d-x 游戏 cocos2d-js 开发人员
我们先介绍轻量级的物理引擎——Chipmunk。Chipmunk物理引擎,由Howling Moon Software的Scott Lebcke开发,用纯C编写。Chipmunk的下载地址是http://code.google.com/p/chipmunk-physics/,技术论坛是http://chipmunk-physics.net/forum。var SPRITE_WIDTH = 64; ①
var SPRITE_HEIGHT = 64; ②
var DEBUG_NODE_SHOW = true; ③
var HelloWorldLayer = cc.Layer.extend({ ④
space: null, ⑤
ctor: function () {
this._super();
this.initPhysics(); ⑥
this.scheduleUpdate(); ⑦
}
… …
});上述第①行代码是定义精灵宽度常量SPRITE_WIDTH,第②行代码是定义精灵高度常量SPRITE_HEIGHT,第③行代码是定义是否绘制调试遮罩开关常量DEBUG_NODE_SHOW。 onEnter: function () {
this._super();
cc.log("onEnter");
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
onTouchBegan: this.onTouchBegan
}, this);
},
onTouchBegan: function (touch, event) {
cc.log("onTouchBegan");
var target = event.getCurrentTarget();
var location = touch.getLocation();
target.addNewSpriteAtPosition(location); ①
return false;
},
onExit: function () {
this._super();
cc.log("onExit");
cc.eventManager.removeListeners(cc.EventListener.TOUCH_ONE_BY_ONE);
}上述代码第①行是调用当前层的addNewSpriteAtPosition函数实现是在触摸点添加精灵对象,其中target是当前层对象,注意这里不能使用this。 initPhysics: function () {
var winSize = cc.director.getWinSize();
this.space = new cp.Space(); ①
this.setupDebugNode(); ②
// 设置重力
this.space.gravity = cp.v(0, -100); ③
var staticBody = this.space.staticBody; ④
// 设置空间边界
var walls = [ new cp.SegmentShape(staticBody, cp.v(0, 0),
cp.v(winSize.width, 0), 0), ⑤
new cp.SegmentShape(staticBody, cp.v(0, winSize.height),
cp.v(winSize.width, winSize.height), 0), ⑥
new cp.SegmentShape(staticBody, cp.v(0, 0),
cp.v(0, winSize.height), 0), ⑦
new cp.SegmentShape(staticBody, cp.v(winSize.width, 0),
cp.v(winSize.width, winSize.height), 0) ⑧
];
for (var i = 0; i < walls.length; i++) {
var shape = walls[i];
shape.setElasticity(1); ⑨
shape.setFriction(1); ⑩
this.space.addStaticShape(shape); ?
}
}代码第①行new cp.Space()是创建物理空间。第②行代码this.setupDebugNode()是设置调试Node对象。第③行代码this.space.gravity = cp.v(0, -100)是为空间设置重力,cp.v(0, -100)是创建一个cp.v结构体,cp.v是Chipmunk中的二维矢量类型,参数(0, -100)表示只有重力作用物体,-100表示沿着y轴向下,其中的100也是一个经验值。 addNewSpriteAtPosition: function (p) {
cc.log("addNewSpriteAtPosition");
var body = new cp.Body(1, cp.momentForBox(1, SPRITE_WIDTH, SPRITE_HEIGHT)); ①
body.setPos(p); ②
this.space.addBody(body); ③
var shape = new cp.BoxShape(body, SPRITE_WIDTH, SPRITE_HEIGHT); ④
shape.setElasticity(0.5);
shape.setFriction(0.5);
this.space.addShape(shape); ⑤
//创建物理引擎精灵对象
var sprite = new cc.PhysicsSprite(res.BoxA2_png); ⑥
sprite.setBody(body); ⑦
sprite.setPosition(cc.p(p.x, p.y));
this.addChild(sprite);
}上述代码第①行代码是使用cp.Body构造函数创建一个动态物体,构造函数第一个参数质量,这里的1是一个经验值,我们可以通过改变它的大小而改变物体的物理特性。第二参数惯性值,它决定了物体运动时受到的阻力,设置惯性值使用cp.momentForBox函数。cp.momentForBox函数是计算多边形的惯性值,它的第一个参数是惯性力矩[ 惯性力矩,也叫“MOI”,是Moment Of Inertia的缩写,惯性力矩是用来判断一个物体在受到力矩作用时,容不容易绕着中心轴转动的数值。——引自于百度百科 http://www.baike.com/wiki/惯性力矩],这里的1也是一个经验值,第二个参数是设置物体的宽度,第三个参数是设置物体的高度,类似的函数还有很多,如cp.momentForBox、cp.momentForSegment和cp.momentForCircle等。update: function (dt) {
var timeStep = 0.03; ①
this.space.step(timeStep); ②
}上述代码第①行的timeStep表示自上一次循环过去的时间,它影响到物体本次循环将要移动的距离和旋转的角度。我们不建议使用update 的dt参数作为timeStep,因为dt时间是上下浮动的,所以使用dt作为timeStep时间,物体的运动速度就不稳定。我们建议使用固定的timeStep时间。{
"project_type": "javascript",
"debugMode" : 1,
"showFPS" : true,
"frameRate" : 60,
"id" : "gameCanvas",
"renderMode" : 2,
"engineDir":"frameworks/cocos2d-html5",
"modules" : ["cocos2d", "external"], ①
"jsList" : [
"src/resource.js",
"src/app.js"
]
}我们在第①行"modules"配置中添加external模块,external模块包含了chipmunk等子模块,这些模块的定义大家可以打开<工程目录>\frameworks\cocos2d-html5\ moduleConfig.json,这里Cocos2d-JS的所有模块,以及每个模块所包含的js文件。
京东:http://item.
标签:c++ cocos2d-x 游戏 cocos2d-js 开发人员
原文地址:http://blog.csdn.net/tonny_guan/article/details/44976543