J2ME平臺A-RPG遊戲怪物尋路演算法初探

gudesheng發表於2008-01-03

            最近似乎在手機上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


相關文章