本文来自网易云社区

作者:王鸽

不知你是否还记得当年风靡一时的2048这个游戏,一个简单而又不简单的游戏,总会让你在空闲时间玩上一会儿。

在这篇文章里,我们将使用开源的H5框架——Phaser来重现这个游戏。这里你可以了解到游戏内的状态管理、Sprite元件对象等,以及如何使用Preload、Create等方法。

H5游戏框架众多,为何选择它?

由于近几年H5的火热,H5游戏框架如雨后春笋般出现,甚至有很多定位不是游戏开发的框架都被归到这个范畴中。那么为什么选择Phaser?以下是我选择它的原因:

  • 支持原生JS。

  • 可以方便地在Canvas和WebGL之间切换。

  • 定位明确,专注H5游戏开发。

  • 完善的文档及示例。

  • 持续更新,目前Phaser 3正在开发。

2048游戏的最终呈现效果如下

开发准备

首先访问Phaser官网http://www.phaser.io,下载JavaScript版本的Phaser,并搭建好项目结构

项目文件结构如下:

在index.html中引入相关js文件,定义一个div作为phaser生成canvas的父容器

<!DOCTYPE html>
<head> <meta charset="UTF-8" /><title>2048</title><script src="js/phaser.min.js"></script><script src="js/Menu.js"></script><script src="js/Game.js"></script><script src="js/index.js"></script><style>body {margin: 0;padding: 0;}canvas {margin: 0 auto;}.game {position: absolute;width: 100%;height: 100%;}</style>
</head>
<body><div id="game" >"game"></div>
</body>

游戏是如何进行的

在html文件中我们已经引入了Phaser库,这使我们拥有了一个名为Phaser的全局对象,通过这个对象,我们可以访问Phaser库中哪些用于构建游戏的方法和函数。

现在我们使用Phaser对象来创建一个游戏实例,这个对象用来代表整个游戏,我们会为他添加不同的状态。

index.js,在其中创建游戏实例,注册各个游戏状态以及启动游戏。

//实例化游戏对象,参数为宽、高、渲染方式,父容器
window.game = new Phaser.Game(240, 400, Phaser.CANVAS, 'game');//添加状态,参数为状态应用的Key值,状态所包含的对象
game.state.add('Menu', Menu);
game.state.add('Game', Game);//状态切换 开始游戏
game.state.start('Menu');

Phaser中的“状态(state)”管理使游戏的场景切换变得非常容易,此处的“状态”可以看理解为不同的游戏界面,2048这个游戏比较简单,只需要首页和游戏内两个界面即可。

  • 主页状态,由menu.js处理,用于加载游戏资源并显示游戏开始界面,点击开始按钮后切换到游戏状态并且开始游戏。

  • 游戏状态,由game.js处理,用于显示游戏界面、控制游戏逻辑,游戏结束后显示分数面板

接下来初始化菜单状态对象(Menu),在Menu.js中定义一个新对象Menu并为它添加函数。状态启动时,首先会调用对象内的preload函数,通常加载游戏所需资源会在这一步进行;加载完成后,调用create函数,初始化游戏界面以及逻辑对象等等。

var Menu = {preload: function () {//加载图像,参数为创建元件时所使用的Key值,文件路径game.load.image('background', 'assets/bg.png');game.load.image('btnStart', 'assets/btn-start.png');game.load.image('btnRestart', 'assets/btn-restart.png');game.load.image('logo', 'assets/logo.png');game.load.image('btnTryagain', 'assets/btn-tryagain.png');},create: function () {//创建重复元件,可以重复图片 一般用于重复纹理的底图等game.add.tileSprite(0, 0, game.width, game.height, 'background');//创建图片,此处是游戏logo,参数为x,y,加载图片是所保存的Key值var logo = game.add.image(0, 0, 'logo');logo.reset((game.width - logo.width) / 2, (game.height - logo.height) / 2 - 50);//开始按钮用来启动游戏var startBtn =  game.add.sprite(0, 0, 'btnStart');startBtn.reset((game.width - startBtn.width) / 2, (game.height - startBtn.height) / 2 + 100);//开启元件点击监听,并添加监听事件startBtn.inputEnabled = true;startBtn.events.onInputDown.add(this.startGame);},startGame: function () {//转换状态至游戏界面game.state.start('Game');}
};

至此,启动界面已经完成了,开启本地web服务器后,在浏览器中打开index.html,就可以看到游戏的启动界面了。

接着在Game.js开始处理游戏的界面以及逻辑

var Game = {create: function () {//添加背景game.add.tileSprite(0, 0, game.width, game.height, 'background');//变量用于保存游戏分数this.score = 0;this.best = 0;//文字样式,font:字体字号等 fill:颜色var titleStyle = { font: "bold 12px Arial", fill: "#4DB3B3", boundsAlignH: "center" };var scoreStyle = { font: "bold 20px Arial", fill: "#FFFFFF", boundsAlignH: "center" };var scoreSprite = game.add.sprite(10, 10);//使用graphics绘制图形作为界面UIvar scoreGraphics = game.add.graphics(0, 0);scoreGraphics.lineStyle(5, 0xA1C5C5);scoreGraphics.beginFill(0x308C8C);//绘制一个带圆角的矩形scoreGraphics.drawRoundedRect(0, 0, 70, 50, 10);scoreGraphics.endFill();//把图形添加到父容器上,便于整体调整位置等scoreSprite.addChild(scoreGraphics);//添加文字 参数为x,y,文字内容,文字样式var scoreTitle = game.add.text(0, 5, "SCORE", titleStyle);scoreTitle.setTextBounds(0, 0, 70, 50);//把文字添加到父容器上,便于整体调整位置等scoreSprite.addChild(scoreTitle);this.scoreText = game.add.text(0, 20, this.score, scoreStyle);this.scoreText.setTextBounds(0, 0, 70, 50);scoreSprite.addChild(this.scoreText);......//添加键盘方向件的监听以及监听事件var up = this.game.input.keyboard.addKey(Phaser.Keyboard.UP);up.onDown.add(function () {...});var down = this.game.input.keyboard.addKey(Phaser.Keyboard.DOWN);down.onDown.add(function () {...});var left = this.game.input.keyboard.addKey(Phaser.Keyboard.LEFT);left.onDown.add(function () {...});var right = this.game.input.keyboard.addKey(Phaser.Keyboard.RIGHT);right.onDown.add(function () {...});......//获取手势滑动的X轴差值和Y轴差值 用于计算滑动方向var deltaX = this.game.input.activePointer.position.x - this.game.input.activePointer.positionDown.x;var deltaY = this.game.input.activePointer.position.y - this.game.input.activePointer.positionDown.y;......

2048这个游戏的规则非常简单,开发的思路也非常明确,维护一个4*4的数组,每次触发移动事件时遍历数组,进行方向上的叠加判断,然后在数组中寻找空格,随机生成新的数字,如果没有则游戏结束。相关的一些开发思路以及算法优化在此也就不详述了,大家可以自行查阅。

资料推荐

虽然这个游戏非常简单,但通过这个项目,可以了解到Phaser的多个方面。如果对此感兴趣,可以再深入接触以下资料:

  • Phaser官方文档

  • Phaser在线编辑器

  • Phaer游戏实例展示

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区。

相关文章:
【推荐】 常用数据清洗方法大盘点
【推荐】 帝都的凛冬

使用Phaser开发你的第一个H5游戏(一)相关推荐

  1. 用 Python 做一个 H5 游戏机器人

    原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...

  2. 使用虚幻5开发你的第一个3d游戏

    实战是学习最快的方法,今天就带大家使用虚幻5来开发自己的第一款3d游戏. 如何下载安装虚幻引擎的话网上应该有很多教程,我就不介绍哈. 一.新建项目 二.新建关卡 新建完以后保存,命名为MainLeve ...

  3. 一个H5游戏的开发(二)

    websocket数据序列化 数据通信时需要协商好一种数据格式方便前后端读取和发送,这里我认为2种选择就够了.如果公司或个人开发没有相关的自定义数据结构之类工具积累,那么直接选择Protocol Bu ...

  4. 快速开发一个h5游戏

    主要就是三个步骤: 选择一个引擎:pixi,实际上就一个js库 搭建一个简易的本地服务器,只是为了能够以http形式访问,越简单越好 参考文章:快速搭建一个本地服务器 编写一个demo <!do ...

  5. 利用micro:bit开发板工具写一个小游戏

    1.micro:bit的网址 https://makecode.microbit.org/ 2.传球 项目要求: 程序开始时,一个小球( led 小灯)从屏幕上方移动到屏幕中间当按钮 A 按下时, 小 ...

  6. H5游戏开发的架构总结(一) 客户端

    [客户端] 1.关于游戏引擎 在15年3月开始准备做h5游戏的时候,首先遇到的问题就是引擎选型的问题. 当时市面上的2d引擎主要有3个:白鹭egret,layabox和cocos2d-js. 一方面, ...

  7. 为什么选择H5游戏开发定制?

    为什么选择H5游戏开发定制? 随着微信H5游戏推广带来的显著效果,越来越多的商家已经加入到游戏营销的队伍中来, 对H5小游戏有了解的商家都知道,[模板游戏]的价格往往低于[定制游戏]的价格,可是为什么 ...

  8. H5游戏引擎Layabox融资成功,A轮进帐1亿!

    6月15日下午,Layabox引擎CFO王晖在微信朋友圈低调公布了A轮成功融资1亿元的消息.朋友圈原文如下: "自去年底至今年5月,Layabox的A轮分段融资已经结束,累计进帐现金近1亿元 ...

  9. H5游戏平台创业怎么样?能赚钱吗?

    据了解,H5游戏市场规模巨大,用户基础雄厚,已经成为继手游之后的第四大新蓝海.月流水破千万的产品不断涌现,技术创新将行业推向了一个新的高度.从益智类休闲类游戏过渡到中.重度H5游戏的市场份额越来越大, ...

最新文章

  1. ios 如何在cell中去掉_IOS之表视图单元格删除、移动及插入
  2. 病毒的灵魂拷问(绝对原创)
  3. Razor视图出现重复的解决方法
  4. 学习jQuery的on事件
  5. 日期参数format格式详细用法
  6. AI开发者大会之AI学习与进阶实践:2020年7月3日《如何转型搞AI?》、《基于AI行业价值的AI学习与进阶路径》、《自动机器学习与前沿AI开源项目》、《使用TensorFlow实现经典模型》
  7. VS中使用NuGet安装依赖时提示:无法安装程序包“xxx”。你正在尝试将此程序包安装到目标为“.NETFramework,Version=v4.5”的项目中
  8. Codeforces 757B - Bash's Big Day(分解因子+hashing)
  9. Androidstudio设置Ctrl+W关闭当前编辑的页面窗口
  10. 实验3-2 计算符号函数的值 (10 分)
  11. Lintcode57 3Sum solution 题解
  12. 聚合搜索V3.0泛解析泛目录站群源码 MIP自动推送 SEO功能SEO源码
  13. Python 类的知识点
  14. 三级等保 关闭111端口
  15. 点位定位打开活动,到了某个点位后才可以打卡的活动,让打卡更具体,overflow: visible默认情况下,溢出是可见的
  16. 房讯房屋租赁管理软件新版上线 专为房东朋友定制
  17. error:LNK2005 已经在*.obj文件中定义的解决办法
  18. CentOS下配置Samba实现文件夹共享
  19. ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解
  20. JavaScript-读 You Dont Know JS,this到底是什么

热门文章

  1. Linux — 系统账号及权限管理
  2. 【java-调用摄像头进行截屏与保存-实例篇1-0716】
  3. 机器视觉工程师应该知道的23个工业镜头专业术语
  4. Day 32 - 透过手机呼叫 Amazon API Gateway 上传图片到 S3
  5. 易点易动助力达达-京东到家打通全集团固定资产数字化管理全链条
  6. MySQL-HA高可用
  7. 移动端Click300毫秒点击延迟 解决办法
  8. 专访马云:面对股东的期待,未来如何保持阿里继续增长?
  9. 《编译原理-龙书》练习第4章
  10. 软件项目“免坑”指南