或许连小游戏都算不上,可以叫做mini游戏。

  没有任何框架或者稍微有点深度的东西,所以有js基础的或者要追求炫酷效果的可以直接ctrl+w了。

  先贴出两个游戏的试玩地址:

  

  • 基础

  接下来简单说说怎样开发这样的基础游戏。

  首先你要懂得canvas上的基本api,可以参考w3cschool;如果你喜欢e文,也可以参考岑安推荐的HTML5 Canvas — the Basics

  接着进入主流程,这样的canvas小游戏基本上都是基于每帧重绘,一般有下面这样的过程:

  重绘的话可以用setInterval,但是最好用requestAnimationFrame,好处很多,可以自行搜索。(为什么我还是用了setInterval?因为我懒...)

  游戏中的物体,如果可以的话,都可以写成一个类的形式,类里面设置一些需要的属性(比如长、宽、速度等)和方法(比如draw、update等)。

  这里要引入向量这个概念,位置、速度、加速度等都可以用向量表示。可以试着写一个适合自己的向量模板,你会发现很多事情会变的简单。比如这样:Vector.js

  

  • 碰撞

  如果游戏再稍微复杂点,可能有碰撞检测的需求,比如第二个游戏中就有圆形碰撞的检测。

  矩形和圆形之间的碰撞很简单,画画图就能明白,稍微繁琐点的是像素级别的碰撞。

  什么叫做像素级别的碰撞?举个栗子,比如下面这样:

  • 先对字所在的图片的两个矩形进行检测,如果没碰撞,直接return false
  • 如果矩形碰撞,可以用getImageData,分别检测两图在相交矩形中的像素(蓝色矩形内),如果有一个像素点在两图中都存在,则return true;或者可以将globalCompositeOperation改成destination-in再检测,具体可以参考HTML5 canvas globalCompositeOperation绘图类型讲解,原理类似。
  • 鼠标键盘事件

  怎么记录鼠标键盘事件?

  鼠标事件不多,可以分别监听判断;键盘事件可以设置一个关联数组,比如:

var keyState = [];
keyState[e.keyCode] = true;  // keydown
keyState[e.keyCode] = false; // keyup

  

  • demo

  下面针对第一个demo来简单说说。

  首先我们发现除了一些文字外,游戏主体就是由几个矩形,一个圆形和一根线段构成的,组成很简单,每帧的数据更新其实就是这几个图形数据的更新。

  如何更新?因为游戏中的几个过程我设置成了串行,比如线段增长、线段旋转、圆形移动、画布整体左移,所以我给每个过程设置了一个判断变量,轮到哪个步骤执行了哪个变量就设置为true,而该步骤中的数据进行更新。比如下面这样:

if(this.linegrow && !this.linemove && !this.ballmove &&!this.basepointmove)
  this.lineLen +=7;

if(this.linegrow)  // lineAdd
  v2 = new Vector2(v1.x, v1.y - this.lineLen);

  数据更新完就可以画了,有了数据要画出来就相对简单了。

  这里的画布左移我用了translate,没去看类似的小游戏是怎么实现的这个效果的,有空去看下。

  • 扩展

  做个这样简单的小游戏实现其实并不难,如果有兴趣的话可以试试同类型的,比如贪吃蛇、是男人就下100层等等。

  想试试稍微复杂点的,可以看下W·Axes写的两个游戏:FlppyPeople  runningMan

  其实我的第二个游戏demo的创意完全来自于岑安的追踪子弹-初中简单的物理和数学,里面也有具体说为何要用requestAniamtionFrame。大家有空可以看看岑安的文章,篇篇精品。

  参考资料:如何开发一个简单的HTML5 Canvas 小游戏

  

  

  

两个Canvas小游戏的更多相关文章

  1. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  2. canvas小游戏——flappy bird

    前言 如果说学编程就是学逻辑的话,那锻炼逻辑能力的最好方法就莫过于写游戏了.最近看了一位大神的fly bird小游戏,感觉很有帮助.于是为了寻求进一步的提高,我花了两天时间自己写了一个canvas版本 ...

  3. Canvas小游戏里,删除过期或者死亡元素技巧

    在许多canvas游戏,canvas效果中,经常会有过期的元素需要删除 例如现在需要制作一个笨鸟先飞(flappy bird)小游戏,游戏中障碍物(且称为柱子),此时会有一个全局变量保存所有柱子的实例 ...

  4. 一个简单的基于canvas小游戏

    GDOI2016是我的退役战,不知道是题目画风不对,还是我自身的问题. 不过没关系啦,反正已经进过一次队OI生涯就没有什么遗憾的了. 这几天尝试着去做了个所谓的html5小游戏,略显简陋,但还是写个总 ...

  5. HTML5 Canvas小游戏基础:用户交互

    交互是游戏的根本.缺少了用户交互,游戏就不能称之为游戏,只能说是动画或电影.事件是浏览器响应用户交互操作的一种机制. 1.事件和事件执行 事件定义了用户与页面交互时产生的各种操作(主要通过鼠标或热键的 ...

  6. 以前写的canvas 小游戏 贪吃蛇代码

    效果如图,完成了贪吃蛇的基本的功能 代码地址 :https://github.com/my-new-git-hub/canvasSnake.git 预览地址:https://www.kzc275.to ...

  7. html5+Canvas实现酷炫的小游戏

    最近除了做业务,也在尝试学习h5和移动端,在这个过程中,学到了很多,利用h5和canvas做了一个爱心鱼的小游戏.点这里去玩一下 PS: 貌似有点闪屏,亲测多刷新两下就好了==.代码在本地跑都不会闪, ...

  8. Android使用学习之画图(Canvas,Paint)与手势感应及其应用(乒乓球小游戏)

    作为一个没有学习Android的菜鸟,近期一直在工作之外努力地学习的Android的使用. 这周看了下Android的画图.主要是Canvas,Paint等,感觉须要实践下.下午正好有空,就想整一个乒 ...

  9. 微信小游戏开发Canvas资源汇总

    Demo: 微信小程序demo组件:股票分时图 微信小程序小组件:仿直播点赞气泡效果,基于Canvas 优质demo推荐:二维码生成器:使用canvas与纯JS版二维码生成 微信小程序学习用完整dem ...

随机推荐

  1. MongoDB学习笔记——Master/Slave主从复制

    Master/Slave主从复制 主从复制MongoDB中比较常用的一种方式,如果要实现主从复制至少应该有两个MongoDB实例,一个作为主节点负责客户端请求,另一个作为从节点负责从主节点映射数据,提 ...

  2. C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅳ部分

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  3. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  4. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

  5. Android开发中XML布局的常用属性说明

    <!-- 常用属性说明: android:id="@+id/button" 为控件指定Id android:text="NNNNNNNNNN" 指定控件的 ...

  6. java报表工具FineReport的SQL编辑框的语法简介

    感谢大家捧场,这里继续分享关于SQL编辑框的一些语法心得总结,因为数据集定义的面板,也是FineReport报表中最常用的模块之一. 1.我理解的执行过程. 这里其实是生成一个字符串,FineRepo ...

  7. 理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. c语言结构体小知识

    引自:http://c.biancheng.net/cpp/html/88.html 结构体在内存中是连续存储的 struct stu{ char *name; //姓名 int num; //学号 ...

  9. BZOJ2763[JLOI2011]飞行路线 [分层图最短路]

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2523  Solved: 946[Submit][Statu ...

  10. Codeforces Round #371 (Div. 2)E. Sonya and Problem Wihtout a Legend[DP 离散化 LIS相关]

    E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...