自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTML 5開發(fā)RPG游戲之一(地圖人物實現(xiàn))

開發(fā) 前端
在游戲的世界里,我們可以看到各種地圖,各種游戲人物,看到人物在地圖上行走,對話等,無論是地圖還是人物,其實都是圖片的處理與顯示,把不同的圖片顯示到屏幕上。

本篇將以零基礎的視點,來講解如何開發(fā)一款RPG游戲。

在游戲的世界里,我們可以看到各種地圖,各種游戲人物,看到人物在地圖上行走,對話等,無論是地圖還是人物,其實都是圖片的處理與顯示,把不同的圖片顯示到屏幕上,我們就看到不同的游戲界面,要想讓這些圖片同時顯示到界面上,我們就需要處理好層次,讓他們來分層顯示,我們可以想象,如果游戲人物顯示在地圖的下層的話,顯然會被地圖遮擋住。

一款RPG游戲,我簡單把它分為地圖層,人物層,效果層(一些法術效果等),對話層,控制層(按鈕菜單等)。

如下圖

我們只要依次將圖片畫在屏幕上,游戲人物將站在地圖上,如果有對話,對話將出現(xiàn)在人物和地圖的上面,而按鈕等控件會出現(xiàn)在游戲的最外層

下面,我們一步步來實現(xiàn)一個簡單的RPG游戲的開發(fā)

準備工作

一,庫件下載

本游戲開發(fā),需要用到開源庫件:LegendForHtml5Programming

請到這里下載***版的LegendForHtml5Programming,本次開發(fā)需要1.2版以上

http://code.google.com/p/legendforhtml5programming/downloads/list

庫件的開發(fā)過程請看這里

http://bbs.html5cn.org/thread-2712-1-1.html

二,庫件配置

首先建立一個文件夾rpg(你也可以起其他的名字)

然后將下載的庫件解壓,解壓后將legend文件夾放到與rpg文件夾同目錄

然后,在rpg文件夾里建一個index.html文件和一個js文件夾,在js文件夾里建一個Main.js文件

***,在index.html里加入下面的代碼

  1. <!DOCTYPE html> 
  2. <html>   
  3. <head>   
  4. <meta charset="UTF-8">   
  5. <title>rpg</title>   
  6. </head>   
  7. <body>   
  8. <div id="mylegend">loading……</div>   
  9. <!-- 引入LegendForHtml5Programming庫件 -->   
  10. <script type="text/javascript" src="../legend/legend.js"></script>    
  11. <script type="text/javascript" src="./js/Main.js"></script>    
  12. </body></html>   

當然,你也可以將legend文件夾放到其他地方,但是你需要修改legend文件夾下的legend.js文件中的LEGEND_PATH的值,來配置庫件的路徑

游戲地圖的實現(xiàn)

接下來,我們先來畫***層的地圖層,

地圖當然就是是由圖片來組成的,如何在畫面上顯示一張圖片,我之前已經(jīng)寫過專門的文章,代碼如下

  1. var loader;    
  2. function main(){     
  3.     loader = new LLoader();     
  4.     loader.addEventListener(LEvent.COMPLETE,loadBitmapdata);     
  5.     loader.load("map.jpg","bitmapData");     
  6. }     
  7. function loadBitmapdata(event){     
  8.     var bitmapdata = new LBitmapData(loader.content);     
  9.     var bitmap = new LBitmap(bitmapdata);     
  10.     addChild(bitmap);     
  11. }     

如果想更詳細了解的話,看下面的帖子

用仿ActionScript的語法來編寫html5——***篇,顯示一張圖片http://bbs.html5cn.org/thread-2700-1-1.html

游戲中的地圖可以是一張比較大的圖片,即整個圖片就是游戲的地圖,當人物或者地圖移動的時候,改變圖片顯示的區(qū)域范圍,從而實現(xiàn)地圖的滾動和顯示等,這樣的話,必須為每個場景準備一張地圖。

另外,地圖也可以是由許多小的地圖塊兒來組成,比如,我們熟悉的《吞食天地》,《勇者斗惡龍》等經(jīng)典小型rpg游戲,這樣的地圖,我們需要準備一張或幾張地圖塊兒,把這些地圖塊組合成地圖來顯示,比如下圖

0_13238754463fxE.gif

在地圖顯示的時候,首先把圖片切割,然后在根據(jù)預先設定好的位置顯示到地圖層上,這樣我們就看到了一張完整的地圖了

接下來,打開Main.js

在里面加入

  1. init(50,"mylegend",480,320,main); 

在legendForHtml5Progarmming中,用init這個函數(shù)來初始化canvas,上面的代碼表示,初始化一個速度為50,名字為mylegend,大小為480*320的游戲界面,初始化完成后調(diào)用main(),這個速度值是說每個多少毫秒游戲循環(huán)一次,所以這個值設定的越小,游戲運行的速度就越快

因為要調(diào)用main方法,所以我們要寫一個main方法,main方法里做一些簡單的準備工作。

雖說讀取圖片只需要一個

  1. loader.load("map.jpg","bitmapData");    

但是游戲中往往用到很多張圖片,你可以用到哪一張再加載哪一張,也可以一次性全部加載完,然后再開始顯示游戲

為了一次性把圖片加載完,我的做法是,將需要的圖片放到一個數(shù)組里,然后設定一個索引,每加載一個圖片,讓這個索引加1,當這個索引小于數(shù)組的長度,則繼續(xù)加載,直到將數(shù)組中的圖片全部加載完,然后開始進行下一步的工作

#p#

具體實現(xiàn)看下面的代碼 

  1. //圖片path數(shù)組  
  2.  
  3. var imgData = new Array();   
  4. //讀取完的圖片數(shù)組   
  5. var imglist = {};   
  6. function main(){   
  7.         //準備讀取圖片   
  8.         imgData.push({name:"map",path:"./image/map.jpg"});   
  9.         imgData.push({name:"mingren",path:"./image/mingren.png"});   
  10.         imgData.push({name:"e1",path:"./image/e1.png"});   
  11.         imgData.push({name:"e2",path:"./image/e2.png"});   
  12.         //實例化進度條層   
  13.         loadingLayer = new LSprite();   
  14.         loadingLayer.graphics.drawRect(1,"black",[50, 200, 200, 20],true,"#ffffff");   
  15.         addChild(loadingLayer);   
  16.         //開始讀取圖片   
  17.         loadImage();   
  18. }   
  19. function loadImage(){   
  20.         //圖片全部讀取完成,開始初始化游戲   
  21.         if(loadIndex >= imgData.length){   
  22.                 removeChild(loadingLayer);   
  23.                 legendLoadOver();   
  24.                 gameInit();   
  25.                 return;   
  26.         }   
  27.         //開始讀取圖片   
  28.         loader = new LLoader();   
  29.         loader.addEventListener(LEvent.COMPLETE,loadComplete);   
  30.         loader.load(imgData[loadIndex].path,"bitmapData");   
  31. }   
  32. function loadComplete(event){   
  33.         //進度條顯示   
  34.         loadingLayer.graphics.clear();   
  35.         loadingLayer.graphics.drawRect(1,"black",[50, 200, 200, 20],true,"#ffffff");   
  36.         loadingLayer.graphics.drawRect(1,"black",[50, 203, 200*(loadIndex/imgData.length), 14],true,"#000000");   
  37.         //儲存圖片數(shù)據(jù)   
  38.         imglist[imgData[loadIndex].name] = loader.content;   
  39.         //讀取下一張圖片   
  40.         loadIndex++;   
  41.         loadImage();   
  42. }   

上面的代碼不難明白,當圖片沒有讀取完之前,會不斷循環(huán)loadImage和loadComplete兩個方法,當讀取完之后,移除進度條,用legendLoadOver告訴游戲已經(jīng)讀取完成,然后調(diào)用gameInit方法,進行游戲的初始化工作。

看gameInit方法

  1. function gameInit(event){  
  2.         //游戲?qū)语@示初始化   
  3.         layerInit();   
  4.         //添加地圖   
  5.         addMap();   
  6.         //添加人物   
  7.         addChara();   
  8. }   

在gameInit方法中,首先進行游戲?qū)拥某跏蓟?,然后添加游戲地圖,然后添加人物

游戲?qū)语@示初始化,按照我們一開始所說,我們一次來初始化地圖層,人物層,效果層,對話層,控制層

  1. //游戲?qū)语@示初始化  
  2. function layerInit(){   
  3.         //游戲底層添加   
  4.         backLayer = new LSprite();   
  5.         addChild(backLayer);   
  6.         //地圖層添加   
  7.         mapLayer = new LSprite();   
  8.         backLayer.addChild(mapLayer);   
  9.         //人物層添加   
  10.         charaLayer = new LSprite();   
  11.         backLayer.addChild(charaLayer);   
  12.         //效果層添加   
  13.         effectLayer = new LSprite();   
  14.         backLayer.addChild(effectLayer);   
  15.         //對話層添加   
  16.         talkLayer = new LSprite();   
  17.         backLayer.addChild(talkLayer);   
  18.         //控制層添加   
  19.         ctrlLayer = new LSprite();   
  20.         backLayer.addChild(ctrlLayer);   
  21. }  

有了游戲?qū)哟蔚膭澐?,我們在添加游戲?qū)ο蟮臅r候,將地圖添加到地圖層,人物添加到人物層,他們就會依次顯示在游戲的界面

下面開始添加地圖

首先我們需要準備好顯示地圖的數(shù)組

  1. //地圖圖片數(shù)組  
  2. var map = [   
  3. [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],   
  4. [18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],   
  5. [18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],   
  6. [18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],   
  7. [18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],   
  8. [18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],   
  9. [18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],   
  10. [18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],   
  11. [18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],   
  12. [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]   
  13. ];   

這些數(shù)字分別對應著圖中如下位置

0_13238754743Gp2.gif

然后看下面代碼

  1. //添加地圖  
  2. function addMap(){   
  3.         var i,j,index,indexX,indexY;   
  4.         var bitmapdata,bitmap;   
  5.         //地圖圖片數(shù)據(jù)   
  6.         bitmapdata = new LBitmapData(imglist["map"]);   
  7.         //將地圖圖片拆分,得到拆分后的各個小圖片的坐標數(shù)組   
  8.         imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,10,10);   
  9.  
  10.         //在地圖層上,畫出15*10的小圖片   
  11.         for(i=0;i<10;i++){   
  12.                 for(j=0;j<15;j++){   
  13.                         //從地圖數(shù)組中得到相應位置的圖片坐標   
  14.                         index = map[i][j];   
  15.                         //小圖片的豎坐標   
  16.                         indexY = Math.floor(index /10);   
  17.                         //小圖片的橫坐標   
  18.                         indexindexX = index - indexY*10;   
  19.                         //得到小圖片   
  20.                         bitmapdata = new LBitmapData(imglist["map"],indexX*32,indexY*32,32,32);   
  21.                         bitmap = new LBitmap(bitmapdata);   
  22.                         //設置小圖片的顯示位置   
  23.                         bitmap.x = j*32;   
  24.                         bitmap.y = i*32;   
  25.                         //將小圖片顯示到地圖層   
  26.                         mapLayer.addChild(bitmap);   
  27.                 }   
  28.         }   
  29. }   

這樣,我們就把預先設置好的圖片顯示到了游戲界面上,形成了地圖

先把addChara方法加上

  1. //添加人物  
  2. function addChara(){   
  3. }   

然后運行游戲,可以得到下面畫面

0_1323875497G8BG.gif

游戲人物的實現(xiàn)

為了更好的實現(xiàn)游戲人物的控制,我們新建一個游戲人物類Character.js

里面代碼如下

  1. function Character(data,row,col,speed){  
  2.         base(this,LSprite,[]);   
  3.         var self = this;   
  4.         //設定人物動作速度   
  5.         self.speed = speed==null?3:speed;   
  6.         self.speedIndex = 0;   
  7.         //設定人物大小   
  8.         data.setProperties(0,0,data.image.width/col,data.image.height/row);   
  9.         //得到人物圖片拆分數(shù)組   
  10.         var list = LGlobal.divideCoordinate(data.image.width,data.image.height,row,col);   
  11.         //設定人物動畫   
  12.         self.anime = new LAnimation(this,data,list);   
  13. };   
  14. Character.prototype.onframe = function (){   
  15.         var self = this;   
  16.         if(self.speedIndex++ < self.speed)return;   
  17.         self.speedIndex = 0;   
  18.         self.anime.onframe();   
  19. };   

在legendForHtml5Programming里,有一個LAnimation類,用來實現(xiàn)圖片數(shù)組順序播放,形成動畫。使用LAnimation類需要三個參數(shù),一個是顯示動畫的層,一個是圖片,一個是圖片的坐標數(shù)組

然后,調(diào)用LAnimation類的onframe方法,就可以實現(xiàn)動畫的播放了

在index.html中引入Character類,然后修改addChara方法

  1. //添加人物  
  2. function addChara(){   
  3.         bitmapdata = new LBitmapData(imglist["mingren"]);   
  4.         player = new Character(bitmapdata,4,4);   
  5.         player.x = 32*5;   
  6.         player.y = 32*6;   
  7.         charaLayer.addChild(player);   
  8.            
  9. }   

在gameInit的末尾添加循環(huán)事件

  1. //添加貞事件,開始游戲循環(huán)  
  2.         backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);   

***,添加onframe方法

  1. function onframe(){   
  2.         player.onframe();   
  3. }   

運行代碼,看到了嗎

一個會動的鳴人出現(xiàn)在游戲的地圖上了

責任編輯:張偉 來源: HTML5中國的博客
相關推薦

2012-05-15 13:57:41

HTML5

2012-05-15 13:44:00

HTML5中國

2012-05-15 13:29:20

HTML5

2012-05-15 10:35:35

HTML5

2012-01-06 14:10:13

HTML 5

2012-09-24 11:11:32

HTML5游戲開發(fā)JavaScript

2012-09-17 09:32:16

JavaScriptJSHTML5

2015-07-08 16:38:10

Cocos游戲引擎

2012-03-06 10:56:32

HTML 5

2012-05-09 09:41:58

HTML5

2013-06-21 13:33:46

HTML 5游戲

2012-05-10 09:45:14

HTML5

2011-12-21 09:38:31

HTML 5

2013-06-26 10:14:40

2012-06-06 14:46:52

HTML5

2013-05-20 16:53:55

Android游戲開發(fā)長按事件

2014-11-12 16:00:12

火舞游戲

2015-10-23 13:44:14

巴巴獵

2016-01-05 09:39:32

HTML5游戲開發(fā)工具

2013-01-08 11:00:20

IBMdW
點贊
收藏

51CTO技術棧公眾號