虛擬函式釋義
最近似乎在手機上A-RPG遊戲很受歡迎,當然,我最近也在幫公司寫一款A-RPG類的遊戲。以前從沒寫過這樣的遊戲,從有到無的寫出來了。也碰到不少問題,包括螢幕滾動時地圖title陣列索引的校驗、整個遊戲框架的搭建、地圖資料的處理、分層的處理、主角技能的處理、碰狀檢測。
這些問題有空我會做為小專題一個一個的寫出來,這個話題裡我們來一起討論下A-RPG遊戲裡怪物尋路演算法的確定。
很顯然,在手機這樣的裝置上,A*演算法不適合。因為A*中大量的節點會把手機記憶體爆掉,這個是我直觀的感覺,沒親自去實踐,如果有人能在手機上精確的實現了A*演算法的話,請告訴我一聲。
那麼,在J2ME裡該如何處理怪物尋路演算法呢?
我在這個遊戲裡用的是A*演算法的簡化版本,暫時稱其為A* Simple演算法。
我們可以建立一個怪物的類,這個類裡包括不同版本的怪物、相應的圖片、相應的尋路演算法、相應的攻擊技能、相應的碰撞檢測等。如果不建立這個類的話,實在很難想象這個遊戲到後期如何擴充套件。
那麼我們就可以在這個類裡面做如下的判斷:
if(!walking){
if(spriteX < theRoleX&&spriteY > theRoleY)
{
direction = 3;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(spriteX < theRoleX&&spriteY < theRoleY)
{
direction = 2;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(spriteY < theRoleY&&spriteX > theRoleX)
{
direction = 0;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(spriteY > theRoleY&&spriteX > theRoleX)
{
direction = 1;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(theRoleX-spriteX > 8+spriteWidth&&spriteY == theRoleY)
{
direction = 2;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(theRoleX-spriteX <= 8+spriteWidth&&spriteY == theRoleY&&theRoleX-spriteX>0)
{
spriteX = theRoleX - 8 - spriteWidth;
attackFlash(g,2);
}else if(spriteX-theRoleX > 8+spriteWidth&&spriteY == theRoleY)
{
direction = 1;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(spriteX-theRoleX <= 8+spriteWidth&&spriteY == theRoleY&&spriteX>theRoleX)
{
spriteX = theRoleX+8+spriteWidth;
attackFlash(g,1);
}
else if(spriteY-theRoleY > spriteHeight&&spriteX == theRoleX)
{
direction = 3;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(spriteY-theRoleY <= spriteHeight&&spriteX == theRoleX&&spriteY-theRoleY > 0)
{
spriteY = theRoleY+spriteHeight;
attackFlash(g,3);
}else if(theRoleY-spriteY > height&&spriteX == theRoleX)
{
direction = 0;
walking = true;
drawByDirection(g,spriteImage,spriteX,spriteY,direction*3);
}else if(theRoleY-spriteY <= height&&spriteX == theRoleX)
{
spriteY = theRoleY-height;
attackFlash(g,0);
}
在這個尋路演算法中,怪物類會先判斷“權值”,即橫向和豎向到目標地的距離的大小。
然後根據“權值”做出相應的動作。
比如,怪物如果在主角的左下方,那麼它會先逼近主角的正下方,然後從下方逼近主角。
當然,這個演算法可以寫的更精確寫,那要以犧牲效能為代價了。
如何在精確和效能上做出平衡,也是我所要尋找的。
歡迎有類似經驗的同行一起討論。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=744476
相關文章
- 虛擬函式 純虛擬函式函式
- 虛擬函式,虛擬函式表函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- [Lang] 虛擬函式函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 虛擬函式與多型函式多型
- 虛擬函式的呼叫原理函式
- c++虛擬函式表C++函式
- 避免對派生的非虛擬函式進行重定義函式
- C++ 虛擬函式表解析C++函式
- 虛擬函式的實現原理函式
- C++ 介面(純虛擬函式)C++函式
- 深入C++成員函式及虛擬函式表C++函式
- 抽象基類和純虛擬函式抽象函式
- C++多型之虛擬函式C++多型函式
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- C++虛擬函式學習總結C++函式
- C++之類解構函式為什麼是虛擬函式C++函式
- 自定義生成器函式模擬Python內建函式filter()函式PythonFilter
- 基類指標、虛純虛擬函式、多型性、虛析構指標函式多型
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 關於虛擬函式的一些理解函式
- 虛擬函式的記憶體佈局(上)函式記憶體
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- Java常見知識點彙總(④)——虛擬函式、抽象函式、抽象類、介面Java函式抽象
- C++純虛擬函式簡介及區別C++函式
- c++虛擬函式實現計算表示式子C++函式
- C++物件導向總結——虛指標與虛擬函式表C++物件指標函式
- EMQX 多版本釋出、新增自定義函式功能MQ函式
- setV:一個管理 Python 虛擬環境的 Bash 函式Python函式
- 詳解C++中的多型和虛擬函式C++多型函式
- 虛擬函式表-C++多型的實現原理函式C++多型
- Hive常用函式及自定義函式Hive函式
- C++(虛擬函式實現多型基本原理)C++函式多型
- Hive函式(內建函式+自定義標準函式UDF)Hive函式
- 如何在函式內部定義函式?函式
- java自定義equals函式和hashCode函式Java函式
- 02_函式定義及使用函式函式