• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > HTML5技术之图像处理:一个滑动的拼图游戏

HTML5技术之图像处理:一个滑动的拼图游戏

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5教程,HTML5中国,HTML5技术之图像处理:一个滑动的拼图游戏,html5cn,html5资料,html5等相关知识,匿名希望在学习及工作中可以帮助到您
HTML5有许多功能特性可以把多媒体整合到网页中。使用canvas元素可以在这个空白的画板上填充线条,载入图片文件,甚至动画效果。

在这篇文章中,我将做一个滑动拼图的游戏用来展示HTML5 canvas的图片处理能力。
在网页中使用canvas标签用来创建画板。


canvas的宽和高使用像素为单位。如果这两个属于没有被指定,他们的默认的宽度为:300px,高度为:150px。在图板画图需要使用canvas的上下文环境,通过脚本调用getContext()方法获取上下文环境。W3C定义它为二维,更确切的说是2d。所以初始化上下文环境如果如下方法:
下一步要做的是在画板上显示图片,API只提供drawImage()一种方法。但是有三种调用方式。最常用的是传入三个参数:image对象,以及图片相对于画板的x,y坐标。
还可以加入两个参数用于设置图片的宽和高
最复杂的drawImage函数有9个参数,按顺序分别为:图片对象,图片x坐标,图片y坐标,图片宽,图片高,目标x坐标,目标y坐标,目标宽和目标高。后四个参数主要是为了截取原图部分用来显示,比如局部放大、剪切等。以上就是图像处理的方法,让我们做一个练习。









  • 复制代码
    上面的DIV包括了另一个HTML5标签:range input,这个标签可以让用户拖放滑块选择一个数值。回头我们再说在拼图中如何与range input交互。到目前为止ie和firefox并不支持这个标签。
    现在就像我上面说过,想要在canvas上绘图,我们需要context。
    对了我们还需要一个图片,使用例子里自带的,或者找一个和canvas相同大小的图片都行。
  • img.src = 'http://www.brucealderman.info/Images/dimetrodon.jpg';
  • img.addEventListener('load', drawTiles, false);
  • 复制代码
    加入这个事件是确保图片完成加载后,再把图片放入canvas中。下面我们通过range input设置拼图的数量,数据范围从3到5(几行几列)。
  • var tileCount = document.getElementById('scale').value;
  • 复制代码
    有了上面两个数值就可以计算一个拼图的大小了
    OK我们开始创建画板
  • setBoard();
  • 复制代码
    setBoard()的作用是初始化看板,要模拟显示这个画板,我们使用一个二维数组。不过用JavaScript创建这样数组的过程不是很优雅,我们先定义一个平面数组,每个数组再定义一个数组。这个拼图游戏,每一个元素都是一个对象,它带有x和y坐标记录所在的网格位置。因此每个对象有两个坐标,第一个坐标是数组坐标,表示它在画板的位置,另外的坐标是对象的x,y属性,它记录着拼图图片的位置。当这两个坐标相同了就说明位置正确。
    为了达到目的,我们在初始化的时候把它们的位置互换。这样拼图就不在正确的位置了。
  • 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;
  • }
  • 复制代码
    最后三个变量我们还没有定义
    我们必须追踪空白拼图的位置还要记录用户点击的位置
  • clickLoc.x = 0;
  • clickLoc.y = 0;
  • var
  • emptyLoc = new Object;
  • emptyLoc.x = 0;
  • emptyLoc.y = 0;
  • 复制代码
    最后这个变量是指拼图是否完成
    所有的拼图都找到正确的位置后,设置它为true。
    现在我们需要一些和解决拼图相关的方法
    首先为rang input定义触发事件,当它改变了,我们要重新计算拼图的数量和大小

  • tileCount = this.value;
  • tileSize = boardSize /
  • tileCount;
  • setBoard();

  • drawTiles();
  • };
  • 复制代码
    还要追踪鼠标经过的拼图以及哪个拼图被点击
  • {
  • 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!");
  • }
  • };
  • 复制代码
    有一些浏览器会在重画画板之前弹出对话框,为了防止它的发生,一定要用延迟。
  • setTimeout(function() {alert("You solved
  • it!");}, 500);
  • }
  • 复制代码
    当一个拼图被点击时,我们要知道它的四周是否可以移动。判断的方法是当前位置到空白位置的总距离为1时就可以移动。
    简单点说就是x相同要判断y的距离是否为1,y相同要判断x的距离是否为1。
  • return Math.abs(x1 -
  • x2) + Math.abs(y1 - y2);
  • }
  • 复制代码
    移动拼图的做法是,我们复制被点击拼图的坐标到空位置。然后把点击位置设置成空白坐标。
  • if (!solved)
  • {
  • boardParts[toLoc.x][toLoc.y].x =
  • boardParts[fromLoc.x][fromLoc.y].x;
  • 您可能想查找下面的文章:

    • 一款利用html5和css3动画排列人物头像的实例演示
    • html5教程调用绘图api画简单的圆形代码分享
    • html5教程画矩形代码分享
    • html5教程制作简单画板代码分享
    • html5基础教程常用技巧整理
    • html5教程-Canvas入门
    • html5教程画矩形代码分享
    • HTML5晃动DeviceMotionEvent事件
    • HTML5教程之html 5 本地数据库(Web Sql Database)
    • HTML5中对contenteditable属性的解释与规定

    相关文章

    • 2018-12-03HTML5 语音搜索只需一句代码_html5教程技巧
    • 2018-12-03从零开始构建HTML 5 Web页面
    • 2018-12-03HTML5里的placeholder属性
    • 2017-08-06HTML5新增的Css选择器、伪类介绍
    • 2018-12-03用HTML5开发App真的好嘛?
    • 2018-12-03HTML5实现预览本地图片
    • 2017-08-06HTML5进度条特效
    • 2018-12-03HTML5 对各个标签的定义与规定:nav
    • 2018-12-03HTML5晃动DeviceMotionEvent事件
    • 2018-12-03HTML5新特性之Web Worker

    文章分类

    • html/xhtml
    • html5
    • CSS
    • XML/XSLT
    • Dreamweaver教程
    • Frontpage教程
    • 心得技巧
    • bootstrap
    • vue
    • AngularJS
    • HBuilder教程
    • css3
    • 浏览器兼容
    • div/css
    • 网页编辑器
    • axure

    最近更新的内容

      • 移动端H5页面端怎样除去input输入框的默认样式
      • HTML5 input元素类型:email及url介绍_html5教程技巧
      • HTML5实战与剖析之WebSockets简介
      • 突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
      • xml跟html有关系吗?
      • H5 Canvas API中drawImage(图像进行缩放或裁剪)的使用实例
      • HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述_html5教程技巧
      • 纯html5+css3下拉导航菜单实现代码
      • 关于canvas下载二维码和图片加水印的方法
      • 制作HTML5页面,选择那些软件比较好?

    关于我们 - 联系我们 - 免责声明 - 网站地图

    ©2020-2025 All Rights Reserved. linkedu.com 版权所有