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.pswp.cn/news/376890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376890.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BASE理論(基本可用策略+ 最終一致性實現)

目錄實現基本可用的幾個策略1、流量削峰&#xff08;不同地區售票時間錯峰出售&#xff09;2、延遲響應&#xff0c;異步處理&#xff08;買票排隊&#xff0c;基于隊列先收到用戶買票請求&#xff0c;排隊異步處理&#xff0c;延遲響應&#xff09;3、體驗降級&#xff08;看到…

一天一道算法題--6.15--卡特蘭數

感謝微信平臺---一天一道算法題---每天多一點進步- problem: 12個高矮不同的人 排成兩排 每排必須是從矮到高排列 而且第二行比對應的第一排的人高 問排列方式有多少種&#xff1f; analyse: 據說 這題 是來自于 阿里巴巴的面試題 果然 很有分量 ~~ 我反正 胡思亂想了好多 沒搞…

現有一些開源ESB總線的比較

現有的開源ESB總線中&#xff0c;自從2003年第一個開源總線Mule出現后&#xff0c;如今已經是百花爭鳴的景象了。如今我就對現有的各種開源ESB總線根據性能、可擴展性、資料文檔完整程度以及整合難易程度等方面展開。 一&#xff0e;CXF CXF的定位不是ESB總線&#xff0c;而是一…

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;它們構成了兩個端點之間的虛擬通信鏈路…

firefox 插件開發

IDE&#xff0c;你可以嘗試下NetBeans foxbeans這個插件。轉載于:https://www.cnblogs.com/sode/archive/2013/01/25/2876562.html

13種負載均衡算法

目錄前言&#xff08;1&#xff09;輪轉調度&#xff08;Round-Robin Scheduling&#xff09;算法&#xff08;2&#xff09;加權輪轉調度&#xff08;Weighted Round-Robin Scheduling&#xff09;算法&#xff08;3&#xff09;隨機均衡調度&#xff08;Random Scheduling&am…

對于shell腳本參數獲取時的一點小技巧

問題如下&#xff1a; 根據腳本參數的個數$#進行一個循環&#xff0c;在依次輸出每個參數$1 $2 $3...... 我有一個循環變量i $i 取到這時的i為1&#xff0c;我想使用這個1再去調用$1,也是就是打印出第一個參數 就是$($i)的意思來取到第幾個參數&#xff0c;當然$($i)是不好用的…

(轉)頁游安全攻與防,SWF加密和隱藏密匙

原文鏈接&#xff1a;http://netsecurity.51cto.com/art/201211/364775.htm 頁游&#xff0c;最最核心的就是客戶端&#xff08;swf&#xff09;與服務端的游戲通信了。游戲通信產生的封包&#xff0c;內容是否可識別&#xff0c;可篡改&#xff0c;可重放&#xff0c;處理邏輯…

C++自動類型推導 : auto 與 decltype 用法

基本用法與區別 auto 總是推導出“值類型”&#xff0c;絕不會是“引用”,如果有引用&#xff0c;auto會把引用去掉&#xff0c;推導出值類型&#xff1b; auto 可以附加上 const、volatile、*、& 這樣的類型修飾符&#xff0c;得到新的類型。 auto x 10L; // auto推導為…

C++智能指針使用指南 part1:基本使用

加粗樣式>TOC 智能指針是代理模式的具體應用&#xff0c;它使用 RAII 技術代理了裸指針&#xff0c;能夠自動釋放內存&#xff0c; 無需程序員干預&#xff0c;所以被稱為“智能指針”。 智能指針不是指針&#xff0c;而是一個對象&#xff0c;所以不要對其調用delete&…

AS3.0 BitmapData類介紹

注&#xff1a;文中的Bitmapdata和BMD均為同一意思BitmapData,BMD為其縮寫一&#xff0c;概括&#xff1a; Bitmapdata繼承Object對象&#xff0c;實現IBitmapDrawable接口&#xff0c;這個接口有什么用&#xff0c;你可以理解為Drawable,能被畫。官方介紹是&#xff1a;IBitma…

C++使用JSON的序列化與反序列化

這里使用的json解析工具為JSON for Modern C,使用的話僅需要包含頭文件。 獲取方式&#xff1a;wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp JSON json的序列化功能和map一樣&#xff0c;用關聯數組的"[]"來任意添加數據&#xff0c…

iOS判斷為空或者只為空格

本文轉載至 &#xff1a;http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 經常有需求 要判斷不能為空&#xff0c;后臺老是鄙視不做非空判斷的前端 &#xff0c;木辦法 只能寫一個。 第一種想法&#xff1a;我不就是判斷 是不是nil就可以了么。結果發現太天…

Hyper-V

Hyper-V&#xff1a;也就是虛擬化技術&#xff0c;允許終端用戶在同一臺機器上運行多個操作系統&#xff0c;支持32位和64位系統&#xff0c;可以直接在Windows 8上創建自己的虛擬機。開啟Hyper-V虛擬機需要更多的內存&#xff0c;正常運行需要至少4GB以上內存&#xff0c;所以…

sdut 1451 括號東東 DP

http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid1451 題意&#xff1a;中文..... 思路&#xff1a; pku有一道題&#xff0c;經典的括號匹配&#xff08;區間DP&#xff09;題目&#xff0c;那道題目是求的最長滿足條件的子串的長度&#xff0c;那…

CDN緩存替代算法

CDN緩存工作過程如下&#xff1a;用戶發出一個請求&#xff0c;如果請求被命中&#xff0c;緩存將對用戶的請求進行響應&#xff0c;返回其請求的數據&#xff1b;如果未被命中&#xff0c;緩存向上拉取用戶需要的數據&#xff0c;并對其存儲的數據進行替換。 緩存算法的意義在…

前端開發常用正則表達式

1、電話 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、郵箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中調用接口發送短信

轉載&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通過兩種方式發送短信 第一&#xff1a;調用系統短信接口直接發送短信&#xff1b;主要代碼如下&#xff1a; Java代碼//直接調用短信接口發短信 SmsManager smsManager SmsManager.getDefault(); List…