// Create the canvas
var canvas = document.createElement("canvas")
var ctx = canvas.getContext("2d")
canvas.width = 512
canvas.height = 480
document.body.appendChild(canvas)
首先我们需要创建一张画布作为游戏的舞台。这里通过JS代码而不是直接在HTML里写一个<canvas>元素目的是要说明代码创建也是很方便的。有了画布后就可以获得它的上下文来进行绘图了。然后我们还设置了画布大小,最后将其添加到页面上。
准备图片
// 背景图片
var bgReady = false
var bgImage = new Image()
bgImage.onload = function () {
bgReady = true
}
bgImage.src = "images/background.png"
游戏嘛少不了图片的,所以我们先加载一些图片先。简便起见,这里仅创建简单的图片对象,而不是专门写一个类或者Helper来做图片加载。bgReady这个变量用来标识图片是否已经加载完成从而可以放心地使用了,因为如果在图片加载未完成情况下进行绘制是会报错的。
整个游戏中需要用到的三张图片:背景,英雄及怪物我们都用上面的方法来处理。
游戏对象
// 游戏对象
var hero = {
speed: 256, // 每秒移动的像素
x: 0,
y: 0
}
var monster = {
x: 0,
y: 0
}
var monstersCaught = 0
现在定义一些对象将在后面用到。我们的英雄有一个speed属性用来控制他每秒移动多少像素。怪物游戏过程中不会移动,所以只有坐标属性就够了。monstersCaught则用来存储怪物被捉住的次数。
处理用户的输入
// 处理按键
var keysDown = {}
addEventListener("keydown", function (e) {
keysDown[e.keyCode] = true
}, false)
addEventListener("keyup", function (e) {
delete keysDown[e.keyCode]
}, false)
现在开始处理用户的输入(对初次接触游戏开发的前端同学来说,这部分开始可能就需要一些脑力了)。在前端开发中,一般是用户触发了点击事件然后才去执行动画或发起异步请求之类的,但这里我们希望游戏的逻辑能够更加紧凑同时又要及时响应输入。所以我们就把用户的输入先保存下来而不是立即响应。
为此,我们用keysDown这个对象来保存用户按下的键值(keyCode),如果按下的键值在这个对象里,那么我们就做相应处理。
开始一轮游戏
// 当用户抓住一只怪物后开始新一轮游戏
var reset = function () {
hero.x = canvas.width / 2
hero.y = canvas.height / 2
// 将新的怪物随机放置到界面上
monster.x = 32 + (Math.random() * (canvas.width - 64))
monster.y = 32 + (Math.random() * (canvas.height - 64))
}
reset方法用于开始新一轮和游戏,在这个方法里我们将英雄放回画布中心同时将怪物放到一个随机的地方。
更新对象
// 更新游戏对象的属性
var update = function (modifier) {
if (38 in keysDown) { // 用户按的是↑
hero.y -= hero.speed * modifier
}
if (40 in keysDown) { // 用户按的是↓
hero.y += hero.speed * modifier
}
if (37 in keysDown) { // 用户按的是←
hero.x -= hero.speed * modifier
}
if (39 in keysDown) { // 用户按的是→
hero.x += hero.speed * modifier
}
// 英雄与怪物碰到了么?
if (
hero.x <= (monster.x + 32)
&&monster.x <= (hero.x + 32)
&&hero.y <= (monster.y + 32)
&&monster.y <= (hero.y + 32)
) {
++monstersCaught
reset()
}
}
这就是游戏中用于更新画面的update函数,会被规律地重复调用。首先它负责检查用户当前按住的是中方向键,然后将英雄往相应方向移动。
有点费脑力的或许是这个传入的modifier 变量。你可以在main 方法里看到它的来源,但这里还是有必要详细解释一下。它是基于1开始且随时间变化的一个因子。例如1秒过去了,它的值就是1,英雄的速度将会乘以1,也就是每秒移动256像素;如果半秒钟则它的值为0.5,英雄的速度就乘以0.5也就是说这半秒内英雄以正常速度一半的速度移动。理论上说因为这个update 方法被调用的非常快且频繁,所以modifier的值会很小,但有了这一因子后,不管我们的代码跑得快慢,都能够保证英雄的移动速度是恒定的。
现在英雄的移动已经是基于用户的输入了,接下来该检查移动过程中所触发的事件了,也就是英雄与怪物相遇。这就是本游戏的胜利点,monstersCaught +1然后重新开始新一轮。
渲染物体
// 画出所有物体
var render = function () {
if (bgReady) {
ctx.drawImage(bgImage, 0, 0)
}
if (heroReady) {
ctx.drawImage(heroImage, hero.x, hero.y)
}
if (monsterReady) {
ctx.drawImage(monsterImage, monster.x, monster.y)
}
// 计分
ctx.fillStyle = "rgb(250, 250, 250)"
ctx.font = "24px Helvetica"
ctx.textAlign = "left"
ctx.textBaseline = "top"
ctx.fillText("Monsterrs caught: " + monstersCaught, 32, 32)
}
之前的工作都是枯燥的,直到你把所有东西画出来之后。首先当然是把背景图画出来。然后如法炮制将英雄和怪物也画出来。这个过程中的顺序是有讲究的,因为后画的物体会覆盖之前的物体。
这之后我们改变了一下Canvas的绘图上下文的样式并调用fillText来绘制文字,也就是记分板那一部分。本游戏没有其他复杂的动画效果和打斗场面,绘制部分大功告成!
主循环函数
// 游戏主函数
var main = function () {
var now = Date.now()
var delta = now - then
update(delta / 1000)
render()
then = now
// 立即调用主函数
requestAnimationFrame(main)
}
上面的主函数控制了整个游戏的流程。先是拿到当前的时间用来计算时间差(距离上次主函数被调用时过了多少毫秒)。得到modifier后除以1000(也就是1秒中的毫秒数)再传入update函数。最后调用render 函数并且将本次的时间保存下来。
关于游戏中循环更新画面的讨论可参见「Onslaught! Arena Case Study」。
关于循环的进一步解释
// requestAnimationFrame 的浏览器兼容性处理
var w = window
requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame
如果你不是完全理解上面的代码也没关系,我只是觉得拿出来解释一下总是极好的
为了循环地调用main函数,本游戏之前用的是setInterval。但现今已经有了更好的方法那就是requestAnimationFrame。使用新方法就不得不考虑浏览器兼容性。上面的垫片就是出于这样的考虑,它是Paul Irish 博客原版的一个简化版本。
启动游戏!
// 少年,开始游戏吧!
var then = Date.now()
reset()
main()
总算完成了,这是本游戏最后一段代码了。先是设置一个初始的时间变量then用于首先运行main函数使用。然后调用 reset 函数来开始新一轮游戏(如果你还记得的话,这个函数的作用是将英雄放到画面中间同时将怪物放到随机的地方以方便英雄去捉它)。
到此,相信你已经掌握了开发一个简单H5小游戏需要的基本功了。玩玩这个游戏或者下载代码自己研究研究吧 :)
Feel free to repost but keep the link to this page please!
HTML5是万维网的核心语言、超文本标记语言(HTML)的第五次重大修改。HTML5 已经于2014年10月正式定稿。然而,大部分现代浏览器已经具备了某些HTML5支持。HTML5是web时代最前沿的技术,它特有canvas标签和多种选择的游戏开发引擎,让游戏开发更便捷。
近些年来html5技术非常火爆!HTML5开发人员是企业必不可少、不可或缺的人员。企业想要快速的发展,HTML5开发人员就必须要有,由此可见HTML5开发人员是多么的紧张,所以有很多人想要学习HTML5开发。
下面,就为你推荐几部新手入门html5的书籍。
1、HTML5+CSS3从入门到精通(李东博 著)
简介:本书通过基础知识+中小实例+综合案例的方式,讲述了用HTML5+ CSS3设计构建网站的必备知识,相对于专业指南、高级程序设计、开发指南同类图书,本书是一本适合快速入手的自学教程。
2、响应式Web设计:HTML5和CSS3实战(BenFrain 著, 王永强 译)
简介:全书主要是带领读者做一个小网页来写的,其实响应式的东西讲得比较少,大半内容是介绍H5和css3的基础知识。如果同时想了解H5和css3和响应式设计入门,这本书不错。
3、HTML5移动Web开发实战详解(林珑 著)
简介:本书由浅入深,全面、系统、详尽地介绍了HTML5相关技术和其在移动开发领域的应用。书中提供了大量的代码示例,读者可以通过这些例子理解知识点,也可以直接在开发实战中稍加修改应用这些代码。《HTML5移动Web开发实战详解》涉及面广,从基本原理到实战,再到项目工作流,几乎涉及一个合格的前端开发工程师需要具备的所有重要知识。
4、 疯狂HTML 5/CSS3/JavaScript讲义(李刚 著)
简介:这是一本全面介绍HTML 5、CSS 3和JavaScript前端开发技术的图书,系统地介绍了HTML 5常用的元素和属性、HTML5的表单元素和属性、HTML 5的绘图支持、HTML5的多媒体支持、CSS 3的功能和用法、最前沿的变形与动画功能等。除此之外,《疯狂HTML 5/CSS 3/JavaScript讲义》还系统地介绍了JavaScript编程知识,包括JavaScript基本语法、DOM编程,以及HTML 5新增的本地存储、离线应用、JavaScript多线程、客户端通信支持、WebSocket编程等。
5、HTML5触摸界面设计与开发(StephenWoods 著, 覃介右 谷岳 译)
简介:《HTML5触摸界面设计与开发》专注于触摸界面的开发,内容的结构和优化网站的思路大概一致。上半部分涵盖了能使各类网站,特别是移动网站变快的基本概念。书的后半部分是专门讲触摸界面的,特别是尽可能地让它们更平稳和快速。本书适合具有一定经验的Web开发者阅读参考。
关于Web前端学习的必经阶段。正在从事Web前端学习的小伙伴们来和小伙伴们一起看一看吧。希望能够对大家有所帮助!
第一阶段:
● HTML+CSS:
HTML进阶、CSS进阶、div+css布局、HTML+css整站开发、
● JavaScript基础:
Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。
● JS基本特效:
常见特效、例如:tab、导航、整页滚动、轮播图、JS制作幻灯片、弹出层、手风琴菜单、瀑布流布局、滚动事件、滚差视图。
● JS高级特征:
正则表达式、排序算法、递归算法、闭包、函数节流、作用域链、基于距离运动框架、面向对象基础、
● JQuery:基础使用
悬着器、DOM操作、特效和动画、方法链、拖拽、变形、JQueryUI组件基本使用。
第二阶段:HTML5和移动Web开发
● HTML5:
HTML5新语义标签、HTML5表单、音频和视频、离线和本地存储、SVG、Web Socket、Canvas.
● CSS3:
CSS3新选择器、伪元素、脸色表示法、边框、阴影、background系列属性改变、Transition、动画、景深和深透、3D效果制作、Velocity.js框架、元素进场、出场策略、炫酷CSS3网页制作。
● Bootstrap:
响应式概念、媒体查询、响应式网站制作、删格系统、删格系统原理、Bootstrap常用模板、LESS和SASS。
● 移动Web开发:
跨终端WEB和主流设备简介、视口、流式布局、弹性盒子、rem、移动终端JavaScript事件、手机中常见JS效果制作、Zepto.js、手机聚划算页面、手机滚屏。
第三阶段:HTTP服务和AJAX编程
● WEB服务器基础:
服务器基础知识、Apache服务器和其他WEB服务器介绍、Apache服务器搭建、HTTP介绍。
● PHP基础:
PHP基础语法、使用PHP处理简单的GET或者POST请求、
● AJAX上篇:
Ajax简介和异步的概念、Ajax框架的封装、XMLHttpRequest对象详细介绍方法、兼容性处理方法、Ajax框架的封装、Ajax中缓存问题、XML介绍和使用。
● AJAX下篇:
JSON和JSON解析、数据绑定和模板技术、JSONP、跨域技术、图片预读取和lazy-load技术、JQuery框架中的AjaxAPI、使用Ajax实现瀑布流案例额。
第四阶段:面向对象进阶
● 面向对象终极篇:
从内存角度到理解JS面向对象、基本类型、复杂类型、原型链、ES6中的面向对象、属性读写权限、设置器、访问器。
● 面向对象三大特征:
继承性、多态性、封装性、接口。
● 设计模式:
面向对象编程思维、单例模式、工厂模式、策略模式、观察者模式、模板方法模式、代理模式、装饰者模式、适配器模式、面向切面编程。
第五阶段:封装一个属于自己的框架
● 框架封装基础:
事件流、冒泡、捕获、事件对象、事件框架、选择框架。
● 框架封装中级:
运动原理、单物体运动框架、多物体运动框架、运动框架面向对象封装。
● 框架封装高级和补充:
JQuery框架雏形、可扩展性、模块化、封装属于传智自己的框架。
第六阶段:模块化组件开发
● 面向组件编程:
面向组件编程的方式、面向组件编程的实现原理、面向组件编程实战、基于组件化思想开发网站应用程序。
● 面向模块编程:
AMD设计规范、CMD设计规范、RequireJS,LoadJS、淘宝的SeaJS。
第七阶段:主流的流行框架
● Web开发工作流:
GIT/SVN、Yeoman脚手架、NPM/Bower依赖管理工具、Grunt/Gulp/Webpack。
● MVC/MVVM/MVW框架:
Angular.js、Backbone.js、Knockout/Ember。
● 常用库:
React.js、Vue.js、Zepto.js。
第八阶段:HTML5原生移动应用开发
● Cordova:
WebApp/NativeApp/HybirdApp简介、Cordova简介、与PhoneGap之间的关系、开发环境搭建、Cordova实战(创建项目,配置,编译,调试,部署发布)。
● Ionic:
Ionic简介和同类对比、模板项目解析、常见组件及使用、结合Angular构建APP、常见效果(下拉刷新,上拉加载,侧滑导航,选项卡)。
● React Native:
React Native简介、React Native环境配置、创建项目,配置,编译,调试,部署发布、原生模块和UI组件、原生常用API。
● HTML5+:
HTML5+中国产业联盟、HTML5 Plus Runtime环境、HBuilder开发工具、MUI框架、H5+开发和部署。
第九阶段: Node.js全栈开发
● 快速入门:
Node.js发展、生态圈、Io.js、Linux/Windows/OS X环境配置、REPL环境和控制台程序、异步编程,非阻塞I/O、模块概念,模块管理工具、开发流程,调试,测试。
● 核心模块和对象:
全局对象global,process,console,util、事件驱动,事件发射器、加密解密,路径操作,序列化和反序列化、文件流操作、HTTP服务端与客户端、Socket.IO。
● Web开发基础:
HTTP协议,请求响应处理过程、关系型数据库操作和数据访问、非关系型数据库操作和数据访问、原生的Node.js开发Web应用程序、Web开发工作流、Node.js开发Blog案例。
● 快速开发框架:
Express简介+MVC简介、Express常用API、Express路由模块、Jade/Ejs模板引擎、使用Express重构Blog案例、Koa等其他常见MVC框架。
● Node.js开发电子商务实战:
需求与设计、账户模块注册登录、会员中心模块、前台展示模块、购物车,订单结算、在线客服即时通讯模块。