1. 程式人生 > >遊戲地圖中兩點座標相對的方向(角度)判斷

遊戲地圖中兩點座標相對的方向(角度)判斷

八方向座標的遊戲地圖中,怪物( pos1 )要向玩家( pos2 )發起技能攻擊的時候,需要計算出玩家 ( pos2 ) 相對於怪物 ( pos1 ) 所處的方向才能使技能正確攻擊到玩家。下面我們來看一段 秦美人實現的判斷兩個座標相對方向的程式碼:

                     double   angle = Math.  atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX()));

                     double   angle22d5 = Math.   PI   / 8;

                     double   angle67d5 = Math.   PI   / 2 – angle22d5;

                     if   (angle > -angle22d5 && angle <= angle22d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   2;

                        }   else

   {

                                 return   6;

                        }

                  }   else   if   (angle > angle22d5 && angle <= angle67d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   1;

                        }   else

   {

                                 return   5;

                        }

                  }   else   if   (angle > -angle67d5 && angle <= -angle22d5) {

                           if   (pos1.getX() < pos2.getX()) {

                                 return   3;

                        }   else   {

                                 return   7;

                        }

                  }   else   {

                           if   (pos1.getY() < pos2.getY()) {

                                 return   4;

                        }   else   {

                                 return   0;

                        }

                  }

首先第一行   double   angle = Math.  atan ((( double ) (pos2.getY() – pos1.getY())) / -(pos2.getX() – pos1.getX())),這是計算玩家 ( pos2 ) 與怪物 ( pos1 ) 兩點直線與x軸正方向的夾角弧度值,atan()中的引數 是計算兩點直線的一個斜率( 直線斜率公式:k= ),公式中的負號是作了笛卡兒座標系統對計算機螢幕座標系統的座標轉換。

笛卡兒座標系統中x軸向右為正值,y軸向上為正值;計算機螢幕座標系統中因為起點在螢幕左上角,雖然x軸同樣向右是正值,而y軸卻是向下為正值。上圖是將 紅色座標(笛卡兒座標系統)轉換為 綠色座標 (計算機螢幕座標系統)的過程。

附:同 atan等價的 atan2 弧度計算公式: Math.  atan2 ((( double ) (pos2.getY() – pos1.getY())), ( double ) (pos2.getX() – pos1.getX()))

如上圖所示兩個方向之間的夾角是45度,每個方向佔有區域範圍也是45度(分別共享相鄰兩個方向間夾角的一半)。 程式碼中的 double   angle22d5 = Math.   PI   / 8是計算座標系中22.5度角的弧度值,等價於 22.5 * Math.   PI   /180 , double   angle67d5 = Math.   PI   / 2 – angle22d5即是計算 座標系中67.5度角的弧度值,現在通過計算好的玩家( pos2 )相對於怪物( pos1 )兩點直線與x軸正方向的夾角弧度和x座標的相對位置,就可以判斷玩家( pos2 )相對於怪物( pos1 )正確方向了。

PS:要感謝一下我們的數學教父(肥皂哥)提供的數學支援!