标签: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