成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML 5開發RPG游戲之二(跑起來吧英雄)

開發 前端
要控制游戲的人物,首先,我們要由控制事件,當觸發這個事件的時候,就來調用相應的方法,做我們想要的做的處理setCoordinate和getCoordinate是設定和得到人物當前的坐標。

上一篇中,已經詳細講解了,如何添加地圖,以及添加了一個游戲人物,現在我們來添加控制事件,讓這個小英雄走動起來

0_1323875534sUfb (1).gif

我們已經給游戲人物建立了一個Character類,

現在先來在類里加入

  1. Character.prototype.changeDir = function (dir){  
  2. };  
  3. /**  
  4.  * 設定人物坐標  
  5.  * @param x方向坐標,y方向坐標   
  6.  **/  
  7. Character.prototype.setCoordinate = function (sx,sy){  
  8. };  
  9. /**  
  10.  * 獲取人物坐標  
  11.  **/  
  12. Character.prototype.getCoordinate = function (){  
  13. }; 

changeDir 這個方法用來從外部控制人物方向和移動

要控制游戲的人物,首先,我們要由控制事件,當觸發這個事件的時候,就來調用相應的方法,做我們想要的做的處理setCoordinate和getCoordinate是設定和得到人物當前的坐標

首先,為了適應智能手機,我們暫時不用鍵盤事件,而是用點擊事件,所以我們先來添加兩個控制按鈕,在Main.js的gameInit方法的最下方,添加如下代碼

  1. //添加控制按鈕  
  2.     bitmapdata = new LBitmapData(imglist["e1"]);  
  3.     bitmap = new LBitmap(bitmapdata);  
  4.     bitmap.x = 0;  
  5.     bitmap.y = 0;  
  6.     ctrlLayer.addChild(bitmap);  
  7.     bitmapdata = new LBitmapData(imglist["e2"]);  
  8.     bitmap = new LBitmap(bitmapdata);  
  9.     bitmap.x = 280;  
  10.     bitmap.y = 30;  
  11.     ctrlLayer.addChild(bitmap);  
  12.     ctrlLayer.x = 40;  
  13.     ctrlLayer.y = 180

運行代碼,得到預覽如下

0_1323996441iWWB.gif

在添加控制事件之前,為了實現控制方便,我們先來添加幾個變量

  1. //方向變量  
  2. var DOWN = 0;  
  3. var LEFT = 1;  
  4. var RIGHT = 2;  
  5. var UP = 3;  
  6. var STEP = 32;  
  7. //點擊狀態  
  8. var isKeyDown = false

STEP代表移動步長,因為地圖是有32*32的小圖片來組成的,所以我們設定人物移動的步長為32

方向變量的0,1,2,3分別對應下面圖片中的第1,2,3,4行的方向

0_1323998361U1vb.gif

之所以添加點擊狀態,是因為,當我們按下移動按鈕沒有抬起的時候,人物應該始終處于移動狀態,所以用這個變量來區分,我們是否按下或者抬起好了,做好了準備工作,現在就開始添加移動事件

  1. //添加點擊控制事件  
  2.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,ondown);  
  3.     backLayer.addEventListener(LMouseEvent.MOUSE_UP,onup);  
  4.  
  5. function ondown(event){  
  6.     //根據點擊位置,判斷移動方向  
  7.     if(event.offsetX >= ctrlLayer.x + 40 && event.offsetX <= ctrlLayer.x+80){  
  8.         if(event.offsetY >= ctrlLayer.y && event.offsetY <= ctrlLayer.y+40){  
  9.             player.changeDir(UP);  
  10.         }else if(event.offsetY >= ctrlLayer.y+80 && event.offsetY <= ctrlLayer.y+120){  
  11.             player.changeDir(DOWN);  
  12.         }  
  13.     }else if(event.offsetX >= ctrlLayer.x && event.offsetX <= ctrlLayer.x+40){  
  14.         if(event.offsetY >= ctrlLayer.y +40 && event.offsetY <= ctrlLayer.y+80){  
  15.             player.changeDir(LEFT);  
  16.         }  
  17.     }else if(event.offsetX >= ctrlLayer.x+80 && event.offsetX <= ctrlLayer.x+120){  
  18.         if(event.offsetY >= ctrlLayer.y +40 && event.offsetY <= ctrlLayer.y+80){  
  19.             player.changeDir(RIGHT);  
  20.         }  
  21.     }  
  22.     isKeyDown = true;  
  23. }  
  24. function onup(event){  
  25.     isKeyDown = false;  

這里需要知道的是,在智能手機里,其實點擊事件是TOUCH_START,TOUCH_MOVE,TOUCH_END事件

使用legendForHtml5Programming庫件的時候,只需要添加MOUSE_DOWN,MOUSE_MOVE,MOUSE_UP事件,然后庫件會自動判斷是加載TOUCH事件還是MOUSE事件

在ondown方法中,我們將isKeyDown的狀態變為true,表示我們正處于按下狀態

然后,根據我們點擊的位置,來調用Character類的changeDir方法,并且傳入點擊的方向

有了控制事件,現在的關鍵就在于changeDir方法,只要根據傳進來的值,來實現移動就可以了

我們試想,如果每次移動一個步長的話,那么人物就會由一個小方格跳到令一個方格,而我們需要的是,讓它緩慢的移動到下一個方格,有一個移動的過程

為了實現這個過程,我們在移動的時候不是讓人物的坐標馬上就改變,而是改變人物的狀態,由靜止到移動,然后處于移動狀態的時候,再讓人物一小步一小步的移動到目標點

修改Character類的構造器,如下

  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.     self.anime.y -= 16;  
  15.     //設定不移動  
  16.     self.move = false;  
  17.     //在一個移動步長中的移動次數設定  
  18.     self.moveIndex = 0;  
  19. }; 

調整人物位置是因為,人物的圖片分割后,每個動作的大小為32*48,而地圖每個小格的大小是32*32,然后設定人物狀態為不移動,然后修改changeDir 方法

  1. /**  
  2.  * 改變人物方向  
  3.  **/ 
  4. Character.prototype.changeDir = function (dir){  
  5.     var self = this;  
  6.     //如果正在移動,則無效  
  7.     if(!self.move){  
  8.         //設定人物方向  
  9.         self.direction = dir;  
  10.         //設定圖片動畫  
  11.         self.anime.setAction(dir);  
  12.         //開始移動  
  13.         self.move = true;  
  14.         self.moveIndex = 0;  
  15.     }  
  16. }; 

這里要簡單說明一下LAnimation類的setAction方法,setAction(rowindex,colindex)方法有兩個參數,LAnimation里傳進來的圖片數組是一個二維數組,這兩個參數分別可以改變目前顯示的圖片的動作,當然,也可以只傳其中一個參數

我這次是將4*4的人物動作圖片分割為4*4的二維數組傳給了LAnimation類,所以現在每一行圖片代表一個方向

人物狀態設置為移動后,就應該在循環事件里開始一步步的移動了

  1. /**  
  2.  * 循環事件   
  3.  **/ 
  4. Character.prototype.onframe = function (){  
  5.     var self = this;  
  6.     //人物動作速度控制  
  7.     if(self.speedIndex++ < self.speed)return;  
  8.     self.speedIndex = 0;  
  9.     //當人物可移動,則開始移動  
  10.     if(self.move)self.onmove();  
  11.     //人物動畫播放  
  12.     self.anime.onframe();  
  13. };  
  14. /**  
  15.  * 開始移動   
  16.  **/ 
  17. Character.prototype.onmove = function (){  
  18.     var self = this;  
  19.     //設定一個移動步長中的移動次數  
  20.     var ml_cnt = 4;  
  21.     //計算一次移動的長度  
  22.     var ml = STEP/ml_cnt;  
  23.     //根據移動方向,開始移動  
  24.     switch (self.direction){  
  25.         case UP:  
  26.             self.y -= ml;  
  27.             break;  
  28.         case LEFT:  
  29.             self.x -= ml;  
  30.             break;  
  31.         case RIGHT:  
  32.             self.x += ml;  
  33.             break;  
  34.         case DOWN:  
  35.             self.y += ml;  
  36.             break;  
  37.     }  
  38.     self.moveIndex++;  
  39.     //當移動次數等于設定的次數,開始判斷是否繼續移動  
  40.     if(self.moveIndex >= ml_cnt){  
  41.         self.moveIndex = 0;  
  42.         //如果已經松開移動鍵,則停止移動,否則繼續移動  
  43.         if(!isKeyDown){  
  44.             self.move = false;  
  45.             return;  
  46.         }  
  47.     }  
  48. }; 

這里,我選擇了讓人物每個步長分四次進行移動,這樣就實現了緩慢移動的效果,運行程序,點擊畫面中的方向鍵,看到了把,人物已經可以開始移動了,而且是緩慢的移動

1010.gif

#p#

但是,光這樣還是不行,我們發現,人物是可以移動了,但是他現在是超人,飛檐走壁無所不入,移動的暢通無阻

這就需要我們在移動過程中,加入移動判斷,看看是否可以移動,

為了實現這個判斷,我們必須要知道地圖什么地方可以移動,什么地方不可以移動

所以,我們需要一個地圖的地形,如下

  1. //地圖地形數組  
  2. var mapdata = [  
  3. [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],  
  4. [1,1,1,0,0,0,0,0,0,0,0,0,1,1,1],  
  5. [1,1,0,0,0,0,1,1,0,0,0,0,1,1,1],  
  6. [1,0,0,0,1,1,1,1,1,0,0,1,1,0,1],  
  7. [1,0,0,1,1,1,1,1,1,1,0,1,1,0,1],  
  8. [1,0,0,1,1,1,0,1,1,1,1,1,0,0,1],  
  9. [1,0,0,0,0,0,0,0,1,1,1,1,0,0,1],  
  10. [1,1,0,0,0,0,0,0,0,1,1,0,0,0,1],  
  11. [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],  
  12. [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]  
  13. ]; 

地形數組中,0代表可以移動,1代表障礙物,是不可移動的,接下來,給Character類添加判斷方法

  1. /**  
  2.  * 障礙物判斷  
  3.  * @param 判斷方向   
  4.  **/ 
  5. Character.prototype.checkRoad = function (dir){  
  6.     var self = this;  
  7.     var tox,toy,myCoordinate;  
  8.     //當判斷方向為空的時候,默認當前方向  
  9.     if(dir==null)dir=self.direction;  
  10.     //獲取人物坐標  
  11.     myCoordinate = self.getCoordinate();  
  12.     //開始計算移動目的地的坐標  
  13.     switch (dir){  
  14.         case UP:  
  15.             tox = myCoordinate.x;  
  16.             toy = myCoordinate.y - 1;  
  17.             break;  
  18.         case LEFT:  
  19.             tox = myCoordinate.x - 1;  
  20.             toy = myCoordinate.y ;  
  21.             break;  
  22.         case RIGHT:  
  23.             tox = myCoordinate.x + 1;  
  24.             toy = myCoordinate.y;  
  25.             break;  
  26.         case DOWN:  
  27.             tox = myCoordinate.x;  
  28.             toy = myCoordinate.y + 1;  
  29.             break;  
  30.     }  
  31.     //如果移動的范圍超過地圖的范圍,則不可移動  
  32.     if(tox <= 0 || toy <= 0)return false;  
  33.     if(toy >= mapdata.length || tox >= mapdata[0].length)return false;  
  34.     //如果目的地為障礙,則不可移動  
  35.     if(mapdata[toy][tox] == 1)return false;  
  36.     return true;  
  37. }; 

然后,在changeDir方法,和onmove方法中,添加相應的判斷,如下

  1. /**  
  2.  * 開始移動   
  3.  **/ 
  4. Character.prototype.onmove = function (){  
  5.     var self = this;  
  6.     //設定一個移動步長中的移動次數  
  7.     var ml_cnt = 4;  
  8.     //計算一次移動的長度  
  9.     var ml = STEP/ml_cnt;  
  10.     //根據移動方向,開始移動  
  11.     switch (self.direction){  
  12.         case UP:  
  13.             self.y -= ml;  
  14.             break;  
  15.         case LEFT:  
  16.             self.x -= ml;  
  17.             break;  
  18.         case RIGHT:  
  19.             self.x += ml;  
  20.             break;  
  21.         case DOWN:  
  22.             self.y += ml;  
  23.             break;  
  24.     }  
  25.     self.moveIndex++;  
  26.     //當移動次數等于設定的次數,開始判斷是否繼續移動  
  27.     if(self.moveIndex >= ml_cnt){  
  28.         self.moveIndex = 0;  
  29.         //如果已經松開移動鍵,或者前方為障礙物,則停止移動,否則繼續移動  
  30.         if(!isKeyDown || !self.checkRoad()){  
  31.             self.move = false;  
  32.             return;  
  33.         }  
  34.     }  
  35. };  
  36. /**  
  37.  * 改變人物方向,并判斷是否可移動  
  38.  **/ 
  39. Character.prototype.changeDir = function (dir){  
  40.     var self = this;  
  41.     //如果正在移動,則無效  
  42.     if(!self.move){  
  43.         //設定人物方向  
  44.         self.direction = dir;  
  45.         //設定圖片動畫  
  46.         self.anime.setAction(dir);  
  47.         //判斷是否可移動  
  48.         if(!self.checkRoad(dir))return;  
  49.         //如果可以移動,則開始移動  
  50.         self.move = true;  
  51.         self.moveIndex = 0;  
  52.     }  
  53. }; 

好了,大功告成,開始運行吧

測試URL如下:http://fsanguo.comoj.com/html5/rpg/index.html

這次的源代碼下載:http://fsanguo.comoj.com/html5/rpg5/rpg5.rar

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

【編輯推薦】

  1. HTML 5開發RPG游戲之一(地圖人物實現)
  2. HTML 5開發RPG游戲之三(卷軸和對話)
  3. HTML 5開發RPG游戲之四(游戲腳本化)
  4. 開發HTML5跨平臺游戲相關經驗
  5. HTML 5開發的優秀網頁游戲
責任編輯:張偉 來源: HTML5中國的博客
相關推薦

2010-07-13 09:31:08

RubyRuby on Rai

2009-04-29 14:40:17

2012-05-15 13:57:41

HTML5

2021-01-22 14:03:34

Flutter系統鴻蒙

2011-05-04 11:26:47

優化

2023-03-02 23:09:53

Node.jsC++JS

2012-05-15 13:10:57

HTML5

2012-05-15 13:44:00

HTML5中國

2022-12-06 09:03:44

代碼fork系統

2023-08-03 09:02:32

LangChain開發GLM

2021-01-12 11:12:58

大數據智慧交通

2024-05-27 09:01:22

2022-01-10 10:23:07

瀏覽器Vitenode

2015-08-04 17:46:19

戴爾anycloud云計算

2017-11-17 15:25:02

Java線程安全

2023-01-31 07:42:29

代碼JDKMaven

2021-11-10 10:00:48

鴻蒙HarmonyOS應用

2014-04-18 17:12:00

樂跑手環

2012-01-06 14:10:13

HTML 5

2012-05-15 10:35:35

HTML5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄片毛片 | 久久伊人精品一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 亚洲欧美激情精品一区二区 | 亚洲精选一区二区 | 久久精品欧美视频 | 波多野结衣中文字幕一区二区三区 | 色就干 | 国产一级在线 | 天堂色综合| 国产精品精品视频一区二区三区 | 男人天堂网av | 人人叉 | 久久亚洲国产精品 | 女女百合av大片一区二区三区九县 | 久久久久久影院 | 国产一区二区三区在线视频 | 密桃av | 久久久久无码国产精品一区 | 草久久免费视频 | 国产精品久久久久久久白浊 | 久久手机视频 | 美女在线视频一区二区三区 | 91精品久久久久久久99 | 精品亚洲视频在线 | 操操操日日日 | 久久躁日日躁aaaaxxxx | 欧美aaaaa| 久久一区二 | 精品久久精品 | 成人av片在线观看 | 国产精品久久精品 | 日韩欧美在线免费 | 午夜视频免费在线观看 | 国产精品99久久久久久动医院 | 涩涩视频大全 | 久久国内精品 | 91精品国产日韩91久久久久久 | 不卡一区二区三区四区 | 一区二区三区播放 | 农村真人裸体丰满少妇毛片 |