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

HTML 5開發(fā)RPG游戲之三(卷軸和對話)

開發(fā) 前端
按照上圖說明,實現(xiàn)地圖滾動,只需要先把即將出現(xiàn)的地圖(圖中黃色部分)畫上,然后滾動地圖,待地圖滾動完畢之后,將屏幕之外的部分(圖中綠色部分)

前兩篇,RPG的開發(fā)已經(jīng)實現(xiàn)了添加地圖和添加游戲人物,本篇來實現(xiàn)地圖的卷軸滾動和人物對話的實現(xiàn),效果如下

本次開發(fā),更新了一下庫件至1.3,請點擊下面的鏈接,下載庫件1.3版以上版本

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

地圖的滾動

關(guān)于地圖的滾動原理,可以參照下圖

按照上圖說明,實現(xiàn)地圖滾動,只需要先把即將出現(xiàn)的地圖(圖中黃色部分)畫上,然后滾動地圖,待地圖滾動完畢之后,將屏幕之外的部分(圖中綠色部分)移除

首先要添加一個變量來控制地圖是否滾動

  1. //地圖滾動  
  2. var mapmove = false

然后,在人物移動的時候,判斷地圖是否需要滾動

  1. /**  
  2.  * 地圖是否滾動  
  3.  **/ 
  4. Character.prototype.checkMap = function (dir){  
  5.     var self = this;  
  6.     mapmove = false;  
  7.     //如果不是英雄,則地圖不需要滾動  
  8.     if(!self.isHero)return;  
  9.       
  10.     switch (dir){  
  11.         case UP:  
  12.             if(self.y + charaLayer.y> STEP)break;  
  13.             if(mapLayer.y >= 0)break;  
  14.             addMap(0,-1);  
  15.             mapmove = true;  
  16.             break;  
  17.         case LEFT:  
  18.             if(self.x + charaLayer.x > STEP)break;  
  19.             if(mapLayer.x >= 0)break;  
  20.             addMap(-1,0);  
  21.             mapmove = true;  
  22.             break;  
  23.         case RIGHT:  
  24.             if(self.x < 480 - 2*STEP)break;  
  25.             if(480 - mapLayer.x >= map[0].length*STEP)break;  
  26.             addMap(1,0);  
  27.             mapmove = true;  
  28.             break;  
  29.         case DOWN:  
  30.             if(self.y < 288 - 2*STEP)break;  
  31.             if(288 - mapLayer.y >= map.length*STEP)break;  
  32.             addMap(0,1);  
  33.             mapmove = true;  
  34.             break;  
  35.     }  
  36. }; 

在移動過程中,判斷地圖是否處于滾動狀態(tài),如果地圖處于滾動,則滾動地圖,否則移動人物

  1. /**  
  2.  * 開始移動   
  3.  **/ 
  4. Character.prototype.onmove = function (){  
  5.     var self = this;  
  6.     //設(shè)定一個移動步長中的移動次數(shù)  
  7.     var ml_cnt = 4;  
  8.     //計算一次移動的長度  
  9.     var ml = STEP/ml_cnt;  
  10.     //根據(jù)移動方向,開始移動  
  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)移動次數(shù)等于設(shè)定的次數(shù),開始判斷是否繼續(xù)移動  
  43.     if(self.moveIndex >= ml_cnt){  
  44.         //一個地圖步長移動完成后,如果地圖處于滾動狀態(tài),則移除多余地圖塊  
  45.         if(mapmove)delMap();  
  46.         self.moveIndex = 0;  
  47.         //如果已經(jīng)松開移動鍵,或者前方為障礙物,則停止移動,否則繼續(xù)移動  
  48.         if(!isKeyDown || !self.checkRoad()){  
  49.             self.move = false;  
  50.             return;  
  51.         }else if(self.direction != self.direction_next){  
  52.             self.direction = self.direction_next;  
  53.             self.anime.setAction(self.direction);  
  54.         }  
  55.         //地圖是否滾動  
  56.         self.checkMap(self.direction);  
  57.     }  
  58. }; 

最后,將地圖的數(shù)組和地形擴大為大于屏幕大小

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

為了實現(xiàn)地圖滾動,修改添加地圖的方法,根據(jù)參數(shù)來實現(xiàn)添加上面圖片的黃色地圖部分

  1. //添加地圖  
  2. function addMap(cx,cy){  
  3.     var i,j,index,indexX,indexY;  
  4.     var bitmapdata,bitmap;  
  5.     var mapX = mapLayer.x / STEP;  
  6.     var mapY = mapLayer.y / STEP;  
  7.     var mx = cx<0?-1:0,my = cy<0?-1:0;  
  8.     if(imageArray == null){  
  9.         //地圖圖片數(shù)據(jù)  
  10.         bitmapdata = new LBitmapData(imglist["map"]);  
  11.         //將地圖圖片拆分,得到拆分后的各個小圖片的坐標(biāo)數(shù)組  
  12.         imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,10,10);  
  13.     }  
  14.     mapLayer.removeAllChild();  
  15.     //在地圖層上,畫出15*10的小圖片  
  16.     for(i=my;i<9 +Math.abs(cy) && i-mapY < map.length;i++){  
  17.         for(j=mx;j<15 +Math.abs(cx)&& j-mapX < map[0].length;j++){  
  18.             //從地圖數(shù)組中得到相應(yīng)位置的圖片坐標(biāo)  
  19.             index = map[i-mapY][j-mapX];  
  20.             //小圖片的豎坐標(biāo)  
  21.             indexY = Math.floor(index /10);  
  22.             //小圖片的橫坐標(biāo)  
  23.             indexX = index - indexY*10;  
  24.             //得到小圖片  
  25.             bitmapdata = new LBitmapData(imglist["map"],indexX*32,indexY*32,32,32);  
  26.             bitmap = new LBitmap(bitmapdata);  
  27.             //設(shè)置小圖片的顯示位置  
  28.             bitmap.x = j*STEP - mapLayer.x;  
  29.             bitmap.y = i*STEP - mapLayer.y;  
  30.             //將小圖片顯示到地圖層  
  31.             mapLayer.addChild(bitmap);  
  32.         }  
  33.     }  
  34. }  
  35. //移除多余地圖塊  
  36. function delMap(){  
  37.     var bitmap,i;  
  38.     for(i=0;i<mapLayer.childList.length;i++){  
  39.         bitmap = mapLayer.childList[i];  
  40.         if(bitmap.x + mapLayer.x < 0 || bitmap.x + mapLayer.x >= 480 ||   
  41.                 bitmap.y + mapLayer.y < 0 || bitmap.y + mapLayer.y >= 288){  
  42.             mapLayer.removeChild(bitmap);  
  43.             i--;  
  44.         }  
  45.     }  

看一下效果如下

 

 


 

#p#

人物的對話

對話的實現(xiàn),在點擊控制按鈕的方形按鈕時添加,所以,先在鼠標(biāo)抬起的時候,判斷是否點擊了方形按鈕

  1. function onup(event){  
  2.     isKeyDown = false;  
  3.     if(event.offsetX >= ctrlLayer.x + 280 && event.offsetX <= ctrlLayer.x+330){  
  4.         if(event.offsetY >= ctrlLayer.y+40 && event.offsetY <= ctrlLayer.y+100){  
  5.             //對話  
  6.             addTalk();  
  7.         }  
  8.     }  

在完善addTalk()方法的時候,首先準(zhǔn)備好對話的內(nèi)容

  1. var talkScriptList = {  
  2.     "talk1":new Array(  
  3.         {img:"m",name:"鳴人",msg:"我是木葉村的鳴人,你是誰?"},  
  4.         {img:"n",name:"黑衣忍者甲",msg:"你就是鳴人?九尾還在你身體里嗎?"}  
  5.         ),  
  6.     "talk2":new Array(  
  7.         {img:"n",name:"黑衣忍者乙",msg:"鳴人,聽說忍者大戰(zhàn)就要開始了。"},  
  8.         {img:"m",name:"鳴人",msg:"真的嗎?一定要想想辦法啊。"}  
  9.         )  
  10. }; 

talk1,talk2中talk后面的數(shù)字,代表人物的編號,其中每個對話單位的img為人物的頭像,name為人物的名稱,msg為對話的內(nèi)容

添加對話時的做法是,當(dāng)點擊方形按鈕后,判斷小鳴人前方是否有人,如果有人,則將這個人物的編號取出來,再從上面的數(shù)組中獲取相應(yīng)的對話內(nèi)容,然后,將相應(yīng)的內(nèi)容顯示到游戲屏幕上,具體實現(xiàn)代碼如下

  1. //對話內(nèi)容  
  2. var talkScript;  
  3. var talkScriptList = {  
  4.     "talk1":new Array(  
  5.         {img:"m",name:"鳴人",msg:"我是木葉村的鳴人,你是誰?"},  
  6.         {img:"n",name:"黑衣忍者甲",msg:"你就是鳴人?九尾還在你身體里嗎?"}  
  7.         ),  
  8.     "talk2":new Array(  
  9.         {img:"n",name:"黑衣忍者乙",msg:"鳴人,聽說忍者大戰(zhàn)就要開始了。"},  
  10.         {img:"m",name:"鳴人",msg:"真的嗎?一定要想想辦法啊。"}  
  11.         )  
  12. };  
  13. //對話序號  
  14. var talkIndex = 0;  
  15. //對話中  
  16. var talking = false;  
  17.  
  18. /**  
  19.  * 添加對話  
  20.  * */ 
  21. function addTalk(){  
  22.     //如果對話內(nèi)容為空,則開始判斷是否可以對話  
  23.     if(talkScript == null){  
  24.         var key,tx = player.x,ty = player.y;  
  25.         switch (player.direction){  
  26.         case UP:  
  27.             ty -= STEP;  
  28.             break;  
  29.         case LEFT:  
  30.             tx -= STEP;  
  31.             break;  
  32.         case RIGHT:  
  33.             tx += STEP;  
  34.             break;  
  35.         case DOWN:  
  36.             ty += STEP;  
  37.             break;  
  38.         }  
  39.         for(key in charaLayer.childList){  
  40.             //判斷前面又沒有npc,有則開始對話  
  41.             if(charaLayer.childList[key].x == tx && charaLayer.childList[key].y == ty){  
  42.                 if(talkScriptList["talk"+charaLayer.childList[key].index]){  
  43.                     talkScript = talkScriptList["talk"+charaLayer.childList[key].index];  
  44.                     talkIndex = 0;  
  45.                 }  
  46.             }  
  47.         }  
  48.         //如果前方?jīng)]有npc,則返回  
  49.         if(talkScript == null)return;  
  50.     }  
  51.     //將對話層清空  
  52.     talkLayer.removeAllChild();  
  53.     //當(dāng)對話開始,且按照順序進行對話  
  54.     if(talkIndex < talkScript.length){  
  55.         //得到對話內(nèi)容  
  56.         var talkObject = talkScript[talkIndex];  
  57.         //對話背景  
  58.         bitmapdata = new LBitmapData(imglist["talk"]);  
  59.         bitmap = new LBitmap(bitmapdata);  
  60.         bitmap.width = 330;  
  61.         bitmap.height = 70;  
  62.         bitmap.x = 100;  
  63.         bitmap.y = 20;  
  64.         bitmap.alpha = 0.7;  
  65.         talkLayer.addChild(bitmap);  
  66.         //對話頭像  
  67.         bitmapdata = new LBitmapData(imglist[talkObject.img]);  
  68.         bitmap = new LBitmap(bitmapdata);  
  69.         bitmap.x = 0;  
  70.         bitmap.y = 0;  
  71.         talkLayer.addChild(bitmap);  
  72.         //對話人物名稱  
  73.         var name = new LTextField();  
  74.         name.x = 110;  
  75.         name.y = 30;  
  76.         name.size = "14";  
  77.         name.color = "#FFFFFF";  
  78.         name.text = "[" + talkObject.name + "]";  
  79.         talkLayer.addChild(name);  
  80.         //對話內(nèi)容  
  81.         var msg = new LTextField();  
  82.         msg.x = 110;  
  83.         msg.y = 55;  
  84.         msg.color = "#FFFFFF";  
  85.         msg.text = talkObject.msg;  
  86.         talkLayer.addChild(msg);  
  87.         //對話內(nèi)容逐字顯示  
  88.         msg.wind();  
  89.         talkLayer.x = 20;  
  90.         talkLayer.y = 50;  
  91.         talkIndex++;  
  92.     }else{  
  93.         //對話結(jié)束  
  94.         talkScript = null;  
  95.     }  

效果看下圖

 

游戲演示地址:http://fsanguo.comoj.com/html5/rpg3/index.html

之前其他地方也稍微做了修改,具體修改請看源代碼,此次更新源代碼,下載地址如下:http://fsanguo.comoj.com/html5/rpg5/rpg5.rar

原文鏈接:http://www.cnblogs.com/html5cn/articles/2337032.html

【編輯推薦】

  1. HTML 5開發(fā)RPG游戲之一(地圖人物實現(xiàn))
  2. HTML 5開發(fā)RPG游戲之二(跑起來吧英雄)
  3. HTML 5開發(fā)RPG游戲之四(游戲腳本化)
  4. 開發(fā)HTML5跨平臺游戲相關(guān)經(jīng)驗
  5. HTML 5開發(fā)的優(yōu)秀網(wǎng)頁游戲

 

責(zé)任編輯:張偉 來源: HTML5中國的博客
相關(guān)推薦

2012-05-15 13:57:41

HTML5

2012-05-15 13:10:57

HTML5

2012-05-15 13:29:20

HTML5

2012-09-17 09:32:16

JavaScriptJSHTML5

2012-05-15 10:35:35

HTML5

2012-01-06 14:10:13

HTML 5

2013-05-20 17:07:26

2015-07-08 16:38:10

Cocos游戲引擎

2012-03-06 10:56:32

HTML 5

2012-05-09 09:41:58

HTML5

2012-05-30 13:17:46

HTML5

2013-06-21 13:33:46

HTML 5游戲

2012-05-10 09:45:14

HTML5

2011-12-21 09:38:31

HTML 5

2014-12-30 17:13:51

HTML5

2012-11-07 09:43:58

IBMdw

2013-01-04 11:40:54

2013-06-26 10:14:40

2012-06-06 14:46:52

HTML5

2014-11-12 16:00:12

火舞游戲
點贊
收藏

51CTO技術(shù)棧公眾號