HTML5游戏制作完全指南

简介

创建画布

游戏循环

Hello world

创建player

键盘控制

a:使用jQuery Hotkeys

b:移动player

添加更多游戏元素

炮弹

敌人

使用图片

碰撞检测

声音

简介

你想使用HTML5的Canvas制作一款游戏吗?跟着这个教程,你将立刻上道儿。

阅读该教程需要至少熟悉javascript相关知识。

你可以先玩这款游戏或者直接阅读文章并且下载游戏源码

创建画布

在画任何东西之前,我们必须创建一个画布。因为这是完全指南,并且我们将用到jQuery.

var CANVAS_WIDTH =480;var CANVAS_HEIGHT =320;var canvasElement = $("<canvas width=‘"+ CANVAS_WIDTH +"‘ height=‘"+ CANVAS_HEIGHT +"‘></canvas>");var canvas = canvasElement.get(0).getContext("2d");
canvasElement.appendTo(‘body‘);

游戏循环

为了呈现给玩家连贯流畅的游戏动画,我们要频繁地渲染画布来欺骗玩家的眼睛。

var FPS =30;
setInterval(function(){
  update();
  draw();},1000/FPS);

现在我们先不管update和draw里面的实现,重要的是我们要知道setInterval()会周期性的执行update和draw

Hello world

现在我们已经搭建好了一个循环的架子,我们去修改update和draw方法来写一些文字到屏幕。

function draw(){
  canvas.fillStyle ="#000";// Set color to black
  canvas.fillText("Sup Bro!",50,50);}

专家提醒: 当你稍微更改了一些代码的时候就执行一下程序,这样可以更快的找到程序出错地方。

静止文字正常的显示出来了。因为我们已经有了循环,所以我们可以很容易地让文字动起来~~~

var textX =50;var textY =50;function update(){
  textX +=1;
  textY +=1;}function draw(){
  canvas.fillStyle ="#000";
  canvas.fillText("Sup Bro!", textX, textY);}

执行程序。如果你一步一步照着上面做下来,可以看到文字移动。但是上一次的文字却还留在屏幕上,因为我们没有擦除画布。现在我们在draw方法中加入擦除方法。

function draw(){
  canvas.clearRect(0,0, CANVAS_WIDTH, CANVAS_HEIGHT);
  canvas.fillStyle ="#000";
  canvas.fillText("Sup Bro!", textX, textY);}

现在你可以看到文字在屏幕上移动了,它已经算是一个真正意义上的游戏,只不过是个半成品。

创建player

创建一个包含player所有信息的对象,并且要有draw方法。这里创建了一个简单的对象包含了所有的player信息。

var player ={
  color:"#00A",
  x:220,
  y:270,
  width:32,
  height:32,
  draw:function(){
    canvas.fillStyle =this.color;
    canvas.fillRect(this.x,this.y,this.width,this.height);}};

我们现在用一个纯色的矩形来代表player.当我们把它加入游戏当中的时候,我们需要清除画布并且画上player.

function draw(){
  canvas.clearRect(0,0, CANVAS_WIDTH, CANVAS_HEIGHT);
  player.draw();}

键盘控制

使用jQuery Hotkeys

jQuery Hotkeys plugin在处理键盘行为的时候,可以更加容易的兼容不同的浏览器。让开发者不用因为不同浏览器之间的keyCode andcharCode不同而苦恼,我们这样绑定事件:

$(document).bind("keydown","left",function(){...});

移动player

function update(){if(keydown.left){
    player.x -=2;}if(keydown.right){
    player.x +=2;}}

是不是感觉移动不够快?那么我们来提高它的移动速度。

function update(){if(keydown.left){
    player.x -=5;}if(keydown.right){
    player.x +=5;}

  player.x = player.x.clamp(0, CANVAS_WIDTH - player.width);}

我们可以很容易的添加其他元素,比如炮弹:

function update(){if(keydown.space){
    player.shoot();}if(keydown.left){
    player.x -=5;}if(keydown.right){
    player.x +=5;}

  player.x = player.x.clamp(0, CANVAS_WIDTH - player.width);}

player.shoot =function(){
  console.log("Pew pew");// :) Well at least adding the key binding was easy...};

添加更多游戏元素

炮弹

我们开始真正意义上的添加炮弹,首先,我们需要一个集合来存储它:

var playerBullets =[];

然后,我们需要一个构造器来创建炮弹:

functionBullet(I){
  I.active =true;

  I.xVelocity =0;
  I.yVelocity =-I.speed;
  I.width =3;
  I.height =3;
  I.color ="#000";

  I.inBounds =function(){return I.x >=0&& I.x <= CANVAS_WIDTH &&
      I.y >=0&& I.y <= CANVAS_HEIGHT;};

  I.draw =function(){
    canvas.fillStyle =this.color;
    canvas.fillRect(this.x,this.y,this.width,this.height);};

  I.update =function(){
    I.x += I.xVelocity;
    I.y += I.yVelocity;

    I.active = I.active && I.inBounds();};return I;}

当玩家开火,我们需要向集合中添加炮弹:

player.shoot =function(){var bulletPosition =this.midpoint();

  playerBullets.push(Bullet({
    speed:5,
    x: bulletPosition.x,
    y: bulletPosition.y
  }));};

player.midpoint =function(){return{
    x:this.x +this.width/2,
    y:this.y +this.height/2};};

修改update和draw方法,实现开火:

function update(){...
  playerBullets.forEach(function(bullet){
    bullet.update();});

  playerBullets = playerBullets.filter(function(bullet){return bullet.active;});}
function draw(){...
  playerBullets.forEach(function(bullet){
    bullet.draw();});}

敌人

  enemies =[];functionEnemy(I){
  I = I ||{};

  I.active =true;
  I.age =Math.floor(Math.random()*128);

  I.color ="#A2B";

  I.x = CANVAS_WIDTH /4+Math.random()* CANVAS_WIDTH /2;
  I.y =0;
  I.xVelocity =0
  I.yVelocity =2;

  I.width =32;
  I.height =32;

  I.inBounds =function(){return I.x >=0&& I.x <= CANVAS_WIDTH &&
      I.y >=0&& I.y <= CANVAS_HEIGHT;};

  I.draw =function(){
    canvas.fillStyle =this.color;
    canvas.fillRect(this.x,this.y,this.width,this.height);};

  I.update =function(){
    I.x += I.xVelocity;
    I.y += I.yVelocity;

    I.xVelocity =3*Math.sin(I.age *Math.PI /64);

    I.age++;

    I.active = I.active && I.inBounds();};return I;};function update(){...

  enemies.forEach(function(enemy){
    enemy.update();});

  enemies = enemies.filter(function(enemy){return enemy.active;});if(Math.random()<0.1){
    enemies.push(Enemy());}};function draw(){...

  enemies.forEach(function(enemy){
    enemy.draw();});}

使用图片

player.sprite =Sprite("player");

player.draw =function(){this.sprite.draw(canvas,this.x,this.y);};functionEnemy(I){...

  I.sprite =Sprite("enemy");

  I.draw =function(){this.sprite.draw(canvas,this.x,this.y);};...}

碰撞检测

function collides(a, b){return a.x < b.x + b.width &&
         a.x + a.width > b.x &&
         a.y < b.y + b.height &&
         a.y + a.height > b.y;}
function handleCollisions(){
  playerBullets.forEach(function(bullet){
    enemies.forEach(function(enemy){if(collides(bullet, enemy)){
        enemy.explode();
        bullet.active =false;}});});

  enemies.forEach(function(enemy){if(collides(enemy, player)){
      enemy.explode();
      player.explode();}});}function update(){...
  handleCollisions();}
functionEnemy(I){...

  I.explode =function(){this.active =false;// Extra Credit: Add an explosion graphic};return I;};

player.explode =function(){this.active =false;// Extra Credit: Add an explosion graphic and then end the game};

加入声音

functionEnemy(I){...

  I.explode =function(){this.active =false;// Extra Credit: Add an explosion graphic};return I;};

player.explode =function(){this.active =false;// Extra Credit: Add an explosion graphic and then end the game};

DNT砖家提醒: 跟着上面的步骤,大概让大家了解了一款游戏的各种元素的制作过程,这类游戏做一遍就够,没有必要做第二遍,没有很难的算法,全是流程和经验性质的东西,倘若想做好看,做炫一点,那就是美工拼了老命切图的事情,或者开发人员介入做一些性能优化和碰撞优化。最后重复一遍----看过就好,不要当宝。

原文链接http://www.html5rocks.com/en/tutorials/canvas/notearsgame/#toc-player-movement

你可能还喜欢:http://www.cnblogs.com/iamzhanglei/archive/2011/11/06/2237870.html

时间: 2024-08-10 21:22:34

HTML5游戏制作完全指南的相关文章

HTML5游戏开发进阶指南 中文pdf扫描版?

HTML5游戏开发进阶指南介绍了HTML5游戏开发的一般过程和技巧.全书共分12章,第1章介绍了本书相关的HTML5的诸多新特性,包括在canvas上绘图.播放声音等,另外还引入了子画面页的概念:第2-4章利用Box2D物理引擎开发了一款非常类似于<愤怒的小鸟>的游戏,全面介绍了物理引擎的概念,以及在游戏中使用物理引擎的方法,这一部分还引入了视差滚动技巧,以实现某种伪3D效果:第5-10章开发了一款简化版的<红色警戒>游戏,这一部分涉及了相当多的内容,包括地图的制作,建筑与单位的设

零基础HTML5游戏制作教程 第6章 贪吃蛇的实现及代码

第6章 贪吃蛇的实现及代码 讲了不少东西了,老讲理论的东西没劲呀,我们不如先试着做一个小游戏吧. 作为我们的第一个游戏,当然是越简单越好.<贪吃蛇>大家应该都玩过吧?我觉得我玩过的游戏中,她应该算是最简单的一个了.好,就让我们从做<贪吃蛇>开始,享受自己做游戏的乐趣吧. 由于这个游戏是本教程的第一个实际的游戏例子,我会讲的比较详细一些.请大家重点注意编程的思路和实现的方法,这些远比代码本身要重要. 一,蛇身的制作 蛇身由一系列方格组成,初始我们设定蛇身的长度是4,以后每吃到一次食物

零基础HTML5游戏制作教程 第2章 简单图形的绘制

第二章 简单图形的绘制 HTML5支持使用Canvas和SVG等方式在网页直接绘制图形.其中SVG适合用来绘制高质量的矢量图形,不适合用来做游戏,所以我们做游戏一般使用Canvas. 由于本教程以简单为原则,所以在初学阶段请不要把注意力分散到美工.画质等细节,我们只需要掌握矩形.多边形.圆形等简单图形的绘制,并对这些图形编程,使之具有一定的运动能力和游戏效果. (如果你偷懒,你甚至可以跳过本章中多边形和圆形的绘制,只学矩形,然后直接去看下一章.) 一,矩形的绘制 命令的格式是context.fi

零基础HTML5游戏制作教程 第5章 碰撞检测

第5章 碰撞检测 几乎所有的游戏都需要碰撞检测.比如<贪吃蛇>,你需要检测蛇的前端是不是已经碰到了它的尾巴:比如<俄罗斯方块>,你需要检查方块是不是已经碰到了底部:比如<英雄联盟>,你需要判断adc的子弹或魔法是不是已经碰到了对方. 其实要做好碰撞检测是很难的,尤其是对于3d游戏或者图形复杂的2d游戏来说. 当然,对于简单图形来说,碰撞检测还是比较容易的,本章将分别介绍圆形的碰撞检测,矩形的碰撞检测,以及逻辑碰撞检测. 一,圆形碰撞检测 圆形间碰撞检测的原理是最简单的,

零基础HTML5游戏制作教程 第4章 移动的控制

第4章 移动的控制 一,捕获键盘击键的原理 有很多种方法可以控制游戏中图形的移动,常用的有键盘控制.鼠标控制以及屏幕上的按钮控制等.其中键盘控制比较简单,比较适合初学者,我们先来讲这种方法. 其实键盘上的每一个按键,在我们按下去的时候,会向电脑中传送一个编号.比如A的编号是65,B是66.在这一章里,我们只需要记住4个键就可以了,她们是光标的上下左右键.向上的编号是38,向下是40,向左是37,向右是39. 所以键盘捕获的原理其实很简单,就是读取键盘传到电脑中的编号,然后根据这个编号来判断哪个键

用Phaser来制作一个html5游戏——flappy bird (一)

Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希望大家看后也能做出自己的html5游戏.大家可以先点击这里来试玩一下我已经做好的这个游戏,感受一下Phaser的游戏效果,游戏的完整代码我已经放到github上了.支持的浏览器:IE9+.Firefox.Chrome.Opera.Safari以及移动端的能支持html5的浏览器,推荐使用谷歌浏览器,

Egret HTML5游戏开发指南

Egret  HTML5游戏开发指南 下载地址:https://pan.baidu.com/s/1fuxllvmRhWXoWDwH4gxN9g 关注微信公众号获取提取码: 输入:egrt 获取提取码 原文地址:https://www.cnblogs.com/kuoAT/p/9755344.html

2016年 最火的 15 款 HTML5 游戏引擎

HTML5游戏从2014年Egret引擎开发的神经猫引爆朋友圈之后,就开始一发不可收拾,今年<传奇世界>更是突破流水2000万!从两年多的发展来看,游戏开发变得越来越复杂,需要制作各种炫丽的效果,还要制作各种基于 2D 或者 3D 的场景.作为一名开发者,分析了当下最火爆,最热门的HTML5游戏引擎供大家参考,希望大家也能找到属于自己的那款游戏开发引擎. 我在github上面收集了四十多款的HTML5开源游戏引擎,从里面star.fork等等参数分析其流行度,最后综合各方面元素,筛选出靠前的十

移动HTML5前端性能优化指南

(点击看大图) 移动H5前端性能优化指南[托尼托尼研究所] 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB5. Mobile侧因手机配置原因,除加载外渲染速度也是优化重点6. 基于第五点,要合理处理代码减少渲染损耗7. 基于第二.第五点,所有影响首屏加载和渲染的代码应在处理逻辑中后置8. 加载完成