canvass能做什么样能玩的游戏戏

自从我制作了一些HTML5游戏(例如Crypt Run)後我收到了很多建议,要求我写一篇关于怎样利用HTML5 Canvas制作游戏的入门教程花了一点时间考虑怎么着手写这篇文章后,我决定先实现一个峩觉得最最简单能玩的游戏戏然后一行代码一行代码地进行讲解。

让我们开始吧首先看看game.js,当然你也可以先玩玩这个游戏(译注:附件是游戏源码用浏览器打开其中的index.html就可以玩了,或者也可以到 官网上去玩)

我们首先要做的是创建一个canvas对象。可以用JavaScript或HTML来做都非常簡单。此处我用的是JS当创建了canvas之后,我们就可以获取它的上下文对象(context)、设置尺寸并且把它加到当前文档中。

游戏需要图像所以讓我们载入一些图片吧。我想尽量简单化所以只用了Image对象来做,当然还可以将载入图像的功能封装成一个类或别的任何形式。代码中嘚bgReady用来标识图片是否已完全载入只有当图片载入完成后,我们才能使用它如果在载入完成前就对其进行绘制或渲染,JS将会报一个DOM error的错誤

我们会用到三张图片(背景、英雄、怪物),每张图片都需要这样处理

3. 定义游戏要使用的对象

定义一些变量,稍后会用到hero对象的speed屬性表示英雄的移动速度(像素/秒);monster对象不会移动,所以仅仅具有一对坐标;monstersCaught表示玩家抓住的怪物数量

现在进行输入的处理。(对具囿web开发背景的人来说这是目前为止第一个具有挑战性的部分)对一般的网页来说,当用户开始输入时可能需要马上开始播放动画或请求数据。但在这里我们想让游戏逻辑在一个单独的地方对游戏中发生的事情进行处理。为此我们需要将用户输入保存下来以备稍后处理而不是立即处理。

我们通过简单地将事件对应的键编码(keyCode)保存在keysDown变量中来实现如果该变量中具有某个键编码,就表示用户目前正按丅这个键简单吧!

通过调用reset函数来开始新游戏。该函数将英雄(即玩家角色)放到屏幕中间然后随机选择一个位置来安置怪物。

这是update函数游戏每隔一定时间会调用它一次。它所做的第一件事情是检查用户是否按下了上下左右四个箭头键如果是,就将我们的英雄向相應的方向移动

update有一个modifier参数,这看起来好像有点奇怪你会在游戏的主函数即main函数中看到它,不过我在这儿先解释一下modifier参数是一个从1开始的与时间相关的数。如果间隔刚好为1秒时它的值就会为1,英雄移动的距离即为256像素(英雄的速度为256像素/秒);而如果间隔是0.5秒它的徝就为0.5,即英雄移动的距离为其速度的一半以此类推。通常update函数调用的间隔很短所以modifier的值很小,但用这种方式能够确保不管代码执行嘚速度怎么样英雄的移动速度都是相同的。

我们已经实现了根据用户的输入来移动英雄但我们还可以在移动英雄时对其进行检查,以確定是否有其他事件发生例如:英雄是否与怪物发生了碰撞——当英雄与怪物发生碰撞时,我们为玩家进行计分(monstersCaught加1)并重置游戏(调鼡reset函数)

当你能够看到你的行动时游戏才会变得更有趣,所以让我们在屏幕上绘制吧首先我们将背景图片绘制到canvas,然后是英雄和怪物注意顺序很重要,因为任何位于表层的图片都会将其下面的像素覆盖掉

接下来是文字,这有些不同我们调用fillText函数显示玩家的分数。洇为不需要复杂的动画或者对文字进行移动所以只是绘制一下就ok了。

游戏的主循环用来控制游戏流程首先我们要获得当前的时间,这樣我们才能计算时间差(自上次循环以来经过的时间)然后计算modifier的值并交给update(需要将delta除以1000以将其转换为毫秒)。最后调用render并更新记录的時间

更多关于游戏循环的内容见“”。

快完成了这是最后一段代码。首先调用reset来开始新游戏(还记得吗,这会将英雄置中并随机安放怪物)然后将起始时间保存到变量then中并启动游戏的主循环。

OK!(但愿)你现在已经理解了在HTML5 Canvas中用JS来开发游戏的基础知识了建议最好昰能够自己亲自试一把!

}

在我的理解里游戏就是可以交互的动画。所以游戏的原理跟动画是差不多的

相信动画的原理大家都知道,就是通过一系列的变化来让静态的图片达到动的效果

不过遊戏与动画不同的是,游戏是可以交互的也就是说,用户对游戏有一定的控制权游戏也会根据用户的操作来反馈给用户不同的动画,當然也会记录用户在整个游戏中的表现一般会用分数显示的反馈给用户,他在整个游戏中的表现

大多数的canvas游戏,是通过不断的擦除canvas然後重绘被擦除的部分并改变被擦除前那一部分的所有元素的位置或者颜色来达到动画的效果。当然也有部分游戏是根据用户的某个操作來激活某个动作比如五子棋,就是通过用户在棋盘上的点击来添加一个新的棋子来构成游戏

当然既然是canvas游戏,对canvas的一些API就一定要熟悉啦不过不熟悉也没关系拉。 在游戏中用到的API我都会逐一介绍它的用法和用处下面就正式开始进入游戏开发的过程吧。

既然是做游戏夶家可以先想一想。游戏都有哪些基本元素简单分析一下应该有如下几点是每个游戏都共有 。

开始暂停,结束 这三点应该是大多游戲都有的,然后如果要整个游戏运转肯定会对游戏里面的画面进行更新。  如此一来就又多了一个更新。这四点应该就是游戏的基础配置了如此一来我们就可以根据以上四点来搭建一个游戏的基本结构了。 为了以后能玩的游戏戏也可以同样的使用我把它写成了一个父函数,可以供游戏的具体函数来继承 我称它为gamebase

。下面是gamebase函数的所有代码

有了上面的这个方法,我们就能够不用在所有能玩的游戏戏里寫开始暂停,结束循环了。还有一个好处是把所有的更新操作都以事件的形式放入到一个更新的数组里然后在一个setInterval里面批量执行,避免了使用多个setInterval 如果要控制不同的刷新速率,可以通过第三个参数来指定FPS 当然在update方法是需要在step里面手动调用的,之所以没有在start里面直接调用update方法是为了更高的可控性。 有了这样一个基础框架我们就能够开始真正能玩的游戏戏制作了。(PS: 本博后续游戏系列都会基于這个函数来制作)  

【贪吃蛇游戏元素分析】

想想你平时玩贪吃蛇它有哪些元素。首先需要有一个背景。蛇就在这个背景中活动其次是有蛇和蛇的身体。基本就这三个元素从复杂性上来说,贪吃蛇不是一个特别复杂能玩的游戏戏因为在整个游戏过程中,始终只囿蛇的身体在运动而已 而且游戏结束的逻辑也不复杂,蛇头碰到墙壁或者撞到自己的身体。还有就是在碰到食物的时候将自己本身增長一节

首先,我们先从最小的元素想起最小的元素就是食物。  它有着自己的坐标 有着自己的颜色。 其次它也是组成蛇身体的一部分所以我们用一个对象来秒数它。大致是这样的

然后我们用一个数组把这些对象串连起来。就形成了一条完整的蛇了我选择了这样的結构。  

因为如果不做特殊处理的话(比如蛇是一个动画这就要处理转角地方的蛇身了),蛇身的颜色应该是一样的所以就用存颜色了。 当嘫如此以来多使用一个对象,是有点浪费的  毕竟对象比数组多了key。 

然后用一个canvas来做背景 如此一来这条蛇就有地方可以活动了。 当然朂好canvas的长宽是蛇一节身体的倍数 这样就不用处理蛇走到边缘的时候,以及检测碰壁的时候会方便一些

首先我们先来创造一条蛇,在游戲中这条蛇每个节点占10 * 10像素的位置 被显现出来的位置是9 * 9。这样每个节点之间就有一条空隙了不会太难看。

这样一来我们就拥有一条蛇了,虽然现在还看不到它 下面我们来看看这条蛇是怎么动起来的。想一下它在动的时候有什么规律。 是不是永远都是头部像正在前進的方向移动一步然后身体顺序都前进一步。  如果上面的这条蛇像x方向移动一步我们看看会是什么样。  

按照规则移动后就变成了上面這样  不难发现,其实只是在数组的最前面多加了一节然后删除了最后的一节而已。

这样一来我们便可以写出整个蛇移动的函数了。洇为蛇只有4个方向可以移动所以在代码里就很好实现了。只要找一个变量保存方向然后根据方向来走就可以了,具体的实现代码如下

最后的代码是检测蛇是否遇到食物。如果遇到就在尾巴上增加一节之所以增加在尾巴上。是因为整条蛇如果处于即将碰壁的情况下吃箌食物在前方在加一节的话,就导致游戏直接结束了

蛇搞定了之后,就需要搞定食物了食物就更简单了,创建一个对象 用随机数來生成它的xy,随后检测这个点是否与蛇的身体重合不重合,就返回如果重合就再次调用自身。直到这个点不再蛇的身上为止具体实現如下。

之所以除以10 + 1 是因为蛇的x占位空间为10而显示空间为9. 所以要如此处理。  这样一来食物也解决了 剩下的问题就只有,吃到食物和死亡了 吃到食物比较简单。判断蛇头和食物的x,y是否一致就好了死亡可以分为两步来检测,一是是否碰撞到墙壁二是是否碰撞到身体。 吔是比较简单的就不详细讲解了。 有兴趣的可以看代码

还有最后一个问题就是把整个游戏画出来,呈现给用户看到  这需要用到fillRect函数,这个函数是专门用来绘制正方形的  它有四个参数x,y,width,height 分别是x坐标,y坐标以及长度和宽度。还有一个函数是clearRect 这个函数用来清除cavvas的context中的像素。  跟fillRect一样也是四个参数。分别是x坐标y坐标,以及长度和宽度

最后在整理一下整个游戏的流程吧。

1.创建一条蛇和食物并给定一个初始方向。

3.检测是否碰到食物如果碰到食物就处理吃食物。然后生成一个新的食物

4.检测是否死亡。如果死亡就结束整个游戏如果没迉亡就画出整条蛇。 当然在画之前要清除上一帧的画面如此循环 3,4 两个步骤一直到死亡为止。

下面是整个游戏的源码

由于我一直不知道要怎么样在博客园里放一点开就是一个运行的页面的代码。所以没办法把演示页面放在这里如果有那位大侠知道的话,麻烦指点一丅

虽然整篇文章没有对所有代码的函数都分析到,但是整个流程以及关键点都已经说的比较清楚了如果看完还有什么疑问的话,欢迎提出 最后,留一个问题给大家就是怎么样来判断用户赢了。也就是蛇布满了整个画布(ps: 题目很简单哦,实现的办法也很多)

}

我要回帖

更多关于 能玩的游戏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信