使用html5 canvas创建太空游戏的示例


Posted in HTML / CSS onMay 08, 2014

HTML5 Canvas 可以快速创建出有助于游戏开发的轻型图片。 本部分说明如何使用 Canvas 创建将在网页中运行的怀旧风格外太空飞行游戏。 此游戏的设计主要是为了展示使用 Canvas 功能开发 Web 游戏的基本原则。 此太空游戏的目标是,使您的宇宙飞船穿过分布着爆炸小行星的星域,安全返回基地。
本教程包含运行游戏的完整代码。代码是使用 HTML5 Canvas 和 JavaScript 编写的,包含四个独立的有注释代码示例。 每个示例都涉及一项关键的编程任务,这些任务是开发游戏的不同方面所必需的。 第四个代码示例将所有任务组合在一起,创建了一个完整有效的游戏,您可以使用箭头键移动飞船,穿越分布着爆炸红色小行星的星域迷宫。 如果您的飞船撞到行星,则将被毁坏。 为了安全返回基地,您必须避开小行星,或在您撞上小行星之前将其炸毁。 将根据您移动飞船的次数和您发射的炸弹数来进行计分。
本主题包括一个独立的有注释代码示例,为您演示如何使用 HTML5 Canvas 和 JavaScript 创建包含白色星星的随机区域,以及绘制外形像飞盘一样的橙绿相间的宇宙飞船。 此游戏图像是使用像素创建的。 通过使用即时模式,Canvas 具有将像素直接放在屏幕上的能力。 此功能您能够轻松地在需要的位置,以选择的颜色绘制点、线和形状。 此代码示例将为您演示如何通过在形状中组合数学贝塞尔曲线和颜色来创建宇宙飞船。 然后,它将说明如何使用由弧形组成的小圆圈来绘制星星。
此代码示例包含以下任务来演示使用Canvas 绘制这些游戏元素的基本原则:
1.向网页添加 Canvas 元素
2.创建黑色背景
3.在背景上绘制随机星星
4.向背景添加宇宙飞船
代码示例的末尾是讨论材料,说明有关这些任务的设计和结构以及工作方式的详细信息。
Canvas 代码示例:

复制代码
代码如下:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
// This function is called on page load.
function canvasSpaceGame() {
// Get the canvas element.
canvas = document.getElementById("myCanvas");
// Make sure you got it.
if (canvas.getContext)
// If you have it, create a canvas user inteface element.
{
// Specify 2d canvas type.
ctx = canvas.getContext("2d");</p> <p>// Paint it black.
ctx.fillStyle = "black";
ctx.rect(0, 0, 300, 300);
ctx.fill();</p> <p>// Paint the starfield.
stars();</p> <p>// Draw space ship.
makeShip();
}
}</p> <p>// Paint a random starfield.</p> <p>
function stars() {</p> <p>// Draw 50 stars.
for (i = 0; i <= 50; i++) {
// Get random positions for stars.
var x = Math.floor(Math.random() * 299)
var y = Math.floor(Math.random() * 299)</p> <p>// Make the stars white
ctx.fillStyle = "white";</p> <p>// Give the ship some room.
if (x < 30 || y < 30) ctx.fillStyle = "black";</p> <p>// Draw an individual star.
ctx.beginPath();
ctx.arc(x, y, 3, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
}
}</p> <p>function makeShip() {</p> <p>// Draw saucer bottom.
ctx.beginPath();
ctx.moveTo(28.4, 16.9);
ctx.bezierCurveTo(28.4, 19.7, 22.9, 22.0, 16.0, 22.0);
ctx.bezierCurveTo(9.1, 22.0, 3.6, 19.7, 3.6, 16.9);
ctx.bezierCurveTo(3.6, 14.1, 9.1, 11.8, 16.0, 11.8);
ctx.bezierCurveTo(22.9, 11.8, 28.4, 14.1, 28.4, 16.9);
ctx.closePath();
ctx.fillStyle = "rgb(222, 103, 0)";
ctx.fill();</p> <p>// Draw saucer top.
ctx.beginPath();
ctx.moveTo(22.3, 12.0);
ctx.bezierCurveTo(22.3, 13.3, 19.4, 14.3, 15.9, 14.3);
ctx.bezierCurveTo(12.4, 14.3, 9.6, 13.3, 9.6, 12.0);
ctx.bezierCurveTo(9.6, 10.8, 12.4, 9.7, 15.9, 9.7);
ctx.bezierCurveTo(19.4, 9.7, 22.3, 10.8, 22.3, 12.0);
ctx.closePath();
ctx.fillStyle = "rgb(51, 190, 0)";
ctx.fill();
}
</script>
</head>
<body onload="canvasSpaceGame()">
<h1>
Canvas Space Game
</h1>
<canvas id="myCanvas" width="300" height="300">
</canvas>
</body>
</html>

Canvas 代码示例讨论

本节说明本代码示例的设计和结构。 它为您讲解代码的不同部分,以及整合它们的方式。 Canvas 示例使用标准 HTML5 标头 ,以便浏览器可以将它作为 HTML5 规格的一部分加以区别。

代码分成两个主要部分:
1.主体代码
2.脚本代码

主体代码
在页面加载时,主体标记使用 onload 函数调用 canvasSpaceGame 函数。 Canvas 标记是主体的一部分。 指定了 Canvas 初始宽度和高度,还指定了 ID 属性。 必须使用 ID,才能将 canvas 元素添加到页面的对象模型中。

脚本代码
脚本代码包括三个函数: canvasSpaceGame、stars 和 makeShip。 加载页面时将调用 canvasSpaceGame 函数。 stars 和 makeShip 都是从 canvasSpaceGame 调用的。

canvasSpaceGame 函数
加载页面时将调用此函数。 它通过在主体代码中使用 Canvas 元素 ID 来获取画布, 然后获取画布的上下文,并准备好接受绘图。 将上下文初始化为 2D 画布后,使用 fillStyle、rect 和 fill 方法将画布绘制为黑色。

stars 函数
此函数是从 canvasSpaceGame 调用的。 它使用 for loop 在二维平面上生成 50 个潜在的星星位置,然后使用 fillStyle 创建白色。 随后,会进行一项检查,确认 x,y 坐标是否与左上角过于靠近。 如果星星绘制得与左上角过于靠近,则会将 fillStyle 更改为黑色,使其不会妨碍宇宙飞船。 随后,使用 arc 方法绘制每个星星并使用相应的填充颜色。
makeShip
此函数是从 canvasSpaceGame 调用的。 使用一系列的 beginPath、moveTo、bezierCurveTo、closePath、fillStyle 和 fill 方法,绘制一个简单的宇宙飞船。
飞船是通过绘制两个椭圆来创建的,一个椭圆在另一个的上面。 它首先在 Adobe Illustrator CS5 中绘制,然后使用 的 Ai2Canvas 插件将图像导出到 Canvas。 生成的 Canvas 代码已复制并粘贴到此示例的代码中。

HTML / CSS 相关文章推荐
使用JS+CSS3技术:让你的名字动起来
Apr 27 HTML / CSS
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
Nov 18 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
Jan 06 HTML / CSS
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
Jan 30 HTML / CSS
html5的websockets全双工通信详解学习示例
Feb 26 HTML / CSS
html5+svg学习指南之SVG基础知识
Dec 17 HTML / CSS
【HTML5】3D模型--百行代码实现旋转立体魔方实例
Dec 16 HTML / CSS
小程序瀑布流解决左右两边高度差距过大的问题
Feb 20 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
Dec 01 HTML / CSS
position:sticky 粘性定位的几种巧妙应用详解
Apr 24 HTML / CSS
HTML5 新增内容和 API详解
Nov 17 HTML / CSS
HTML中的表格元素介绍
Feb 28 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
May 08 #HTML / CSS
Data URI scheme详解和使用实例及图片base64编码实现方法
May 08 #HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
May 08 #HTML / CSS
html5实现canvas阴影效果示例
May 07 #HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
May 07 #HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
May 07 #HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
May 07 #HTML / CSS
You might like
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
Bootstrap插件全集
2016/07/18 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
通过实例学习Python Excel操作
2020/01/06 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
社区庆八一活动方案
2014/02/02 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
检讨书范文300字
2015/01/28 职场文书
社区党员干部承诺书
2015/05/04 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Python字典的基础操作
2021/11/01 Python
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫