日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

如何实现一个HTML5 RPG游戏引擎——第一章,实现地图类

發(fā)布時間:2025/5/22 HTML 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何实现一个HTML5 RPG游戏引擎——第一章,实现地图类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一,話說天下大事

前不久看到lufy的博客上,有一位朋友想要一個RPG游戲引擎,出于興趣準(zhǔn)備動手做一做。因為我研究lufylegend有一段時間了,對它有一定的依賴性,因此就準(zhǔn)備將這個引擎基于lufylegend。臨時命名為lufylegendRPG。畢竟基于lufylegend,假設(shè)名稱中不加上lufylegend這幾個字的話,有點說不通啊。。。近期公布了0.1.0版,可是不理想,連一慣都是鼓舞和欣賞我的lufy老先生都是出于真心的表示不愜意。想了解0.1.0版的朋友能夠看看這里(事實上最好別看,因為1.0在使用方法上做了非常大的調(diào)整):

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

于是我不得不又一次來開發(fā)它。首先想到了地圖類,今天就來實現(xiàn)一下。

我們的地圖不應(yīng)該是一張大地圖,而是用小地圖拼接而成,這樣方便我們改動地圖。

這種話我們須要很多地圖塊的圖片,通常我們把它們放在一張上。我們就用lufy老先生blog上一張圖片作為樣例,給大家看看這種裝滿小地圖的大圖是什么樣的:

我們要完成的效果是什么樣的呢?我把它放在這里,完成后看看實現(xiàn)度究竟有多少:

?

二,怎樣實現(xiàn)

準(zhǔn)備工作:

首先你須要下載lufylegend,最新版本號是1.7.5,用1.7.3都行。

下載地址:http://lufylegend.com/lufylegend

上面有它的API和論壇,能夠看看。

另外推薦一本相關(guān)圖書,lufy寫的,叫《HTML5 Canvas游戲開發(fā)實戰(zhàn)》。用于學(xué)習(xí)基礎(chǔ)和了解開發(fā)技巧還是不錯的。當(dāng)中另一些非常不錯的js技術(shù)指導(dǎo)。值得一看。

書籍介紹:http://lufylegend.com/book/view/1

?

開始編寫

因為lufylegend做的比較完美,那么我們封裝起來就比較簡單了。看看LTileMap完整構(gòu)造器:

?

[javascript]?view plaincopy
  • function?LTileMap(data,img,width,height){??
  • ????var?s?=?this;??
  • ????base(s,LSprite,[]);??
  • ????s.x?=?0;??
  • ????s.y?=?0;??
  • ????s.mapData?=?data;??
  • ????s.imgData?=?img;??
  • ????if(!width){??
  • ????????var?wbitmap?=?new?LBitmapData(s.imgData);??
  • ????????s.partWidth?=?wbitmap.image.width;??
  • ????}else{??
  • ????????s.partWidth?=?width;??
  • ????}??
  • ????if(!height){??
  • ????????var?hbitmap?=?new?LBitmapData(s.imgData);??
  • ????????s.partHeight?=?hbitmap.image.height;??
  • ????}else{??
  • ????????s.partHeight?=?height;??
  • ????}??
  • ????s.onshow();??
  • }??
  • 首先為了降低引擎的大小,我們把變量s和this等起來,下面用到this的地方就都能用s來實現(xiàn)了。

    ※lufy大神近期提示我:“把變量s和this等起來是為了防止this的指向發(fā)生變化,并不是單一降低引擎的大小。因為this的指向不一定一直指向當(dāng)前函數(shù)的。”在此再次感謝lufy的支持。

    ?

    首先我們讓它繼承LSprite,這樣假設(shè)我們改變x和y屬性后就能夠直接變換位置了。再追加兩個屬性:mapData和imgData。

    mapData是通過data參數(shù)賦值的,data的賦值應(yīng)該是一個二維數(shù)組,格式例如以下:

    ?

    [javascript]?view plaincopy
  • [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],????
  • [18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],????
  • [18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],????
  • [18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],????
  • [18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],????
  • [18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],????
  • [18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],????
  • [18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],????
  • [18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],????
  • [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]??
  • 它裝載著地圖塊的樣式,18相應(yīng)的圖塊和55相應(yīng)的圖塊是不一樣的。后面我們會細(xì)講。

    ?

    imgData顧名思義,它是一個裝圖片的容器。

    還有兩個參數(shù),它們是用來表示地圖快的高度和寬度的。比如每張地圖塊是32*42的,那么就要將width設(shè)為32,height設(shè)為42。這種話就會將裝滿地圖塊的圖片分成小地圖。比如我們把上面那張圖片分成每一個小地圖塊是32*32的,也就是說width設(shè)為32,height也設(shè)為32,那么就呈現(xiàn)現(xiàn)下面的形式:

    (以上圖片我直接用了lufy博客里的圖片)這時你能夠看看18和55所相應(yīng)的是什么。18是一棵樹,而55相應(yīng)的是水,因此我們就做到了讓每張地圖塊顯示得不同。

    接下來是onshow方法:

    ?

    [javascript]?view plaincopy
  • LTileMap.prototype.onshow?=?function(){??
  • ????var?s?=?this;??
  • ????var?mapdata?=?s.mapData;??
  • ????var?partWidth?=?s.partWidth;??
  • ????var?partHeight?=?s.partHeight;??
  • ??????
  • ????var?i,j;??
  • ????var?index,indexY,indexX;??
  • ????var?bitmapdata,bitmap;??
  • ??
  • ????for(i=0;i<mapdata.length;i++){??
  • ????????for(j=0;j<mapdata[0].length;j++){??
  • ????????????index?=?mapdata[i][j];??
  • ????????????indexY?=?Math.floor(index/mapdata.length);??
  • ????????????indexX?=?index?-?indexY*mapdata.length;??
  • ???
  • ????????????bitmapdata?=?new?LBitmapData(s.imgData,indexX*partWidth,indexY*partHeight,partWidth,partHeight);??
  • ????????????bitmap?=?new?LBitmap(bitmapdata);??
  • ????????????bitmap.x?=?j*partWidth?+?s.x;????
  • ????????????bitmap.y?=?i*partHeight?+?s.y;??
  • ??
  • ????????????s.addChild(bitmap);??
  • ????????????}??
  • ????}??
  • }??
  • 它的功能非常easy,就是畫出地圖。當(dāng)中的邏輯都非常easy。主要是這里:

    ?

    ?

    [javascript]?view plaincopy
  • for(i=0;i<mapdata.length;i++){??
  • ????for(j=0;j<mapdata[0].length;j++){??
  • ????????index?=?mapdata[i][j];??
  • ????????indexY?=?Math.floor(index/mapdata.length);??
  • ????????indexX?=?index?-?indexY*mapdata.length;??
  • ??
  • ????????bitmapdata?=?new?LBitmapData(s.imgData,indexX*partWidth,indexY*partHeight,partWidth,partHeight);??
  • ????????bitmap?=?new?LBitmap(bitmapdata);??
  • ????????bitmap.x?=?j*partWidth?+?s.x;????
  • ????????bitmap.y?=?i*partHeight?+?s.y;??
  • ??
  • ????????s.addChild(bitmap);??
  • ????}??
  • }??
  • 這一段代碼是畫出地圖的核心,首先它遍歷了地圖數(shù)組,然后每遍歷一個就畫一張,然后加到自身中。因為自身是繼承自LSprite,所當(dāng)?shù)貓D被加到自身中時,再將自身加究竟層或者其它Sprite中時,整個截面就會顯示。

    ?

    over,非常easy是不是?實現(xiàn)后我們怎么用它呢?看下面代碼:

    ?

    [html]?view plaincopy
  • <!DOCTYPE?html>??
  • <html?lang="en">??
  • ????<head>??
  • ????<meta?charset="utf-8"?/>??
  • ????<title>LTileMap</title>??
  • ????<script?type="text/javascript"?src="../lufylegend-1.7.3.min.js"></script>??
  • ????<script?type="text/javascript"?src="../lufylegendrpg-1.0.0.min.js"></script>???
  • ????<script>??
  • ????init(30,"legend",480,320,main);??
  • ????LGlobal.setDebug(true);??
  • ????var?backLayer,loadingLayer;??
  • ????var?map;??
  • ????var?loadData?=?[??
  • ????????{name:"map",path:"./map.jpg"}??
  • ????];??
  • ????var?imglist?=?[];??
  • ????var?mapData?=?[????
  • ????????[18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],????
  • ????????[18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],????
  • ????????[18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],????
  • ????????[18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],????
  • ????????[18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],????
  • ????????[18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],????
  • ????????[18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],????
  • ????????[18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],????
  • ????????[18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],????
  • ????????[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]??
  • ????];??
  • ????function?main(){??
  • ????????//添加進(jìn)度條??
  • ????????loadingLayer?=?new?LoadingSample1();???
  • ????????addChild(loadingLayer);???
  • ????????//載入圖片并顯示運行進(jìn)度??
  • ????????LLoadManage.load(??
  • ????????????loadData,??
  • ????????????function(progress){??
  • ????????????????loadingLayer.setProgress(progress);??
  • ????????????},??
  • ????????????gameInit??
  • ????????);???
  • ????}??
  • ????function?gameInit(result){??
  • ????????removeChild(loadingLayer);??
  • ????????imglist?=?result;??
  • ????????//初始化層??
  • ????????backLayer?=?new?LSprite();??
  • ????????addChild(backLayer);??
  • ????????//添加地圖??
  • ????????addMap();??
  • ????}??
  • ????function?addMap(){??
  • ????????map?=?new?LTileMap(mapData,imglist["map"],32,32);??
  • ????????backLayer.addChild(map);??
  • ????}??
  • ????</script>??
  • ????</head>??
  • ????<body>??
  • ????????????<div?id="legend"></div>??
  • ????</body>??
  • </html>??
  • 執(zhí)行代碼得到例如以下效果:

    ?

    為了防止大家以為我ps圖片,那我就不仿把測試鏈接給出,大家自己看吧。

    測試地址:http://www.cnblogs.com/yorhom/articles/3063759.html

    代碼非常少,能夠自己復(fù)制粘貼下來看看。哈!

    ?

    近期做了一個留言板,歡迎大家發(fā)表自己的意見

    留言板地址:http://www.cnblogs.com/yorhom/archive/2013/04/20/3033235.html

    ?

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

    歡迎大家轉(zhuǎn)載我的文章。

    轉(zhuǎn)載請注明:轉(zhuǎn)自Yorhom's Game Box

    歡迎繼續(xù)關(guān)注我的博客

    總結(jié)

    以上是生活随笔為你收集整理的如何实现一个HTML5 RPG游戏引擎——第一章,实现地图类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。