复制代码

上面的DIV包括了另一个HTML5标签:range input,这个标签可以让用户拖放滑块选择一个数值。回头我们再说在拼图中如何与range input交互。到目前为止ie和firefox并不支持这个标签。

现在就像我上面说过,想要在canvas上绘图,我们需要context。

var context = document.getElementById("puzzle").getContext("2d");复制代码对了我们还需要一个图片,使用例子里自带的,或者找一个和canvas相同大小的图片都行。

var img = new Image();

img.src = 'http://www.brucealderman.info/Images/dimetrodon.jpg';

img.addEventListener('load', drawTiles, false);复制代码加入这个事件是确保图片完成加载后,再把图片放入canvas中。下面我们通过range input设置拼图的数量,数据范围从3到5(几行几列)。

var boardSize = document.getElementById('puzzle').width;

var tileCount = document.getElementById('scale').value;复制代码有了上面两个数值就可以计算一个拼图的大小了

var tileSize = boardSize / tileCount;复制代码OK我们开始创建画板

var boardParts = new Object;

setBoard();复制代码setBoard()的作用是初始化看板,要模拟显示这个画板,我们使用一个二维数组。不过用JavaScript创建这样数组的过程不是很优雅,我们先定义一个平面数组,每个数组再定义一个数组。这个拼图游戏,每一个元素都是一个对象,它带有x和y坐标记录所在的网格位置。因此每个对象有两个坐标,第一个坐标是数组坐标,表示它在画板的位置,另外的坐标是对象的x,y属性,它记录着拼图图片的位置。当这两个坐标相同了就说明位置正确。

为了达到目的,我们在初始化的时候把它们的位置互换。这样拼图就不在正确的位置了。

function setBoard() {

boardParts = new Array(tileCount);

for (var i = 0; i < tileCount; ++i) {

boardParts[i] = new Array(tileCount);

for (var j = 0; j < tileCount; ++j) {

boardParts[i][j] = new Object;

boardParts[i][j].x = (tileCount - 1) - i;

boardParts[i][j].y = (tileCount - 1) - j;

}

}

emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;

emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;

solved = false;

}复制代码最后三个变量我们还没有定义

我们必须追踪空白拼图的位置还要记录用户点击的位置

var clickLoc = new Object;

clickLoc.x = 0;

clickLoc.y = 0;

var

emptyLoc = new Object;

emptyLoc.x = 0;

emptyLoc.y = 0;复制代码最后这个变量是指拼图是否完成

var solved = false;复制代码所有的拼图都找到正确的位置后,设置它为true。

现在我们需要一些和解决拼图相关的方法

首先为rang input定义触发事件,当它改变了,我们要重新计算拼图的数量和大小

document.getElementById('scale').onchange = function() {

tileCount = this.value;

tileSize = boardSize /

tileCount;

setBoard();

drawTiles();

};复制代码还要追踪鼠标经过的拼图以及哪个拼图被点击

document.getElementById('puzzle').onmousemove = function(e)

{

clickLoc.x = Math.floor((e.pageX - this.offsetLeft) /

tileSize);

clickLoc.y = Math.floor((e.pageY -

this.offsetTop) / tileSize);

};

document.getElementById('puzzle').onclick

= function() {

if (distance(clickLoc.x, clickLoc.y,

emptyLoc.x, emptyLoc.y) == 1) {

slideTile(emptyLoc, clickLoc);

drawTiles();

}

if (solved)

{

alert("You solved

it!");

}

};复制代码有一些浏览器会在重画画板之前弹出对话框,为了防止它的发生,一定要用延迟。

if (solved) {

setTimeout(function() {alert("You solved

it!");}, 500);

}复制代码当一个拼图被点击时,我们要知道它的四周是否可以移动。判断的方法是当前位置到空白位置的总距离为1时就可以移动。

简单点说就是x相同要判断y的距离是否为1,y相同要判断x的距离是否为1。

function distance(x1, y1, x2, y2) {

return Math.abs(x1 -

x2) + Math.abs(y1 - y2);

}复制代码移动拼图的做法是,我们复制被点击拼图的坐标到空位置。然后把点击位置设置成空白坐标。

function slideTile(toLoc, fromLoc) {

if (!solved)

{

boardParts[toLoc.x][toLoc.y].x =

boardParts[fromLoc.x][fromLoc.y].x;

boardParts[toLoc.x][toLoc.y].y =

boardParts[fromLoc.x][fromLoc.y].y;

boardParts[fromLoc.x][fromLoc.y].x = tileCount -

1;

boardParts[fromLoc.x][fromLoc.y].y = tileCount -

1;

toLoc.x =

fromLoc.x;

toLoc.y =

fromLoc.y;

checkSolved();

}

}复制代码一旦拼图移动了,我们还要检查一下拼图是否全部在正确的位置。

function checkSolved() {

var flag =

true;

for (var i = 0; i < tileCount; ++i)

{

for (var j = 0; j <

tileCount; ++j)

{

if

(boardParts[i][j].x != i || boardParts[i][j].y != j)

{

flag =

false;

}

}

}

solved = flag;

}复制代码如果有一个拼图不正确函数就会返回false,否则返回true。

最后,重绘被点击的拼图到新的位置。

function drawTiles() {

context.clearRect ( 0 , 0 , boardSize , boardSize );

for (var i = 0; i < tileCount; ++i) {

for (var j = 0; j < tileCount; ++j) {

var x = boardParts[i][j].x;

var y = boardParts[i][j].y;

if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {

context.drawImage(img, x * tileSize, y * tileSize, tileSize, tileSize,

i * tileSize, j * tileSize, tileSize, tileSize);

}

}

}

}复制代码当画拼图时,这个函数可以防止填充画板时匹配空的位置,因为在游戏中用户可以选择不同的难度。

转自天地会

拼图游戏怎样切换代码html,HTML5技术之图像处理:一个滑动的拼图游戏-H5教程相关推荐

  1. html5拖拽实现拼图,HTML5技术之图像处理:一个滑动的拼图游戏

    HTML5有许多功能特性可以把多媒体整合到网页中.使用canvas元素可以在这个空白的画板上填充线条,载入图片文件,甚至动画效果. 在这篇文章中,我将做一个滑动拼图的游戏用来展示HTML5 canva ...

  2. 【小游戏合集】之用Python自己开发一个闯关小游戏——开心消消乐

    导语: 今天这期小游戏是最适合小伙伴们一同挑战的精美手游,其因画面精美.上手简单.休闲有趣.有惊喜有挑战而获得广大玩家的喜爱...这款小游戏没错就是开心消消乐,相信大家都不陌生,其曾在 2015 年获 ...

  3. c语言小游戏vc,C语言探索之旅:第一个C语言小游戏

    C语言探索之旅:第一个C语言小游戏-1.jpg (37.05 KB, 下载次数: 0) 2018-10-8 19:23 上传 内容简介 1.课程纲领 2.第一部分第八课:第一个C语言小游戏 3.第一部 ...

  4. python井字棋游戏大作业实验报告_Part 1.2 - 实现一个井字棋游戏的gym环境

    上文已经描述了怎么创建和注册一个自定义的gym环境.但是环境类中的4个函数都是空的,本文将描述怎么实现那4个函数,实现一个完整的井字棋游戏的环境. 游戏规则:两个玩家在3x3的棋盘上,一方执X,一方执 ...

  5. html5实现圆圈里带一个三角形,Fabric.js - 详细使用教程1(绘制图形:矩形、圆形、三角形、不规则图形)...

    一.绘制图形 1,绘制矩形 下面代码在画布上绘制一个红色圆角矩形,并带有橙色边框. canvas { border: 1px dashed black; } window.onload = funct ...

  6. 虚幻4(UE4)在游戏进行的情况下按esc呼出一个菜单并暂停游戏

    通过用户界面新建一个控件蓝图,我把它取名为Menu. 打开它,在控制板输入Button找到按钮并拖到右边 搜索Text找到文本块并拖入Button之中. 在细节面板可改变输入文本块中的文字 然后做成这 ...

  7. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...

  8. node python做游戏服务哪个适合做服务端_当前的几种开源游戏服务端介绍

    当前的几种开源游戏服务端介绍 pomelo Pomelo 是基于 Node.js 的高性能.分布式游戏服务器框架.它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复 ...

  9. 【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章,作为我们<Visual C++游戏开发>专栏的游戏引擎导论,也 ...

  10. 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)

    游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...

最新文章

  1. Linuxmingl
  2. Numpy 从数值范围创建数组
  3. javascript调用activex控件
  4. vue输入框联想词功能
  5. 福师计算机辅助设计1 ps 在线作业二,福师《计算机辅助设计1(PS)》在线作业一100分答案...
  6. java 类编译_Java类编译、加载、和执行机制
  7. 【java】创建一个Frame,字体的颜色可以用按钮改变
  8. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)
  9. git config 的CRUD,增删改查
  10. 小生我怕怕私房版OllyDBG全自动下断版
  11. C4D插件X-Particles粒子特效(七)
  12. NOIP模拟赛 czy的后宫4
  13. [人工智能-深度学习-72]:卷积神经网络 - 空间金字塔池化SPP-Net网络与Pytorch代码实现
  14. android.media.MediaCodec$CodecException: Error 0xfffffc0e
  15. JDK1.8_API(不能用 你来看砍我)
  16. python数据挖掘入门与实践-第一章-用最简单OneR算法对Iris植物分类
  17. 旅行好帮手:精准可靠的航班动态数据服务
  18. 概率论0—概率初步简介
  19. FPGA:什么是IO单元、IO标准、Bank、VCCO、VREF
  20. PLSQL Developer新手使用教程(图文教程)(转载)

热门文章

  1. 教育行业网络安全等级保护法律法规参考
  2. 让C程序跳转到绝对地址0x100000处执行
  3. 幼儿学习品质提升的培养策略问卷
  4. 笹山希 java,C#版数据结构与算法高级教程(深入探讨)--附各种算法实例-升级版
  5. 测试眼睛距离的手机软件,早教APP哪款护眼功能最完善?这几款可检测宝宝坐姿和观看距离...
  6. 腾讯技术跨越2019
  7. 给不给你升职,领导关心的是什么?
  8. jsp 展示服务器pdf文件,jsp实现pdf在线预览功能
  9. Sequence Model-week1编程题2-Character level language model【RNN生成恐龙名 LSTM生成莎士比亚风格文字】...
  10. 文本对抗:《Semantically Equivalent Adversarial Rules for Debugging NLP Models》