html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend

一、前言

本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏。

首先让我们来了解了解如何用html5实现动画,毕竟“动静结合”是先有动再有静。看了上一章的内容,或许你就有了对html5实现动画有了初步了解:

html5游戏开发--"动静"结合(一): 

http://blog.csdn.net/yorhomwang/article/details/8301451


二、html5实现用小地图块拼成大地图

早在上一章以前我就向大家介绍过,许多游戏的地图是用小地图块拼成的。那么既然那些游戏能通过AS或者其他编程语言实现,那我们的html5也丝毫不逊色于它们。接下来就是今天我要为大家准备的图片:

 
map.png
这张图片具体来自哪里我不太清楚,不过它是为我们来服务的,做好事不留名的,因此暂且将他的来源放在一边,我们只用知道它叫map.png就OK;

光有图还不行,得来点代码。

map.js里的几行代码:

var i;
var j;window.onload = function (){gamemap();
}var mapimg = new Image();
var map = [[2,2,3,3,0,0,2,2,2,3,3,3,2],[2,0,3,3,0,0,0,0,0,0,0,0,0],[2,0,0,0,0,0,0,0,0,0,0,0,2],[2,0,0,0,0,0,0,0,0,0,3,0,2],	[1,3,0,0,0,0,0,0,0,0,2,0,2],[1,3,0,0,0,0,2,2,3,3,2,0,2],[2,1,1,1,0,0,0,0,0,0,0,0,3],[2,1,1,1,0,0,0,0,0,0,0,0,3],[0,0,0,1,0,0,1,1,2,2,3,0,0],[2,0,0,1,0,0,0,0,0,0,0,0,0],[3,0,0,1,1,1,0,0,1,1,1,0,1],[3,0,0,0,0,0,0,0,0,0,0,0,1],[2,2,2,2,2,3,3,3,0,0,1,1,1],
];
//创建构成地图的二维数组function gamemap(){var canvas = document.getElementById("map");var context = canvas.getContext("2d");mapimg.src = "./image/map.png";	mapimg.onload = function(){context.fillRect(0, 0, 416, 416);//画一个长416,宽416的矩形for(i = 0; i < 13; i++){for(j = 0; j < 13; j++){drawTile(i*32, j*32, map[j][i]);}}//循环调用绘制地图的函数,直到画完为止}
}function drawTile(x, y, type){var canvas = document.getElementById("map");var context = canvas.getContext("2d");context.drawImage(mapimg, type*32, 0, 32, 32, x, y, 32, 32);
}
//画地图的函数

html里很少的几行代码:

<!DOCTYPE html>
<html>
<head>
<title>html5 map</title>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<script type="text/javascript" src="./map.js"></script> 
</head>
<body><canvas id="map" width="415px" height="415px" style="border: 1px solid gray;"></canvas>
</body>
</html>


现在的形式相当于我说了一句莫名其妙的英语,而我接下来就要自说自译。首先html里的代码等于我说了一句连农村人都懂的“hello”,因此不解释。当然不排除有些朋友是无意间中计被迫到这里来看的,如果这类朋友对此感兴趣但有看不懂的话,在下也不妨给你们提供一些服务:

1.中文的朋友请看:http://www.w3school.com.cn/,上面有详细的编程介绍

2.Foreign friends: http://www.w3schools.com/ ,The above detailed introduction of the programming

P.S.在下并非是来打广告的,纯属真心想帮助大家。


进入正题,话虽扯到一边,但我想一些苦苦求学的同学依然在留恋那些代码。那么不消耗大家的兴趣,接下来就要让我来用我那"九"寸不烂之舌向大家倾述这些代码的意义。

Frist,我定义了两个用来确定地图块在地图数组所对应的变量j和i,这句话说得很模糊,大家看到最后便会懂得。如下:

var i;
var j;
Then,我用window.onload对画地图函数进行调用。这里不多说,因为最主要不是这个。如下:

window.onload = function (){gamemap();
}
Next,就是我们建立的用来装图片的mapimg和地图数组了。地图数组中,0,1,2,3分别代表不同的图片样式,但其实,用到的就只有一张图,这张图就是我们做好事不留名的map.png,在后面的讲解中,大家会明白这是如何办的。如下代码:

var mapimg = new Image();
var map = [[2,2,3,3,0,0,2,2,2,3,3,3,2],[2,0,3,3,0,0,0,0,0,0,0,0,0],[2,0,0,0,0,0,0,0,0,0,0,0,2],[2,0,0,0,0,0,0,0,0,0,3,0,2],	[1,3,0,0,0,0,0,0,0,0,2,0,2],[1,3,0,0,0,0,2,2,3,3,2,0,2],[2,1,1,1,0,0,0,0,0,0,0,0,3],[2,1,1,1,0,0,0,0,0,0,0,0,3],[0,0,0,1,0,0,1,1,2,2,3,0,0],[2,0,0,1,0,0,0,0,0,0,0,0,0],[3,0,0,1,1,1,0,0,1,1,1,0,1],[3,0,0,0,0,0,0,0,0,0,0,0,1],[2,2,2,2,2,3,3,3,0,0,1,1,1],
];
//创建构成地图的二维数组

现在貌似已经准备齐全,但缺少核心部分,因此我用了gamemap()的方法配合drawTile()方法一起用。那么再现一下核心内容:

function gamemap(){var canvas = document.getElementById("map");var context = canvas.getContext("2d");mapimg.src = "./image/map.png";	mapimg.onload = function(){context.fillRect(0, 0, 416, 416);//画一个长416,宽416的矩形for(i = 0; i < 13; i++){for(j = 0; j < 13; j++){drawTile(i*32, j*32, map[j][i]);}}//循环调用绘制地图的函数,直到画完为止}
}function drawTile(x, y, type){var canvas = document.getElementById("map");var context = canvas.getContext("2d");context.drawImage(mapimg, type*32, 0, 32, 32, x, y, 32, 32);
}
//画地图的函数

首先在gamemap()中在下取出<body>里的<canvas>的id,然后用mapimg.src="";定义了要显示的图片,具体用canvas显示图片可以去w3cschool上看看,或者去我上一篇看看,这里不多说了。然后进行绘画。首先我画了一个矩形,看注释就知道。然后进入我最爱的循环for。因为要画13*13的地图,所以要循环十三次,然后在循环里再进行循环,使i和j遍历数组map,当i的值为0时,j对应的值如下:

循环次数i的值j的值
100
201
302
404
505
606
707
808
909
10010
11011
12012
13013
由此可见,当i为0时,也就是说遍历二维数组map第一行,然后进入j的循环,从而把第一行遍历所有数据都读完。当i为2使,就是说遍历二维数组map第二行,然后又进入j的循环,从而把第二行遍历所有数据都读完。由此类推,整个二维数组map就被读完了。然后每当j变一次,就调用drawTile()并给他的参数赋值,再在drawTile()中进行绘制,从而达到画出地图的效果。

那么在drawTile中,我们做了什么处理呢?首先我们同样是取出id,这样可以方便绘制,然后用html5中drawImage()的方法,进行绘制。那么drawImage()怎么用呢?

看看w3cschool上的介绍吧,底下是几张截图

来自http://www.w3school.com.cn/htmldom/met_canvasrenderingcontext2d_drawimage.asp

语法

drawImage(image, x, y)
drawImage(image, x, y, width, height)
drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight,destX, destY, destWidth, destHeight)

参数 描述
image

所要绘制的图像。

这必须是表示 <img> 标记或者屏幕外图像的 Image 对象,或者是 Canvas 元素。

x, y 要绘制的图像的左上角的位置。
width, height 图像所应该绘制的尺寸。指定这些参数使得图像可以缩放。
sourceX, sourceY 图像将要被绘制的区域的左上角。这些整数参数用图像像素来度量。
sourceWidth, sourceHeight 图像所要绘制区域的大小,用图像像素表示。
destX, destY 所要绘制的图像区域的左上角的画布坐标。
destWidth, destHeight 图像区域所要绘制的画布大小。
看了介绍,相信大家对它有了了解,那么我就不解释了。当drawTile()的参数被赋值完成时,就会按照要求画出地图。由于没个地图块大小为32,所以大家可以看到很多32,哈哈。恐怕大家早就看得不赖烦了,因为这些对于大伙很简单,我还没讲,我相信大家早就明白了。至于代码下载,这次暂时没有,我最近越来越懒了。。。代码不多,大家就小心翼翼的复制粘贴吧。。。

运行效果:


那么我们接下来就来研究研究程序大师张路斌的html5开源引擎——lufylegend.js。


三、lufylegend.js的使用

首先我引用官方的介绍作为开篇:lufylegend是一个HTML5开源引擎, 它实现了利用仿ActionScript3.0的语法进行HTML5的开发,包含了LSprite,LBitmapData,LBitmap,LLoader,LURLLoader,LTextField,LEvent等多个AS开发人员熟悉的类, 支持Google Chrome,Firefox,Opera,IE9,IOS,Android等多种热门环境。利用lufylegend可以轻松的使用面向对象编程,并且可以配合Box2dWeb制作物理游戏, 另外它还内置了LTweenLite缓动类等非常实用的功能,现在开始使用它吧,它可以让你更快的进入HTML5的世界!


关注CSDN的朋友不难发现,有一位牛人就在我们身边,他就是张路斌。我第一次看见他的文章是在去年,当我看到他用他的引擎开发愤怒的小鸟时,我别提我对他有多佩服了。后来我进一步了解,开始学习他的html5引擎lufylegend。那么我还是别在这里吹捧作者了,开始进如正题。

  • lufylegend下载地址和API介绍:http://lufylegend.com/lufylegend
  • 官方博客:http://blog.csdn.net/lufy_legend
  • 联系官方:lufy.legend@gmail.com

以下是几个lufylegend的几个例子:


1).lufylegend实现游戏进度条

<!DOCTYPE html>
<html>
<head>
<title>html5 game</title>
<script type="text/javascript" src="./lufylegend-1.5.2.min.js"></script>
<script type="text/javascript" src="./lufylegend-1.5.2.js"></script>
<script>
init(50,"mylegend",800,400,main);
var imgData = [{name:"山水画",path:"./山水画.jpg"},{name:"水墨古城",path:"./水墨古城.jpg"},{name:"水墨画",path:"./水墨画.jpg"},{name:"夕阳西下",path:"./夕阳西下.jpg"},{name:"英国小镇",path:"./英国小镇.jpg"},{name:"中国风的水墨画",path:"./中国风的水墨画.jpg"}
];
//图片path数组  var imglist = {}; 
//读取完的图片数组  var loadIndex = 0;var loadingLayer;
//建立加载进度层var loadingText;
//建立loadingText打字区function main(){   loadingLayer = new LSprite();    addChild(loadingLayer);  loadingText = new LTextField();loadingText.size = 32;loadingText.font = "Tahoma";loadingText.color = "dimgray";loadingText.text = "Loading……";loadingText.stroke = "ture";loadingText.lineWidth = 2;loadingText.x = 320;loadingText.y = 140;loadingLayer.addChild(loadingText);//实例化进度条层loadImage();  //开始读取图片
}  var loadingX = 250;
//设定进度条X坐标var loadingLong = 350;
//设定进度条长度function loadOver(){loadingLayer.removeChild(loadingText);  removeChild(loadingLayer);    alert("COMPLETE"); 
}function loadImage(){    if(loadIndex == imgData.length){loadingLayer.graphics.drawRect(1,"black",[loadingX, 203, loadingLong*(loadIndex/imgData.length), 24],true,"orange");setTimeout(function(){loadOver();}, 500); return;  }  //图片全部读取完成,开始初始化游戏loader = new LLoader();  loader.addEventListener(LEvent.COMPLETE,loadComplete);  loader.load(imgData[loadIndex].path,"bitmapData"); //开始读取图片
}  function loadComplete(event){    loadingLayer.graphics.clear();  loadingLayer.graphics.drawRect(1,"black",[loadingX, 200, loadingLong, 30],true,"white");  loadingLayer.graphics.drawRect(1,"black",[loadingX, 203, loadingLong*(loadIndex/imgData.length), 24],true,"orange");//进度条显示  imglist[imgData[loadIndex].name] = loader.content;  //储存图片数据  loadIndex++; loadImage(); //读取下一张图片  
} 
</script>
</head>
<body><div id="mylegend">loading......</div>
</body>
</html> 


2)lufylegend实现动画播放

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><title>html5 game</title><script type="text/javascript" src="./lufylegend-1.5.2.min.js"></script><script type="text/javascript">init(150,"legend",800,450,main);var imgData = [{name:"player",path:"./player.png"}];var imglist;var backLayer,hero;function main(){LLoadManage.load(imgData,null,gameInit);}function gameInit(result){imglist = result;backLayer = new LSprite();addChild(backLayer);var list = LGlobal.divideCoordinate(256, 256, 4, 4);var data = new LBitmapData(imglist["player"],0,0,64,64);hero = new LAnimation(backLayer,data,list);backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);}function onframe(){hero.onframe();}</script></head><body><div id="legend">loading……</div></body>
</html>

3)lufylegend实现绘画

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="./lufylegend-1.5.2.min.js"></script>
<script>init(20,"mylegend",500,400,main);function main(){var backLayer = new LSprite();addChild(backLayer);backLayer.graphics.drawArc(2,"dimgray",[100,100,50,0,2*Math.PI],true,"lightgray");backLayer.graphics.drawRect(2,"dimgray",[100,200,50,100],true,"lightgray");}
</script>
</head>
<body><div id="mylegend"></div>
</body>
</html>

今天对lufylegend的初探就到此为止,下次我将对lufylegend的具体使用进行介绍,希望大家多支持,谢谢!我将以更好的文章来回报大家。

----------------------------------------------------------------

欢迎大家转载我的文章。

转载请注明:转自Yorhom's Game Box

欢迎继续关注我的博客

转载于:https://www.cnblogs.com/java20130808/archive/2013/01/23/3241573.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BASE理论(基本可用策略+ 最终一致性实现)

目录实现基本可用的几个策略1、流量削峰&#xff08;不同地区售票时间错峰出售&#xff09;2、延迟响应&#xff0c;异步处理&#xff08;买票排队&#xff0c;基于队列先收到用户买票请求&#xff0c;排队异步处理&#xff0c;延迟响应&#xff09;3、体验降级&#xff08;看到…

Paxos算法(Basic Paxos 与 Multi-Paxos思想)

目录Basic Paxos三个角色达成共识的方法对于Basic Paxos的总结Multi-Paxos领导者优化 Basic Paxos 执行referencePaxos 算法包含 2 个部分&#xff1a; 1、Basic Paxos &#xff1a; 描述多节点之间如何就某个值达成共识 2、Multi-Paxos &#xff1a; 描述执行多个Basic Paxos实…

vs2012下调试mvc4源代码

当前流行的应该是mvc3才对。然后在研究mvc3的源代码时候&#xff0c;Html这个属性下的扩展方法Partial()都没有。IntelliSense不会提示该方法&#xff0c;找了半天的资料也问了一些博友&#xff0c;没看到好的解决棒法。最后没辙另辟蹊跷&#xff0c;就开始着手研究mvc4的源代码…

JAVA UDP网络编程学习笔记

一、UDP网络编程概述 采用TCP协议通信时&#xff0c;客户端的Socket必须先与服务器建立连接&#xff0c;连接建立成功后&#xff0c;服务器端也会持有客户端连接的Socket&#xff0c;客户端的Socket与服务器端的Socket是对应的&#xff0c;它们构成了两个端点之间的虚拟通信链路…

(转)页游安全攻与防,SWF加密和隐藏密匙

原文链接&#xff1a;http://netsecurity.51cto.com/art/201211/364775.htm 页游&#xff0c;最最核心的就是客户端&#xff08;swf&#xff09;与服务端的游戏通信了。游戏通信产生的封包&#xff0c;内容是否可识别&#xff0c;可篡改&#xff0c;可重放&#xff0c;处理逻辑…

linux 命令案例学习——文件搜索

两个搜索文件的工具 locate ——仅仅通过文件名查找文件find ——依据文件的各种属性在既定目录&#xff08;包括子目录&#xff09;里查找一个通常与文件搜索命令一起使用、处理搜索结果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下结…

Redis 缓存击穿、缓存穿透、缓存雪崩的处理方法

常用的分布式缓存Redis单机并发量能达到万级&#xff0c;常用的关系型数据库MySQL一般并发量是千级&#xff0c;他们支持的并发量可能差十倍&#xff0c;所以要尽可能把流量拦截在缓存层。 缓存击穿 一个并发访问量比较大的key在某个时间过期&#xff0c;导致所有的请求直接打…

图像处理基础

图像处理基础 在计算机中&#xff0c;按照颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前&#xff0c;大多数图像处理软件都支持这四种类型的图像。 (1) 二值图像&#xff1a;一幅二值图像的二维矩阵仅由0、1两个值构成&#x…

缓存一致性解决方法

对于缓存 数据库读写&#xff0c;有个经典的Cache Aside Pattern&#xff1a; 读取&#xff1a;先读取缓存&#xff0c;缓存里没有&#xff0c;读取数据库&#xff0c;然后返回响应&#xff0c;顺便保存缓存&#xff1a; 更新&#xff1a;先更新数据库&#xff0c;然后删除缓…

使用SpringMVC的表单验证

上一篇搭建了基本项目&#xff0c;这一篇在此基础上加入表单验证功能。 第一步&#xff0c;添加command类 Java代码 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

单体、分布式、微服务、Serverless软件架构一览

目录软件架构单体架构分布式应用微服务架构Serverless架构总结Reference软件架构 软件架构就是软件的基本结构&#xff0c;合适的架构是软件成功的最重要因素之一。这里列举了目前流行的4种软件架构。 单体架构 典型的三级架构&#xff1a;前端&#xff08;web/手机端&#…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神图?

Midjourney在沉寂九个月后推出了Midjourney V6&#xff0c;这个文生图产品体现出的更细腻的细节处理&#xff0c;更强大的语言理解能力和更加“不像AI”的图片效果在过去几天引发一片惊呼。 作为一个闭源的模型产品&#xff0c;Midjourney的魔法配方并不为人所知&#xff0c;但…

连续内存分区式内存管理

目录前言分区式内存管理动态分区内存管理总结本笔记参考黄工的https://mp.weixin.qq.com/s/k0W_LqI1zBAYC1GU1U2HQA 前言 内存管理模块主要负责内存的初始化、分配以及释放。 从分配内存是否连续可以分为两大类&#xff1a; 1、连续内存管理 为进程分配的内存空间是连续的&a…

用DEVC++作图

小海豚学NOIP&#xff0c;老师说要用DEV C。 小海豚喜欢画图&#xff0c;记得以前用C#编些程序给她看。可前一阵打开看&#xff0c;我的免费Visual Studio过期了。可恶的Microsoft &#xff0c;不想用盗版难道就要每个月就下载一次&#xff1f; 于是就用DEV C的Windows调用吧。…

Python服务器开发三:Socket

Python服务器开发三&#xff1a;Socket socket是操作系统中I/O的延续&#xff0c;它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件描述符。不同的是文件需要用open()函数打开&#xff0c;而socket用socket() 函数建立.recv()、send()函数和read()、write(…

Linux命令常见

摘自&#xff1a; 常考的 21 条 Linux 命令 目录&#xff09;cd,切换路径ls,查看文件与目录的命令cp,用于复制文件mv,用于移动文件、目录cat,查看文件内容find&#xff0c;文件搜索文件权限命令&#xff0c; 设置权限&#xff0c;-取消权限文本处理命令打包和压缩文件命令进程相…

OSGi.NET 学习笔记 [模块化和插件化][小结]

【目录】-【模块化和插件化】-【小结】 现在我们来对OSGi.NET的“模块化和插件化”做一个小结&#xff0c;再次把官方的说明拿出来  1&#xff09; 物理隔离&#xff1a;基于UIOSP开发的模块是一个物理隔离的可单独部署的模块&#xff0c;每一个模块拥有独立的文件夹、类型空…

raft算法学习(一):角色概念以及选举过程

Raft算法是强领导模型&#xff0c;集群中只能有一个领导。 下面是raft的视频讲解&#xff1a; raft raft的三种角色及其概念 服务器节点状态一共有三种&#xff1a;领导者&#xff08;Leader&#xff09;、跟随着&#xff08;Follower&#xff09;、候选人&#xff08;Candid…

git日常使用教程

目录git日常使用git 基础用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交树上移动相对引用强制修改分支位置撤销变更整理提交记录提交技巧Git TagsGit Describegit 基础用法(远程)git fetchgit pullgit push偏离的提交历史&#xff0c;十分重要&#xff01;&…

android一键分享功能不使用任何第三方sdk

在android中有自带的一键分享功能&#xff0c;不过它会把所有带分享的应用都找出来&#xff0c;如果我们只需要一些常见的分享应用&#xff0c;该如何做呢&#xff1f; 下面看我的效果图&#xff08;横屏和竖屏自动适配&#xff09;&#xff1a; 接下来看我的调用&#xff08;支…