canvas入门级小游戏《开关灯》思路讲解

游戏很简单,10行10列布局,每行每列各10盏灯,游戏初始化时随机点亮其中一些灯,点击某盏灯,其上下左右的灯及本身状态反转,如果点击前是灭着的,点击后即点亮,将所有灯全部点亮才算过关。游戏试玩:

 

需要注意的是:isPointInPath(x,y)方法只能判断坐标x,y是否在最近的上下文所绘制的图形内,如果canvas一次性绘制了100盏灯,isPointInPath(x,y)只能判断x,y是否在第100盏灯内,要想判断x,y是否在所点击的某盏灯内,就应该在每次点击的时候重绘这100盏灯(调用reDraw方法),每绘制一盏灯触发一次isPointInPath(x,y)方法,如果在灯上,将gameData对应灯的数据状态反转。如当前绘制第i行第j盏灯,调用isPointInPath(x,y)返回true,则反转该灯状态game[i][j] = !game[i][j]之后再次调用reDraw方法重绘。每次点击需要重绘两次。

综上所述,代码修改为:

lightOff =.canvas.getContext( This = .canvas.addEventListener( .count = .ctx.clearRect(,,.canvas.width, ( i = ; i < .row; i++ ( j = ; j < .col; j++ </span><span style="color: #0000ff;"&gt;this</span>.ctx.fillStyle = <span style="color: #0000ff;"&gt;this</span>.gameData[i][j] ? <span style="color: #0000ff;"&gt;this</span>.onColor : <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.offColor; </span><span style="color: #0000ff;"&gt;this</span>.ctx.arc( i*<span style="color: #0000ff;"&gt;this</span>.margin+(<span style="color: #800080;"&gt;2</span>*i+<span style="color: #800080;"&gt;1</span>)*<span style="color: #0000ff;"&gt;this</span>.r,j*<span style="color: #0000ff;"&gt;this</span>.margin+(<span style="color: #800080;"&gt;2</span>*j+<span style="color: #800080;"&gt;1</span>)*<span style="color: #0000ff;"&gt;this</span>.r,<span style="color: #0000ff;"&gt;this</span>.r,<span style="color: #800080;"&gt;2</span>*<span style="color: #000000;"&gt;Math.PI ); </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.ctx.fill(); </span><span style="color: #0000ff;"&gt;if</span>( p &amp;&amp; <span style="color: #0000ff;"&gt;this</span>.ctx.isPointInPath(p.layerX-<span style="color: #0000ff;"&gt;this</span>.padding,p.layerY-<span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.padding) ){ </span><span style="color: #0000ff;"&gt;this</span>.gameData[i][j] = !<span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.gameData[i][j]; i </span>> <span style="color: #800080;"&gt;0</span> &amp;&amp; (<span style="color: #0000ff;"&gt;this</span>.gameData[i-<span style="color: #800080;"&gt;1</span>][j] = !<span style="color: #0000ff;"&gt;this</span>.gameData[i-<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;][j]); i </span>< <span style="color: #800080;"&gt;9</span> &amp;&amp; (<span style="color: #0000ff;"&gt;this</span>.gameData[i+<span style="color: #800080;"&gt;1</span>][j] = !<span style="color: #0000ff;"&gt;this</span>.gameData[i+<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;][j]); j </span>> <span style="color: #800080;"&gt;0</span> &amp;&amp; (<span style="color: #0000ff;"&gt;this</span>.gameData[i][j-<span style="color: #800080;"&gt;1</span>] = !<span style="color: #0000ff;"&gt;this</span>.gameData[i][j-<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;]); j </span>< <span style="color: #800080;"&gt;9</span> &amp;&amp; (<span style="color: #0000ff;"&gt;this</span>.gameData[i][j+<span style="color: #800080;"&gt;1</span>] = !<span style="color: #0000ff;"&gt;this</span>.gameData[i][j+<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;]); } </span><span style="color: #0000ff;"&gt;this</span>.gameData[i][j] &amp;&amp; <span style="color: #0000ff;"&gt;this</span>.count++<span style="color: #000000;"&gt;; } } </span><span style="color: #0000ff;"&gt;if</span>(<span style="color: #0000ff;"&gt;this</span>.count === <span style="color: #800080;"&gt;100</span><span style="color: #000000;"&gt; ){ alert(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;成功了</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) } </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;; },createMap: function(){ </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;var</span> i = <span style="color: #800080;"&gt;0</span>; i < <span style="color: #0000ff;"&gt;this</span>.row; i++<span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;this</span>.gameData[i] =<span style="color: #000000;"&gt; []; </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;var</span> j = <span style="color: #800080;"&gt;0</span>; j < <span style="color: #0000ff;"&gt;this</span>.col; j++<span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;this</span>.gameData[i].push( Math.random() > <span style="color: #800080;"&gt;0.5</span> ? <span style="color: #0000ff;"&gt;false</span> : <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt; ); } } </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;; } } lightOff.init();</span></pre>


出处:
本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)