日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
HTML 5開發(fā)RPG游戲之四(游戲腳本化)

首先,本篇文章是零基礎(chǔ)開發(fā)RPG游戲-開源講座系列文章的第四篇,來實(shí)現(xiàn)游戲的腳本化,和利用游戲腳本實(shí)現(xiàn)地圖場景的切換,離上次更新貌似很長時(shí)間了,你在看下面的文字之前,需要先了解前三篇在下啰嗦了些什么東東。

薩爾圖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

一,什么是游戲腳本

簡單說,游戲腳本就是依據(jù)一定的格式編寫的可執(zhí)行文件,游戲可以通過腳本中自定義的語句來執(zhí)行相應(yīng)的邏輯。

二,為什么要將游戲腳本化

游戲腳本,可以令我們的游戲動(dòng)態(tài)化,比如當(dāng)我們開發(fā)了一款rpg游戲,里面的劇情,事件以及地圖等,我們?nèi)绻麑⑦@些全部寫進(jìn)程序里,當(dāng)然是可以的,但是一旦出現(xiàn)問題,哪怕幾個(gè)錯(cuò)別字,我們需要先將這幾個(gè)錯(cuò)別字改正,并且將整個(gè)程序重新編譯發(fā)布一遍,這個(gè)過程是相當(dāng)令人反感的,因?yàn)槿绻螒虻某绦蚋螒虻膬?nèi)容不斷進(jìn)行修改的話,那只會(huì)使你的程序越來越復(fù)雜。但是如果我們將這些可重復(fù)的數(shù)據(jù),都定義到游戲程序之外的文件里面,當(dāng)游戲引擎開發(fā)完畢,我們的游戲通過讀取這些外部文件,來執(zhí)行相應(yīng)的劇情和事件,那么,像上述當(dāng)我們的游戲出現(xiàn)了問題,我們只需要改動(dòng)這些外部文件就可以了,并不需要重新編譯整個(gè)程序,這樣便使得我們的游戲開發(fā),變得便利簡潔。

當(dāng)然,對于html5來說,不需要重新編譯程序,但是對于rpg的游戲來說,腳本還是必不可少的,因?yàn)橛螒虻膭”静豢赡苋紝懙匠绦蚶?..

三,如何來實(shí)現(xiàn)游戲的腳本化

好了,接下來,先來考慮以什么形式來制作游戲的腳本,我們有多種選擇,可以選擇xml,可以選擇json,也可以選擇純自定義語法,

這次,我為了省事,選用比較方便處理的json,因?yàn)閖avascript可以很輕松的處理json數(shù)據(jù)。

目前游戲中實(shí)現(xiàn)的內(nèi)容有,地圖場景添加,游戲人物添加,以及人物對話的實(shí)現(xiàn)。那么,我在設(shè)計(jì)游戲腳本的時(shí)候,必須包含這些數(shù)據(jù),然后才能將這三項(xiàng)功能用腳本來控制。

首先看下面的json

 
 
 
 
  1. var script = {  
  2.     stage01:{  
  3.         map:[  
  4.             [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],  
  5.             [18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],  
  6.             [18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],  
  7.             [18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],  
  8.             [18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],  
  9.             [18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],  
  10.             [18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,18],  
  11.             [18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],  
  12.             [18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],  
  13.             [18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],  
  14.             [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]],  
  15.         mapdata:[  
  16.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],  
  17.             [1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],  
  18.             [1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],  
  19.             [1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],  
  20.             [1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],  
  21.             [1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],  
  22.             [1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1],  
  23.             [1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],  
  24.             [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],  
  25.             [1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],  
  26.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],  
  27.         add:[  
  28.              {chara:"player",img:"mingren",x:5,y:6},  
  29.              {chara:"npc",img:"npc1",x:7,y:6},  
  30.              {chara:"npc",img:"npc1",x:3,y:3}],  
  31.         talk:{  
  32.             talk1:[  
  33.                       {img:"m",name:"鳴人",msg:"我是木葉村的鳴人,你是誰?"},  
  34.                       {img:"n",name:"黑衣忍者甲",msg:"你就是鳴人?九尾還在你身體里嗎?"}  
  35.                   ],  
  36.             talk2:[  
  37.                       {img:"n",name:"黑衣忍者乙",msg:"鳴人,聽說忍者大戰(zhàn)就要開始了。"},  
  38.                       {img:"m",name:"鳴人",msg:"真的嗎?一定要想想辦法啊。"}  
  39.                   ]  
  40.         }  
  41.     }  
  42.  
  43.  
  44. }; 

我將腳本定義成了變量,實(shí)際游戲制作的時(shí)候,腳本應(yīng)該儲(chǔ)存到一個(gè)外部文檔當(dāng)中,在這里我只是講解一下理論,如何完善那是后話了,哈。

可以看到,json中,包含了地圖相關(guān)的map數(shù)組和mapdata數(shù)組,添加人物的相關(guān)數(shù)據(jù),以及對話的數(shù)組。這樣,我在游戲顯示的時(shí)候,只需要讀入json數(shù)據(jù),然后根據(jù)這些內(nèi)容來顯示游戲畫面就可以了,定義一個(gè)initScript函數(shù)來進(jìn)行這些操作。

 
 
 
 
  1. function initScript(){  
  2.     //地圖位置初始化  
  3.     mapLayer.x = 0;  
  4.     mapLayer.y = 0;  
  5.  
  6.  
  7.     //地圖層初始化  
  8.     mapLayer.removeAllChild();  
  9.     //人物層初始化  
  10.     charaLayer.removeAllChild();  
  11.     //效果層初始化  
  12.     effectLayer.removeAllChild();  
  13.     //對話層初始化  
  14.     talkLayer.removeAllChild();  
  15.       
  16.     //地圖數(shù)據(jù)獲取  
  17.     map = stage.map;  
  18.     mapdata = stage.mapdata;  
  19.     //對話數(shù)據(jù)獲取  
  20.     talkScriptList = stage.talk;  
  21.       
  22.     //添加地圖  
  23.     addMap(0,0);  
  24.     delMap();  
  25.     //添加人物  
  26.     addChara();  

removeAllChild方法是legendForHtml5Programming引擎獨(dú)有的方法,可以用來移出LScript顯示層上的所有子對象,從而實(shí)現(xiàn)本游戲中各個(gè)顯示層的初始化工作。

修改一下addChara方法,如下

 
 
 
 
  1. //添加人物  
  2. function addChara(){  
  3.     var charaList = stage.add;  
  4.     var chara,charaObj;  
  5.     for(var i=0;i
  6.         charaObj = charaList[i];  
  7.         if(charaObj.chara == "player"){  
  8.             //加入英雄  
  9.             bitmapdata = new LBitmapData(imglist[charaObj.img]);  
  10.             chara = new Character(true,i,bitmapdata,4,4);  
  11.             player = chara;  
  12.         }else{  
  13.             //加入npc  
  14.             bitmapdata = new LBitmapData(imglist[charaObj.img]);  
  15.             chara = new Character(false,i,bitmapdata,4,4);  
  16.         }  
  17.         chara.x = charaObj.x * 32;  
  18.         chara.y = charaObj.y * 32;  
  19.         charaLayer.addChild(chara);  
  20.     }  

即,根據(jù)json腳本中的add數(shù)組,來添加游戲中的人物。

好了,運(yùn)行一下游戲,可以看到,游戲正常顯示了,和之前一模一樣,實(shí)現(xiàn)了同樣的功能.

#p#

四,利用游戲腳本實(shí)現(xiàn)地圖的切換

為了讓大家看到游戲腳本的便利性,現(xiàn)在利用腳本實(shí)現(xiàn)游戲中的場景切換。

將json腳本修改如下

 
 
 
 
  1. var script = {  
  2.     stage01:{  
  3.         map:[  
  4.             [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],  
  5.             [18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],  
  6.             [18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],  
  7.             [18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],  
  8.             [18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],  
  9.             [18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],  
  10.             [18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,18],  
  11.             [18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],  
  12.             [18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],  
  13.             [18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],  
  14.             [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]],  
  15.         mapdata:[  
  16.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],  
  17.             [1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],  
  18.             [1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],  
  19.             [1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],  
  20.             [1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],  
  21.             [1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],  
  22.             [1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1],  
  23.             [1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],  
  24.             [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],  
  25.             [1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],  
  26.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],  
  27.         add:[  
  28.              {chara:"player",img:"mingren",x:5,y:6},  
  29.              {chara:"npc",img:"npc1",x:7,y:6},  
  30.              {chara:"npc",img:"npc1",x:3,y:3}],  
  31.         talk:{  
  32.             talk1:[  
  33.                       {img:"m",name:"鳴人",msg:"我是木葉村的鳴人,你是誰?"},  
  34.                       {img:"n",name:"黑衣忍者甲",msg:"你就是鳴人?九尾還在你身體里嗎?"}  
  35.                   ],  
  36.             talk2:[  
  37.                       {img:"n",name:"黑衣忍者乙",msg:"鳴人,聽說忍者大戰(zhàn)就要開始了。"},  
  38.                       {img:"m",name:"鳴人",msg:"真的嗎?一定要想想辦法啊。"}  
  39.                   ]  
  40.         },  
  41.         jump:[  
  42.               {at:{x:6,y:5},to:"stage02"}  
  43.         ]  
  44.     },  
  45.     stage02:{  
  46.         map:[  
  47.             [0,0,1,2,2,2,2,2,2,2,2,1,0,0,0],  
  48.             [0,0,1,3,5,5,1,5,5,5,5,1,0,0,0],  
  49.             [0,0,1,80,4,4,1,80,4,4,4,1,0,0,0],  
  50.             [0,0,1,80,4,4,1,80,8,7,8,1,0,0,0],  
  51.             [0,0,1,80,4,4,5,81,4,4,4,1,0,0,0],  
  52.             [0,0,1,2,2,2,6,4,4,4,4,1,0,0,0],  
  53.             [0,0,1,3,5,5,81,4,4,4,4,1,0,0,0],  
  54.             [0,0,1,80,4,4,4,4,4,4,9,1,0,0,0],  
  55.             [0,0,1,2,2,2,2,6,2,2,2,1,0,0,0]],  
  56.         mapdata:[  
  57.             [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],  
  58.             [1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],  
  59.             [1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],  
  60.             [1,1,1,0,0,0,1,0,0,1,0,1,1,1,1],  
  61.             [1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],  
  62.             [1,1,1,1,1,1,0,0,0,0,0,1,1,1,1],  
  63.             [1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],  
  64.             [1,1,1,0,0,0,0,0,0,0,1,1,1,1,1],  
  65.             [1,1,1,1,1,1,1,0,1,1,1,1,1,1,1]],  
  66.         add:[  
  67.              {chara:"player",img:"mingren",x:7,y:8},  
  68.              {chara:"npc",img:"npc1",x:8,y:3},  
  69.              {chara:"npc",img:"npc1",x:10,y:3}],  
  70.         talk:{  
  71.               talk1:[  
  72.                         {img:"m",name:"鳴人",msg:"你們在干什么???"},  
  73.                         {img:"n",name:"黑衣忍者甲",msg:"我們在喝茶。"}  
  74.                   ],  
  75.               talk2:[  
  76.                         {img:"n",name:"黑衣忍者乙",msg:"我們在喝茶,你不要打擾我們。"},  
  77.                         {img:"m",name:"鳴人",msg:"....."}  
  78.                   ]  
  79.         },  
  80.         jump:[  
  81.               {at:{x:7,y:8},to:"stage01"}  
  82.         ]  
  83.     }  
  84.  
  85.  
  86. }; 

可以看到,我添加了stage02,即第二個(gè)場景,并且在腳本里引入了jump節(jié)點(diǎn)來控制游戲場景的切換,其中jump中的at表示游戲主人公移動(dòng)到達(dá)的坐標(biāo),to表示到達(dá)這個(gè)坐標(biāo)后跳轉(zhuǎn)到的畫面名稱。這里的jump之所以是數(shù)組,是因?yàn)橐粋€(gè)場景也可以跳轉(zhuǎn)到其他多個(gè)場景。

上面的腳本實(shí)現(xiàn)了stage01和stage02兩個(gè)場景的互相跳轉(zhuǎn)。

為了讀取這個(gè)jump,以及實(shí)現(xiàn)跳轉(zhuǎn),我們需要在游戲主人公移動(dòng)一個(gè)步長之后,判斷一下是否應(yīng)該跳轉(zhuǎn)了,修改Character類的onmove方法

 
 
 
 
  1. /**  
  2.  * 開始移動(dòng)   
  3.  **/ 
  4. Character.prototype.onmove = function (){  
  5.     var self = this;  
  6.     //設(shè)定一個(gè)移動(dòng)步長中的移動(dòng)次數(shù)  
  7.     var ml_cnt = 4;  
  8.     //計(jì)算一次移動(dòng)的長度  
  9.     var ml = STEP/ml_cnt;  
  10.     //根據(jù)移動(dòng)方向,開始移動(dòng)  
  11.     switch (self.direction){  
  12.         case UP:  
  13.             if(mapmove){  
  14.                 mapLayer.y += ml;  
  15.                 charaLayer.y += ml;  
  16.             }  
  17.             self.y -= ml;  
  18.             break;  
  19.         case LEFT:  
  20.             if(mapmove){  
  21.                 mapLayer.x += ml;  
  22.                 charaLayer.x += ml;  
  23.             }  
  24.             self.x -= ml;  
  25.             break;  
  26.         case RIGHT:  
  27.             if(mapmove){  
  28.                 mapLayer.x -= ml;  
  29.                 charaLayer.x -= ml;  
  30.             }  
  31.             self.x += ml;  
  32.             break;  
  33.         case DOWN:  
  34.             if(mapmove){  
  35.                 mapLayer.y -= ml;  
  36.                 charaLayer.y -= ml;  
  37.             }  
  38.             self.y += ml;  
  39.             break;  
  40.     }  
  41.     self.moveIndex++;  
  42.     //當(dāng)移動(dòng)次數(shù)等于設(shè)定的次數(shù),開始判斷是否繼續(xù)移動(dòng)  
  43.     if(self.moveIndex >= ml_cnt){  
  44.         //一個(gè)地圖步長移動(dòng)完成后,判斷地圖是否跳轉(zhuǎn)  
  45.         if(self.isHero && self.moveIndex > 0)checkJump();  
  46.         self.moveIndex = 0;  
  47.         //一個(gè)地圖步長移動(dòng)完成后,如果地圖處于滾動(dòng)狀態(tài),則移除多余地圖塊  
  48.         if(mapmove)delMap();  
  49.         //如果已經(jīng)松開移動(dòng)鍵,或者前方為障礙物,則停止移動(dòng),否則繼續(xù)移動(dòng)  
  50.         if(!isKeyDown || !self.checkRoad()){  
  51.             self.move = false;  
  52.             return;  
  53.         }else if(self.direction != self.direction_next){  
  54.             self.direction = self.direction_next;  
  55.             self.anime.setAction(self.direction);  
  56.         }  
  57.         //地圖是否滾動(dòng)  
  58.         self.checkMap(self.direction);  
  59.     }  
  60. }; 

我添加了一行

 
 
 
 
  1. if(self.isHero && self.moveIndex > 0)checkJump(); 

表示,移動(dòng)完后如果該人物是游戲主人公則進(jìn)行跳轉(zhuǎn)判斷

所以,我們需要添加一個(gè)checkJump方法

 
 
 
 
  1. //游戲場景跳轉(zhuǎn)測試  
  2. function checkJump(){  
  3.     var jump = stage.jump;  
  4.     var jumpstage;  
  5.     for(var i=0;i
  6.         jumpjumpstage = jump[0];  
  7.         if(player.x == jumpstage.at.x * 32 && player.y == jumpstage.at.y * 32){  
  8.             //獲取該場景腳本數(shù)據(jù)  
  9.             stage = script[jumpstage.to];  
  10.             //開始跳轉(zhuǎn)  
  11.             initScript(stage);  
  12.             return;  
  13.         }  
  14.     }  

好了,一切都很簡單吧,運(yùn)行游戲看看效果吧,小鳴人走到地圖的小房門的部分是,場景發(fā)生跳轉(zhuǎn)

游戲測試URL:http://fsanguo.comoj.com/html5/rpg5/index.html

本次更新源代碼下載:http://fsanguo.comoj.com/html5/rpg5/rpg5.rar


名稱欄目:HTML 5開發(fā)RPG游戲之四(游戲腳本化)
標(biāo)題來源:http://www.5511xx.com/article/coijpjs.html