cocos_creator之Flabby Bird
游戏主要逻辑:
1,地板滚动
两块地板循环滚动,没啥好说的。
核心代码:
this.groundNode[0].x += Constant.GROUND_VX;this.groundNode[1].x += Constant.GROUND_VX;if (this.groundNode[0].x + this._width/2 < - this._size.width/2) {this.groundNode[0].x = this.groundNode[1].x + this._width - 5;}if (this.groundNode[1].x + this._width/2 < - this._size.width/2) {this.groundNode[1].x = this.groundNode[0].x + this._width - 5;}
2,小鸟坠落与弹跳
坠落的效果需要让小鸟在Y轴负方向有一个加速度,即单位时间类的偏移量还有一个增量。弹跳只需要让原本为负的偏移值变为正。
在onLoad方法中:
this.velocity = 0; //初始下降速度为零
在onDrop方法中:
this.node.y += this.velocity ;
this.velocity -= this.gravity;
3,管道生成逻辑
管道的定位需要五个参数
pipeMaxOffsetY //Y轴最大偏移量
pipeMinGap //管道最小间隙
pipeMaxGap //管道最大间隙
pipeSpawnInterval //管道生成时间间隔
pipeSpawnOffsetX //管道屏幕外生成偏移量
核心代码:
spawnPipes: function() {// 从管道预制(上端),生成管道实例var pipeUp = cc.instantiate(this.pipePrefabs[Constant.PIPE_UP]);// 定义为上端类型pipeUp.getComponent('Pipe').init(Constant.PIPE_UP);// 获取管道的高度(上端与上端的相同)var pipeHeight = pipeUp.getComponent('cc.Sprite').spriteFrame.getRect().height;// 设置上端管道的横向起始位置(屏幕右端另加一定偏移)pipeUp.x = this.size.width / 2 + this.pipeSpawnOffsetX;// 设置上端管道的纵向起始位置(随机取偏移量)pipeUp.y = Math.floor(Math.random() * this.pipeMaxOffsetY) + pipeHeight/2;// 下端生成逻辑基本与上端相同var pipeDown = cc.instantiate(this.pipePrefabs[Constant.PIPE_DOWN]);pipeDown.getComponent('Pipe').init(Constant.PIPE_DOWN);pipeDown.x = this.size.width / 2 + this.pipeSpawnOffsetX;// 随机生成上端与下端管道之间的间隙值(pipeMinGap与pipeMaxGap之间)var pipeGap = Math.floor(Math.random() * (this.pipeMaxGap - this.pipeMinGap)) + this.pipeMinGap + 20;pipeDown.y = pipeUp.y - pipeGap - pipeHeight;// 添加管道到pipes节点上this.pipesNode.addChild(pipeUp);this.pipesNode.addChild(pipeDown);// 添加管道到管道数组中this.pipes.push(pipeUp);this.pipes.push(pipeDown);},
// 超出屏幕范围的管道,从数组中移除,并从节点上删除if ( curPipeNode.x < -(this.size.width/2 + Constant.PIPE_SPAWN_OFFSET_X)) {this.pipes.splice(i, 1);this.pipesNode.removeChild(curPipeNode, true);}
4,死亡逻辑
撞地死亡:小鸟包围盒下边界Y坐标与地板上表面Y坐标对比撞天花板死亡:小鸟包围盒上边界Y坐标与屏幕上边界Y坐标对比撞管道死亡:小鸟包围盒与管道包围盒坐标碰撞检
核心代码:// 获取小鸟的包围盒var birdBox = this.bird.node.getBoundingBox();// 获取当前管道的包围盒var pipeBox = curPipeNode.getBoundingBox();var birdRect = new cc.Rect(birdBox.x, birdBox.y,birdBox.width, birdBox.height);var pipeRect = new cc.Rect(pipeBox.x, pipeBox.y,pipeBox.width, pipeBox.height);// 根据两个矩形范围判断是否相交if (pipeRect.intersects(birdRect)) {this.onGameOver();return;}
// 小鸟触地,则死亡if (this.bird.node.y < this.groundTop || (this.bird.node.y > (this.size.height/2 + this.bird.node.height/2))) {this.onGameOver();}
5,计分逻辑
通过管道加分:通关管道判断为小鸟X坐标是否超过管道的X坐标。加分的辅助判断条件,小鸟的通过状态是否及时改变,否则通过以后会不停加分。小鸟通过的管道时只能以上或下其中一根管道的坐标作为参考标准,否则每通过一组管道会加两分。最高纪录分:游戏开始前显示,如果此前纪录为0则不显示。游戏结束时检查是否有新纪录产生,有则修改,无则保持。
核心代码:
// 获取当前管道对象var curPipe = curPipeNode.getComponent('Pipe');// 判断小鸟是否顺利通过管道,是则加分if ( curPipeNode.x < this.bird.node.x && curPipe.isPassed === false && curPipe.type === Constant.PIPE_UP) {curPipe.isPassed = true;this.addScore();}
var Storage = {getHighScore: function() {var score = cc.sys.localStorage.getItem('HighScore') || 0;return parseInt(score);},setHighScore: function(score) {cc.sys.localStorage.setItem('HighScore', score);}
};module.exports = Storage;
涉及到cocos2D_JS知识点:
,属性成员定义时的类型说明
groundImag: cc.Sprite, //精灵节点类型groundNode: [cc.Node], //节点数组类型AnimName: ' ', // 字符串类型gravity: 0.5 //数值类型pipesPrefabs: [cc.Prefab], //预制件类型gameOverText: cc.Label, //文本类型jumpAudio:{default: null,url: cc.AudioClip //音频文件}
,关闭节点显示
// 关闭菜单节点显示this.gameMenu.active = false;
,播放动画
// 获取本身的cc.Animation对象,并播放AnimName动画
this.getComponent(cc.Animation).play(this.AnimName);
,播放音效,单次
// 播放弹跳音效
cc.audioEngine.playEffect(this.jumpAudio, false);
、添加计时器
this.schedule(this.函数名, 时间间隔) //标准格式
this.schedule(this.spawnPipes, this.pipeSpawnInterval); //示例
、获取屏幕尺寸
// 获取屏幕尺寸
this._size = cc.winSize;
、获取精灵节点尺寸
// 获取地板图片的宽度
this._width = this.groundImg.spriteFrame.getRect().width;
、往节点添加组件,往数组添加元素
var pipeUp = cc.instantiate(this.pipePrefabs[Constant.PIPE_UP]);
this.pipesNode.addChild(pipeUp);
、往数组添加和删除元素
this.pipes.push(pipeUp);
this.pipes.splice(i, 1);
this.pipesNode.removeChild(curPipeNode, true);
、引用和创建对象,并使用对象
const Bird = require('Bird'); //写在当前类的最上面// 小鸟对象bird: Bird, //写在propertity中this.bird.OnDrop(); // 引用类的成员函数调用
、本地数据配置
//方便参数集中管理
var Constant = cc.Enum({// 地板移动时间间隔GROUND_MOVE_INTERVAL: 0.05,// 单位时间地板移动速度GROUND_VX: -5,// 上端管道序号为0PIPE_UP: 0,// 下端管道序号为1PIPE_DOWN: 1,// 游戏失败文字GAMEOVER_TXT: 'GAME OVER',// 最高分文字HIGHSCORE_TXT: 'HighScore: ',
});module.exports = Constant; //没有这一句将无法再外部引用
、设置点击事件
setInputControl: function() {var self = this;cc.eventManager.addListener({event: cc.EventListener.TOUCH_ONE_BY_ONE,onTouchBegan: self._onTouchBegan.bind(self)}, self.node);},_onTouchBegan: function( touch, event ) {if ( this.isGameOver === true )return;this.bird.onJump();},
项目中cocos creator 反馈出来的常见错误及原因:
1,游戏运行按钮不可点,无法进入浏览器界面。说明角码存在编译器无法通过的错误,通常会有明显的红叉提示。
2,脚本丢失,说明对应的脚本中存在错误。比如,类型定义是出现书写错误(如将,cc.Node,写成了cc.node)
3,其他组件丢失,通常发生在组件发生纠错修改之后。
cocos_creator之Flabby Bird相关推荐
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- android游戏之flabby bird(上)
1.写在前面的话: 一次无意中在csdn上找到一个资源<android高仿flappy bird源码>,下载下来运行一下,效果非常不错,再进去一看代码,乖乖,好东西啊,整个游戏的框架非常的 ...
- Android SurfaceView实战 带你玩转flabby bird (上)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...
- 唐宇迪强化学习笔记之项目实战(flabby bird)
强化学习: 学习系统没有像很多其它形式的机器学习方法一样被告知应该做出什么行为,必须在尝试了之后才能发现哪些行为会导致奖励的最大化,当前的行为可能不仅仅会影响即时奖励,还会影响下一步的奖励以及后续的所 ...
- Android 模仿flabby bird游戏开发
一.示意图: 1)开始画面: 2)游戏中画面: 3)结束画面: 二.分析: 1.游戏中的每个元素都可封装成对象, 1)开始按钮与结束按钮可封装成GameButton对象: 属性有:有坐标x,y:有原图 ...
- Android SurfaceView实战 带你玩转flabby bird
分析 仔细观察游戏,需要绘制的有:背景.地板.鸟.管道.分数: 游戏开始时: 地板给人一种想左移动的感觉: 管道与地板同样的速度向左移动: 鸟默认下落: 当用户touch屏幕时,鸟上升一段距离后,下落 ...
- Android之SurfaceView
SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢? 因为它和View有一个很大的区别,View在UI线程去更新自己:而SurfaceView则在一个 ...
- 搜集整理的一些博客导航
简介:第一次在CSDN上发表博客,将自己关注或者看过的一些博客整理了一下,其中包含了鸿神和郭神的全部博客,包括两位大神微信公众号推荐的博客,另外还有一些安卓开发社区的博客,后续每天都会更新这个导航,希 ...
- Android 常用开发功能 博客导航
转载地址:http://blog.csdn.net/ciqing123/article/details/52931663?locationNum=16&fps=1 简介:第一次在CSDN上发表 ...
最新文章
- Python-高阶函数
- Maven构建Artifact时,不会创建空目录
- 【渝粤教育】电大中专电子商务网站建设与维护 (21)作业 题库
- 组合问题 已知组合数_组合和问题
- 求子数组的最大和要求O(n)
- flink 1.9.0 编译:flink-fs-hadoop-shaded 找不到
- 对java:comp/env的研究(转)
- 后续:为LAMP添加XCache加速
- json数据格式在javascript的读取与c#后台的赋值格式
- C# 提取字符串中的数字,去除字符串中的重复字符逗号分隔
- (转) hash 函数及其重要性
- 算法精解 c语言 源码,算法精解七(C语言版)
- 查看计算机上硬盘的大小,怎么看硬盘的缓存信息?电脑硬盘缓存大小查看方法图解...
- 十四、数字图像处理之图像压缩
- requests的基本使用以及爬虫的基本介绍:QQ机器人制作基础
- 微信小程序剪切图片的功能
- 使用 OpenCV-Python 识别答题卡判卷
- chrome 导入html书签,怎么把谷歌浏览器书签导出来?怎么将书签导入到别的浏览器中?...
- 彻底解决WPS右键没有新建文件的问题
- 高调华美戒指 流动于指间的时尚
热门文章
- 汽车环境感知技术详解【 持续更新ing 】— 传感器概述与基本特性
- 公共计算机房电气设计规范,计算机房工程电气设计规范及要求(参考)
- 树立行业标杆 锐捷开启云桌面新“V”时代
- HTML5期末大作业:游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
- 干货请收好:终于有人把用户画像的流程、方法讲明白了
- 顺风车APP顺风车小程序知识
- 博诺杯工业机器人比赛2019_涿职·喜报丨涿州职教中心电气自动化专业部学生喜获“博诺杯”工业机器人维修调试与技术应用赛项二、三等奖...
- 年中总结|男生如何学习服装搭配,提升衣着品味?
- python输入城市找省份_Python入门教程(1)
- 数据产品经理一天日程曝光,网友表示:是我本人!