cocos creator实战-(一)台球小游戏
body参数
1: 重力为0, 对物体进行分类,配置碰撞关系。
2: 球: 线性阻尼,角速度阻尼 为1;
3: 球碰撞器的弹性系数为1;
4: 球杆的能量系数: 18;
5: 球杆最小距离: 20, 最大距离 100;
6: this.body.applyLinearImpulse(方向, 世界坐标的质心, true);
7: 设计分辨率: 414x736
碰撞检测
1: onBeginContact: 碰撞开始被调用;
2: onEndContact: 碰撞结束被调用;
3: onPreSolve: 碰撞接触更新前调用;
4: onPostSolve: 碰撞接触更新后调用;
5: 参数:
contact 碰撞信息
selfCollider: 自己的碰撞器;
otherCollider: 撞到的谁
1、准备游戏场景
物品摆放、添加物理引擎配置、分组
2、实现脚本
场景控制脚本game_scene.js
//game_scene.js cc.Class({ extends: cc.Component, properties: { // foo: { // // ATTRIBUTES: // default: null, // The default value will be used only when the component attaching // // to a node for the first time // type: cc.SpriteFrame, // optional, default is typeof default // serializable: true, // optional, default is true // }, // bar: { // get () { // return this._bar; // }, // set (value) { // this._bar = value; // } // }, balls: { default: null, type: cc.Node }, white_ball: { type: cc.Node, default: null } }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { this.is_game_started = true; }, check_game_over: function() { if (!this.is_game_started) { return; } for (var i = 0; i < this.balls.childrenCount; i++) { var child = this.balls.children[i]; if (child.active === true) { return; } } this.is_game_started = false; this.scheduleOnce(this.restart_game.bind(this), 5); }, restart_game: function() { for (var i = 0; i < this.balls.childrenCount; i++) { var b = this.balls.children[i]; b.getComponent("Ball").reset(); } this.white_ball.getComponent("WhiteBall").reset(); this.is_game_started = true; }, update(dt) { this.check_game_over(); }, });
开启物理引擎脚本
// enbale_phy.js cc.Class({ extends: cc.Component, properties: { // foo: { // default: null, // The default value will be used only when the component attaching // to a node for the first time // url: cc.Texture2D, // optional, default is typeof default // serializable: true, // optional, default is true // visible: true, // optional, default is true // displayName: 'Foo', // optional // readonly: false, // optional, default is false // }, // ... is_debug: false, // 是否显示调试信息; // 重力加速度是一个向量, 有方向的,2D, Vec重力加速度的大小; gravity: cc.v2(0, -320), // 系统默认的 }, // use this for initialization onLoad: function() { // 游戏引擎的总控制 // cc.Director, cc.director 区别呢? // 大写的cc.Director是一个类, 小写cc.direcotr全局的实例 cc.director.getPhysicsManager().enabled = true; // 开启了物理引擎 // 独立的形状,打开一个调试区域,游戏图像的,逻辑区域; // 开始调试模式: if (this.is_debug) { // 开启调试信息 var Bits = cc.PhysicsManager.DrawBits; // 这个是我们要显示的类型 cc.director.getPhysicsManager().debugDrawFlags = Bits.e_jointBit | Bits.e_shapeBit; } else { // 关闭调试信息 cc.director.getPhysicsManager().debugDrawFlags = 0; } // 重力加速度的配置 cc.director.getPhysicsManager().gravity = this.gravity; }, // called every frame, uncomment this function to activate update callback // update: function (dt) { // }, });
普通球ball.js
与球袋的碰撞
cc.Class({ extends: cc.Component, properties: { }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { this.startX = this.node.x; this.startY = this.node.y; }, onBeginContact: function(contact, selfCollider, otherCollider) { if (otherCollider.node.groupIndex == 4) { // 与球带碰撞 this.node.active = false; return; } }, reset: function() { this.node.x = this.startX; this.node.y = this.startY; this.node.active = true; }, // update (dt) {}, });
白球white_ball.js
点击白球不松,球杆出现,向远处拖,球杆距离变远,移动鼠标,球杆围绕白球旋转,球杆与白球距离小于xx,球杆消失,放弃此次挥杆,否则出杆
白球碰撞
与球杆(球杆消失)
与其他球
与球带(隔1秒后把白球放回原处)
与边
//WhiteBall.js 白球脚本 cc.Class({ extends: cc.Component, properties: { // foo: { // // ATTRIBUTES: // default: null, // The default value will be used only when the component attaching // // to a node for the first time // type: cc.SpriteFrame, // optional, default is typeof default // serializable: true, // optional, default is true // }, // bar: { // get () { // return this._bar; // }, // set (value) { // this._bar = value; // } // }, cue: { type: cc.Node, default: null }, min_distance: 20, }, // LIFE-CYCLE CALLBACKS: onLoad() { this.node.on(cc.Node.EventType.TOUCH_START, this.on_touch_start.bind(this), this); this.node.on(cc.Node.EventType.TOUCH_MOVE, this.on_touch_move.bind(this), this); this.node.on(cc.Node.EventType.TOUCH_END, this.on_touch_end.bind(this), this); this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.on_touch_end.bind(this), this); }, start() { this.startX = this.node.x; this.startY = this.node.y; }, on_touch_start: function() { this.body = this.node.getComponent(cc.RigidBody); }, on_touch_move: function(e) { var w_pos = e.getLocation(); // 鼠标位置(世界坐标) var dst = this.node.parent.convertToNodeSpaceAR(w_pos); var node_pos = this.node.getPosition(); // 节点在父节点坐标系中的位置 var dir = dst.sub(node_pos); var len = dir.mag(); if (len <= this.min_distance) { this.cue.active = false; return; } this.cue.active = true; // 数学函数里角度是逆时针旋转,cocos里,物体的角度是顺时针旋转 var r = Math.atan2(dir.y, dir.x); var degree = r * 180 / Math.PI; degree = 360 - degree + 180; this.cue.rotation = degree; var half_widht = this.cue.width * 0.5; // 画图 dir.x / len = new_x / half_widht; var new_x = half_widht * dir.x / len; var new_y = half_widht * dir.y / len; dst.x += new_x; dst.y += new_y; this.cue.setPosition(dst); }, on_touch_end: function() { if (this.cue.active) { this.cue_comp = this.cue.getComponent("Cue"); this.cue_comp.shoot_at(this.node.getPosition()); } }, update(dt) {}, onBeginContact: function(contact, selfCollider, otherCollider) { if (otherCollider.node.groupIndex == 4) { // 与球带碰撞 this.node.active = false; this.scheduleOnce(function() { this.reset(); }.bind(this), 1); } }, reset: function() { this.node.x = this.startX; this.node.y = this.startY; this.node.active = true; } });
球杆cue.js
根据距离对球杆刚体施加冲量(世界坐标)
short_at
// Cue.js cc.Class({ extends: cc.Component, properties: { // foo: { // // ATTRIBUTES: // default: null, // The default value will be used only when the component attaching // // to a node for the first time // type: cc.SpriteFrame, // optional, default is typeof default // serializable: true, // optional, default is true // }, // bar: { // get () { // return this._bar; // }, // set (value) { // this._bar = value; // } // }, SHOOT_POWER: 18, }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { this.body = this.node.getComponent(cc.RigidBody); }, shoot_at: function(dst) { // 施加冲量 // 方向 当前位置--->目标 var dir = dst.sub(this.node.getPosition()); // 大小 var len = dir.mag(); var half_width = this.node.width * 0.5; var dis = len - half_width; var power_x = dis * this.SHOOT_POWER * dir.x / len; var power_y = dis * this.SHOOT_POWER * dir.y / len; // applyLinearImpulse(冲量大小向量,球杆的原点转为世界坐标,是否立刻唤醒true) this.body.applyLinearImpulse(cc.v2(power_x, power_y), this.node.convertToWorldSpaceAR(cc.v2(0, 0)), true); }, // update (dt) {}, onPreSolve: function(contact, selfCollider, otherCollider) { this.node.active = false; }, });
3、接入微信
微信配置
1: 下载微信开发者工具最新版本
https://mp.weixin.qq.com/debug/wxagame/dev/devtools/download.html?t=20171228
2: 注册和认证微信开发平台+公众平台;
3: 从公众平台小程序入口注册小程序/小游戏,选游戏类,目前还没有开放出来,生成一个APPID;
测试APPID: wx6ac3f5090a6b99c5
4: 开放平台绑定小程序/小游戏
打包发布小游戏
1: 打开”Cocos creator-->偏好设置”菜单,配置好微信开发工具的路径;
2: 打开 “项目-->项目设置” 裁剪好游戏引擎;
3: 项目构建发布:
需要注意的点
碰撞分组设置好
刚体的类型要区分好 static和dynamic