今年9月份跳槽从Android转向前端H5网页和H5小游戏开发,一开始本身学习用Canvas作了拼图、贪吃蛇大做战等小游戏,在公司边学习边用phaser写了个手势识别的小游戏,如今公司想尝试转型Egret白鹭引擎来开发H5,碰巧最近有个相似围住神经猫的H5小游戏项目,因此我就拿围住神经猫来学习学习练练手。html
其实几个月前,微信小游戏出现的时候,我就用本身学过一点点Egret,就照着官方的简单的demo下了一遍,大概了解了下,因此此次开发起来也是挺轻松的。前端
多是我本身学习能力比较好,因此入门比较快,加上Egret用TypeScript来开发,写法上有点相似于java和kotlin,而我之前就是作Android开发的,因此相对来讲上手很快,学习成本下降了不少。java
这个游戏的开发,前先后后共花了一天多的时间,图片素材和音频素材是在网上找的(有几个按钮仍是我本身用photoshop作的),仅用来学习。上午了解下,下午就直接上手开发,游戏中有什么写得很差的,还望大神指点指点~git
用Egret白鹭引擎写的围住神经猫H5游戏github
(pc端看的话,打开开发者模式,切换手机模式) game.codebear.cn/nervecat算法
github.com/CB-ysx/game…typescript
官网连接:www.egret.com/ 简单地说,白鹭引擎就是一套H5游戏开发解决方案,拥有如下产品,其中最核心的就是Egret Engine,其余的都是一些开发辅助工具。关于这些的介绍,仍是直接戳上方官网连接去看看吧。 数组
点击屏幕上的白色格子,将神经猫围起来,别让猫跑到上下左右四个边界上,最后猫无路可走就玩家赢了,若是猫跑到了边界上,猫就赢了。浏览器
下面是安装和项目建立步骤,具体可看官网教程 我用的是Mac osx系统,因此下面以mac软件安装为例。
直接下载mac版安装包安装,安装完成后打开Egret Launcher.app,出现如下界面,能够选择引擎版本下载,我这里下载了最新的5.2.11版本。
直接在Egret Launcher上面点击项目选项,建立项目
上面选项选好填好后,点击建立,而后点击项目这里,就能够用Egret Wing 3打开项目
用Egret Wing 3打开项目打开项目后,直接点击工具栏中的编译按钮:
至此,项目算是 新建完成也跑成功了,接下来就开始实现本身的游戏。
我有一个习惯,写项目总喜欢尽量地提取共用代码封装起来,因此每次写新项目都会先想好如何架构。因为第一次本身用白鹭写一个完整的游戏项目,场景跳转等实在不知道如何控制,因此看了一下视频,以为挺不错的,因此个人这个项目也是这样的架构:
因而项目结构就是这样:
┗ src
┣ common // 存放一些共用的类
┃ ┗ GameUtil.ts // 游戏工具类,获取图片、舞台宽高等
┣ game // 游戏相关
┃ ┣ bean // 一些bean,好比猫类、普通圆点
┃ ┃ ┣ Cat.ts // 猫(有坐标,状态,搜索路径方法等)
┃ ┃ ┣ GridNode.ts // 格子节点(x,y,状态等)
┃ ┃ ┣ Point.ts // 圆点(x,y)
┃ ┣ scene // 游戏场景
┃ ┃ ┣ BaseScene.ts // base场景,全部场景继承这个
┃ ┃ ┣ EndScene.ts // 结束场景
┃ ┃ ┣ PlayScene.ts // 游戏场景
┃ ┃ ┗ StartScene.ts // 开始场景
┃ ┣ GameData.ts // 存放游戏数据
┃ ┗ SceneControlloer.ts // 场景控制器
┣ LoadingUI.ts // 加载页
┣ Main.ts // 游戏主类(入口,全部场景都放在这个上面显示)
┗ Platform.ts // 可用于定义一些window上的对象,接口(好比微信登陆等),暂时用不到
复制代码
先按上面项目结构建好各个目录文件(内容暂时为空,完后再写)
删除Main.ts中createGameScene方法里面的内容、删除createBitmapByName方法(待会写到GameUtil类中)和startAnimation方法(不须要),删除以后的Main.ts是这样:
common/GameUtil.ts中写一个GameUtil类,添加getStageHeight(获取舞台高度)、getStageWidth(获取舞台宽度)、createBitmapByName(根据传入的名称建立Bitmap)、createMovieClipByName(根据传入的名称建立MovieClip)方法,实现以下:
修改LoadingUI.ts,让进度条居中显示
实现BaseScene类,继承egret.DisplayObjectContainer类,拥有initView方法,以后的全部场景继承自该类,只需实现initView方法便可
在Main.ts的createGameScene方法中添加背景图片,后面红色方框内两句是用于设置场景,初始化场景,暂时先不用理
写SceneController.ts类(场景控制),这是一个单例,有initGame(初始化游戏,显示开始游戏场景)、showPlayScene(显示游戏场景)、showLevelTip(开始游戏时提示关卡的动画)、showEndScene(显示结束场景)
首先写开始场景StartScene.ts,很简单,就一张图片和一个按钮,这里的GameUtil.bitmapToBtn()方法是给组件添加点击缩放效果(相似按钮),具体实现以下
在场景控制类中的initGame方法里面显示开始场景,代码和效果以下:
游戏场景PlayScene.ts,游戏场景有中间一些格子和一只猫,格子用二维数组存放,本身实现GridNode.ts继承自egret.Sprite表示格子节点并可添加到舞台上(有节点状态(可走、不可走、有猫)、在数组中的下标、在舞台上的坐标、格子的大小、格子的背景图片、游戏监听接口(PlayScene.ts实现这个接口,并在建立格子的时候传进来,用于通知用户点击哪一个格子、猫走哪一个格子、谁赢等等)),再来实现猫精灵Cat.ts继承egret.Sprite(有状态(有路可走、被围住可是还有空格能够走,只是走不出去了)、在数组中的下标、大小、背景、游戏监听接口、坐在的格子节点),同时猫还有寻找路径等方法(后面再说)。 在游戏控制类中,控制显示游戏场景
到这里,游戏场景基本完成,如今就来写最重要的一点,猫搜索路径的算法,分析一下,猫要跑出去,第一步就是要选择最短路径,很简单,用bfs算法搜索(只贴主要代码,其余能够到github查看):
优化算法 上面的算法等找出左右最短路径,但随机走的话,可能走的还不是最优路径,由于可能某些路径只有一条路,这种状况很容易被堵掉,那么须要再实现一个算法筛选出有多个终点的路径,由于上一步存放了全部路径须要走的第一个格子,那么算法能够经过判断第一步格子相同的路径的数量来选择,可能获得的就剩下一条路径(若是还有多条,那就能够随机选择一条路径了)
这还不是最优算法!!!这个算法有一种死路也会被选择(多个路径须要再第二步以后才会出现,可是第一步走完可能就会被堵死,这种状况我没有判断,有兴趣的能够本身去实现),另外,若是有其它更好的算法,欢迎评论区推荐~
结束场景EndScene.ts
以上写了游戏实现的步骤和部分代码,具体代码可前往github查看:github.com/CB-ysx/game… 这是我用egret写的第一个项目,可能某些地方写的不够好,但愿你们能指点指点~