html5遊戲開發-零基礎開發RPG遊戲-開源講座(一)

 

因爲上一篇雷電的開發中,有朋友反應不太理解,本篇將以零基礎的視點,來講解如何開發一款RPG遊戲。

在遊戲的世界裏,我們可以看到各種地圖,各種遊戲人物,看到人物在地圖上行走,對話等,無論是地圖還是人物,其實都是圖片的處理與顯示,把不同的圖片顯示到屏幕上,我們就看到不同的遊戲界面,要想讓這些圖片同時顯示到界面上,我們就需要處理好層次,讓他們來分層顯示,我們可以想象,如果遊戲人物顯示在地圖的下層的話,顯然會被地圖遮擋住。
一款RPG遊戲,我簡單把它分爲地圖層,人物層,效果層(一些法術效果等),對話層,控制層(按鈕菜單等)。

如下圖

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

下面,我們一步步來實現一個簡單的RPG遊戲的開發


準備工作

一,庫件下載

本遊戲開發,需要用到開源庫件:LegendForHtml5Programming

請到這裏下載最新版的LegendForHtml5Programming,本次開發需要1.2版以上

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

庫件的開發過程請看這裏

http://blog.csdn.net/lufy_legend/article/details/6844949

二,庫件配置

首先建立一個文件夾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的值,來配置庫件的路徑


遊戲地圖的實現

接下來,我們先來畫最底層的地圖層,
地圖當然就是是由圖片來組成的,如何在畫面上顯示一張圖片,我之前已經寫過專門的文章,代碼如下

  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://blog.csdn.net/lufy_legend/article/details/6753032

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

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

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


接下來,打開Main.js

在裏面加入

  1. init(50,"mylegend",480,320,main);  
在legendForHtml5Progarmming中,用init這個函數來初始化canvas,上面的代碼表示,初始化一個速度爲50,名字爲mylegend,大小爲480*320的遊戲界面,初始化完成後調用main(),這個速度值是說每個多少毫秒遊戲循環一次,所以這個值設定的越小,遊戲運行的速度就越快

因爲要調用main方法,所以我們要寫一個main方法,main方法裏做一些簡單的準備工作。

雖說讀取圖片只需要一個

  1. loader.load("map.jpg","bitmapData");    
但是遊戲中往往用到很多張圖片,你可以用到哪一張再加載哪一張,也可以一次性全部加載完,然後再開始顯示遊戲

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

具體實現看下面的代碼

  1. //圖片path數組   
  2. var imgData = new Array();  
  3. //讀取完的圖片數組   
  4. var imglist = {};  
  5.   
  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.     //儲存圖片數據   
  38.     imglist[imgData[loadIndex].name] = loader.content;  
  39.     //讀取下一張圖片   
  40.     loadIndex++;  
  41.     loadImage();  
  42. }  
上面的代碼不難明白,當圖片沒有讀取完之前,會不斷循環loadImage和loadComplete兩個方法,當讀取完之後,移除進度條,用legendLoadOver告訴遊戲已經讀取完成,然後調用gameInit方法,進行遊戲的初始化工作。

看gameInit方法

  1. function gameInit(event){  
  2.     //遊戲層顯示初始化   
  3.     layerInit();  
  4.     //添加地圖   
  5.     addMap();  
  6.     //添加人物   
  7.     addChara();  
  8. }  
在gameInit方法中,首先進行遊戲層的初始化,然後添加遊戲地圖,然後添加人物
遊戲層顯示初始化,按照我們一開始所說,我們一次來初始化地圖層,人物層,效果層,對話層,控制層

  1. //遊戲層顯示初始化   
  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. }  
有了遊戲層次的劃分,我們在添加遊戲對象的時候,將地圖添加到地圖層,人物添加到人物層,他們就會依次顯示在遊戲的界面上

下面開始添加地圖

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

  1. //地圖圖片數組   
  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. ];  
這些數字分別對應着圖中如下位置


然後看下面代碼

  1. //添加地圖   
  2. function addMap(){  
  3.     var i,j,index,indexX,indexY;  
  4.     var bitmapdata,bitmap;  
  5.     //地圖圖片數據   
  6.     bitmapdata = new LBitmapData(imglist["map"]);  
  7.     //將地圖圖片拆分,得到拆分後的各個小圖片的座標數組   
  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.             //從地圖數組中得到相應位置的圖片座標   
  14.             index = map[i][j];  
  15.             //小圖片的豎座標   
  16.             indexY = Math.floor(index /10);  
  17.             //小圖片的橫座標   
  18.             indexX = 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. }  
然後運行遊戲

可以得到下面畫面



遊戲人物的實現

爲了更好的實現遊戲人物的控制,我們新建一個遊戲人物類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.     //得到人物圖片拆分數組   
  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類,用來實現圖片數組順序播放,形成動畫

使用LAnimation類需要三個參數,一個是顯示動畫的層,一個是圖片,一個是圖片的座標數組

然後,調用LAnimation類的onframe方法,就可以實現動畫的播放了

在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的末尾添加循環事件

  1. //添加貞事件,開始遊戲循環   
  2.     backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);  
最後,添加onframe方法
  1. /** 
  2.  * 循環 
  3.  * */  
  4. function onframe(){  
  5.     player.onframe();  
  6. }  

運行代碼,看到了嗎

一個會動的鳴人出現在遊戲的地圖上了


遊戲演示

http://fsanguo.comoj.com/html5/rpg/index.html

最後,附上這次的遊戲源代碼

http://legend-demo.googlecode.com/files/rpg.zip


下次,就要添加控制層,實現人物的走動和地圖的滾動等,希望大家多多支持。

發佈了37 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章