任鳥飛談逆向-RPG遊戲自動打怪之朝向判斷
RPG遊戲輔助想要做到自動打怪
獲得到最近怪物信息以後 還需要面向怪物
否則背對怪物等等情況是沒有辦法攻擊以及釋放技能的
遊戲設計的時候朝向是有很多種情況的
第一種
2D,2.5D老遊戲,例如傳奇
他的朝向一般是極為固定的4朝向或則8朝向
也就是不是自由朝向的,只能朝向 東南西北4個方位
或則 東 東北 北 西北 西 西南 南 東南 8個方位
那麼朝向計算也極為簡單
只要計算出怪物和人物坐標的關係即可
例如
X怪物>X人物 && Y怪物>Y人物
那麼想面向怪物就把朝向值修改成面向東北方即可
一般 8個方位是0-7 8個數值表示
第二種
2D版自由朝向
說是2D版自由朝向,但實際上很多3D遊戲都在運用
非常簡單的理解就是遊戲是3D的,但是人物轉向只能2D平面轉向,而頭不可以上抬和俯瞰的
例如QQ西遊
一般情況這種遊戲的朝向值得是從0到一個數值均勻排列在坐標繫上
我們只要計算出他的變化規律 即可輕鬆計算
例如QQ西遊是從 X正軸為0 逆時針不斷增加
一直增加到256然後和X軸重疊又變為0
那麼知道了 其變化規律 我們就可以代碼實現
如下
DWORD Call_朝向怪物角度(FLOAT x,FLOAT y)
{
T人物屬性 A;
A.c初始化();
FLOAT X=A.fX;
FLOAT Y=A.fY;
DWORD B=0;
if (x>X&&y>Y)//第一象限
{
B=(DWORD)(atan2(y-Y,x-X)/3.1415926 *180);//真實角度
B=B*64/90 ;//同比例遊戲角度
B=0+B;
}
if (xY)//第二象限
{
B=(DWORD)(atan2(y-Y,X-x)/3.1415926 *180);
B=B*64/90 ;
B=128-B;
}
if (x
{
B=(DWORD)(atan2(Y-y,X-x)/3.1415926 *180);
B=B*64/90;
B=128+B;
}
if (x>X&&y
{
B=(DWORD)(atan2(Y-y,x-X)/3.1415926 *180);
B=B*64/90;
B=256-B;
}
return B;
}
第三種
通過第一種和第二種
我們可以明顯感覺到從8方位到多方位的升級
但是這還是不夠的 無論你把坐標系分成多少份 還是不是絕對的自由
那怎麼辦呢?
遊戲發明出更自由的朝向方式
例如 天涯明月刀
他是這樣的設計理念
以人物為中心 花一個圓,一般半徑為1(是多少無所謂,我們乘多少即可)
和怪物連線,於圓的交點就是我們的朝向
那麼這樣就變成了自由朝向了,想精確到多少都可以
計算起來也非常簡單
以人物原點,圓交點,圓交點到X軸的垂線和X軸的交點 三點為一個三角形
人物原點,怪物坐標點,怪物坐標點到X軸的垂線和X軸的交點 三點為一個三角形
2個三角形為相似三角形
那麼 小三角形h / 1 = (Y怪物-Y人物)/距離
小三角形l / 1 = (X怪物-X人物)/距離
得到的 h 和l 就是我們 圓交點的坐標了
還有進一步的升華的方式
就是3D版本的朝向
那麼他將不再是一個圈了
是一個3D立體的球
但是演算法依然沒有變化
只是距離發生了變化
相似三角形依然還是相似三角形
h=(Y怪物-Y人物)/距離
l=(X怪物-X人物)/距離
z=(Z怪物-Z人物)/距離
其中距離=sqrt((人物.fX-fX)*(人物.fX-.fX)+(人物.fY-fY)*(人物.fY-fY)+(人物.fZ-fZ)*(人物.fZ-fZ));
第四種
一般是FPS類遊戲喜歡用的
也和太空梭等用的角度一樣
就是俯衝角 搖擺角 和旋轉角
其中旋轉角代表著自身的旋轉 ,在遊戲里幾乎無用
那麼就是俯衝角 代表著槍支方向和水平面上下的角度
搖擺角 代表槍支方向和中線左右搖擺的角度
計算方法 參考第二種的反正切方式即可
TAG:任鳥飛逆向 |