HTML5游戏开发技术基础整理
随着HTML5标准终于敲定。HTML5将有望成为游戏开发领域的的热门平台。
HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机、智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实施方案。
本文系依据[HML5 Canvas游戏开发实战]一书中的内容整理而成,是了解和学习HTML5游戏开发的基础内容,希望能够帮助到那些和博主一样致力于游戏开发的朋友们。
JavaScript中的面向对象编程
对于游戏开发来说,面向对象编程(OOP)是一种重要并且必要的方法。所以在了解HTML5游戏开发前,首先应该了解JavaScript中的面向对象编程。JavaScript是一种基于对象的语言。可它并非一种真正的面向对象的编程语言,由于在JavaScript的语法中不存在类(Class)的概念。以下我们将分析和解决在JavaScript中实现封装、继承等面向对象的问题。
在JavaScript中函数(function)就是就是一个类(class)
//声明一个函数
function MyClass(){}
//实例化一个对象
var cls1 = new MyClass();
使用this关键字就能够为类添加属性
//声明一个类并定义其构造函数
function MyClass(name,age)
{
this.name = name;
this.age = age;
};
//实例化一个对象
var cls1 = new MyClass("张三",20)
//输出cls1的两个属性值
alert("name=" + cls1.name + "&" + cls1.age)
使用prototype属性能够为类加入方法
//声明一个类并定义其构造函数
function MyClass(name,age)
{
this.name = name;
this.age = age;
};
//为MyClass添加方法
MyClass.prototype=
{
toString:function()
{
alert("name=" + this.name + "&" + this.age)
},
getName:function()
{
alert("name=" + this.name)
},
getAge:function()
{
alert("age=" + this.age)
}
};
使用apply方法实现属性和方法的继承
//定义一个父类People
function People()
{
this.type="人"
};
//为父类定义一个方法
People.prototype=
{
getType:function()
{
alert("type=" + this.type)
}
};
//定义一个子类Student
function Student(name,age,sex)
{
//继承父类的属性type
People.apply(this,arguments);
this.name = name;
this.age = age;
this.sex = sex;
};
//声明一个Student实例
var stu = new Student("张三",20,"男");
//输出type
alert(stu.type)
//以下我们来了解下怎样继承父类的方法。继承父类方法主要通过循环使用父对象的prototype进行复制来实现,如
//又一次定义子类Student
function Student(name,age,sex)
{
//继承父类的属性type
People.apply(this,arguments);
//继承父类的方法。略显抽象
var prop;
for(prop in People.prototype)
{
var proto = this.constructor.prototype;
if(!proto[prop])
{
proto[prop] = People.prototype[prop];
}
proto[prop]["super"] = People.prototype;
}
//属性定义
this.name = name;
this.age = age;
this.sex = sex;
};
//实例化Student对象
var stu = new Student("张三",20,"男");
stu.getType();
静态类的实现
function staticClass()
{
staticClass.name = "张三";
staticClass.toString=function
{
alert("name=" + staticClass.name )
};
};
alert(staticClass.name);
staticClass.toString();
Canvas画图基础
HTML5提供了图像、视频、音频、表单、位置、本地数据库、离线存储、websocket等各种全新的特性,对于HTML游戏开发而言,我们主要关注图像、音频、本地数据库以及websocket等,首先我们来了解下Canavs画图的基础内容。
Canvas是HTML5为我们提供的一张画布,能够让我们在HTML上直接绘制图形,因此Canvas能够作为HTML5游戏开发的基本元素,即HTML5游戏引擎的底层都是以Canvas元素来驱动的。Canvas本身没有画图的能力,须要借助于JavaScript来实现画图的功能。使用Canvas元素仅仅须要在网页中加入canvas标记就可以。如
<canvas id="myCanavs" width="800" height="480"></canvas>
接下来我们通过JavaScript来获取这个Canvas并通过相关API实现画图环境的初始化
//获取Canvas元素
var canvas = document.getElementById('myCanvas');
//检查canvas合法性
if(canvas && canvas.getContext)
{
//获取当前上下文
var ctx = canvas.getContext('2d')
}
由于眼下Canvas仅仅支持2D画图,因此,这里的參数临时仅仅能为2d。由于Cnavas画图的API都封装在ctx这个实例中,因此以下的全部操作都是基于ctx来实现的:
使用Canvas绘制线
//设置线宽
ctx.lineWidth = 10;
//设置画笔颜色
ctx.strokeStyle = "red";
//创建一个路径
ctx.beginPath();
//路径起点
ctx.moveTo(10,10);
//路径终点
ctx.lineTo(150,50);
//绘制路径
ctx.stroke();
使用Cnavas绘制矩形
//设置线宽
ctx.lineWidth=5;
//设置画笔颜色
ctx.strokeStyle-"red"
//创建路径
ctx.beginPath();
//绘制矩形
ctx.strokeRect(10,10,70,40);
或者
//定义矩形
ctx.rect(10,10,70,40);
//绘制矩形
ctx.stroke();
假设须要对矩形进行填充
//创建路径
ctx.beginPath()
//绘制矩形
ctx.fillRect(10,10,70,40)
使用Canvas绘制圆
//创建路径
ctx.beginPath();
//定义圆
ctx.arc(100,100,50,0,360*Math.PI/180,true);
//绘制圆
ctx.stroke();
相同地。能够使用fill进行填充绘制
//创建路径
ctx.beginPath();
//定义圆
ctx.arc(100,100,50,0,360*Math.PI/180,true);
//绘制圆
ctx.fill();
使用Canvas绘制圆角矩形
绘制圆角矩形须要arcTo函数配合lineTo来完毕
//创建路径
ctx.beginPath();
ctx.moveTo(40,20);
ctx.lineTo(100,20);
ctx.arcTo(100,20,120,40,20);
ctx.lineTo(120,70);
ctx.arcTo(120,90,100,90,20);
ctx.lineTo(40,90);
ctx.arcTo(20,90,100,70,20);
ctx.lineTo(20,40);
ctx.arcTo(20,20,40,20,20);
//绘制圆角矩形
ctx.stroke();
使用Canvas绘制复杂图形
在HTML5中能够通过quadraticCurveTo函数绘制二次贝塞尔曲线,通过bezierCurveTo函数绘制三次贝塞尔曲线,详细代码请參考API文档。
使用Canvas绘制文字
//设置字体
ctx.font="30px Arial";
//绘制文字
ctx.strokeText("Hello HTML5",100,50);
使用Canvas绘制图片
绘制图片使用drawImage函数,其函数原型例如以下:
drawImage(image,dx,dy);
当中image能够是HTML中的标签或者是JavaScript中的Image对象。如
//定义一个img标签
<img id="img_source" src="source.jpg" width="240" height="240"/>
接下来通过getElementById来取得图像数据,并将其绘制出来
var img=document.getElementById("img_source");
ctx.draw(img,200,200);
假设直接使用JavaScript代码
var img=new Image();
img.src="source.jpg";
ctx.draw(img,200,200)
图形的平移操作
使用translate函数实如今水平和垂直方向上的平移
图形的旋转操作
使用rotate函数实现旋转,须要注意的是传入的參数是弧度
图形的伸缩操作
使用scale函数实现伸缩,当參数为负值时表示在该方向上翻转
图形高级特效
这里主要介绍线性渐变、径向渐变、颜色反转、灰度。
线性渐变
//创建一个线性渐变容器
var grd=ctx.createLinearGradient(0,0,200,0);
//加入颜色
grd.addColorStop(0.2,"#00ff00");
grd.addColorStop(0.8,"#ff0000");
//应用渐变
ctx.fillStyle=grd;
径向渐变
//创建一个径向渐变容器
var grd=ctx.createRadialGradient(100,100,10,100,100,50);
//加入颜色
grd.addColorStop(0,"#00ff00");
grd.addColorStop(,"#ff0000");
//应用渐变
ctx.fillStyle=grd;
颜色反转
遍历每一个像素并对RGB值进行取反
灰度
灰度计算公式:gary=red*0.3+green*0.59+blue*0.11
基础的内容就是这些了,以后假设碰到须要HTML5的地方能够回过头来看看。
HTML5游戏开发技术基础整理的更多相关文章
- html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...
- Html5游戏开发-145行代码完成一个RPG小Demo
lufy前辈写过<[代码艺术]17行代码的贪吃蛇小游戏>一文,忽悠了不少求知的兄弟进去阅读,阅读量当然是相当的大.今天我不仿也搞一个这样的教程,目地不在于忽悠人,而在于帮助他人. 先看de ...
- 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏
<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- 【转】HTML5游戏开发经典视频教程、电子书汇总
HTML5游戏开发经典视频教程.电子书汇总 HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某 ...
- HTML5游戏开发进阶指南
<HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...
- HTML5游戏开发 PDF扫描版
很多从事Web前端开发的人对HTML总有些不满,比如需要手动检查和设计很多格式代码,不仅容易出错,而且存在大量重复.好在HTML5让我们看到了曙光.作为下一代Web开发标准,HTML5成为主流的日子已 ...
- CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎
CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5 2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...
随机推荐
- 无Xaml的WPF展示
我们创建一个wpf应用程序,我们把里面的xaml文件全部删除,添加一个新类: 如下图: 然后我们cs文件中的代码: using System; using System.Collections.Gen ...
- 10300 - Ecological Premium
Problem A Ecological Premium Input: standard input Output: standard output Time Limit: 1 second Memo ...
- 【HTTP】Speed and Mobility: An Approach for HTTP 2.0 to Make Mobile Apps and the Web Faster
This week begins face to face meetings at the IETF on how to approach HTTP 2.0 and improve the Inter ...
- Debug和Release之本质区别
转自Debug和Release之本质区别 Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发 ...
- SQL SELECT基本语句结构
(1)SELECT select_list (2) FROM table_list (3) WHERE search_conditions GROUP BY group_by_list ...
- 一个简单的C#获取Session、设置Session类文件
一个简单的C#获取Session.设置Session类文件,本类主要实现大家最常用的两个功能: 1.GetSession(string name)根据session名获取session对象: 2.Se ...
- QT的父子Widget之间消息的传递(如果子类没有accept或ignore该事件,则该事件会被传递给其父亲——Qlabel与QPushButton的处理就不一样)
以前我一直以为:在父widget上摆一个子widget后,当click子widget时:只会进入到子widget的相关事件处理函数中,比如进入到mousePressEvent()中, 而不会进入到父w ...
- javascript中神奇的(+)加操作符
javascript是一门神奇的语言,这没神奇的语言中有一个神奇的加操作符. 常用的加操作符我们可以用来做: 加法运算,例如:alert(1+2); ==>3 字符串连接,例如:alert(“a ...
- Android开源项目发现--- 传感器篇(持续更新)
Great Android Sensing Toolkit Android感应器工具包,包含示例及使用过程中可能需要的算法 项目地址:https://github.com/gast-lib/gast- ...
- VS2015中的项目类图
发现右键项目的时候,是没有类图的. https://msdn.microsoft.com/en-us/library/hyxd8c85.aspx 右键项目--添加--新建项. 选择类图. 然后将整个项 ...