一般来说,游戏角色自动寻路寻找某位npc,为了显得更自然,都会走到目标npc附近,而不是npc所在的坐标点,这时寻路后人物的朝向往往便无法保证。
如今很多的游戏,人物都会有八个方向,为了让游戏更加逼真,在寻路到npc附近时,需要让角色朝向npc,那么如何确定人物朝向呢?我们可以根据角色和npc与Y周之间的夹角来判断。
当角色在目标npc的75~105度位置则角色应该朝向左边,在15~75时,则应该朝向左上方,如此类推。那么问题其实可以化为简单的平面数学问题。
在一平面内,角色坐标p1(x1,y1,) npc坐标p2(x2,y2)
我们以npc的坐标为参考系,那么p2将变为(0,0), p1将变为(x1-x2,y1-y2),我们可以将p1视为一向量,求向量的角度
var angle:Number = Math.atan2(p1.x,p1.y);
求出来的angle是弧度值,还需要转为为角度
angle = angle*(180/Math.PI) 这样就可以根据角度判定角色的朝向了
- var vMyX:Number = _px;
- var vMyY:Number = _py;
- var vNpcX:Number = _dx;
- var vNpcY:Number = _dy;
- vMyX = -vNpcX;
- vMyY = -vNpcY;
- vNpcX = 0;
- vNpcY = 0;
- var angle:Number = Math.atan2(vMyX,vMyY);
- angle = angle*(180/Math.PI)
- if(angle<0){
- //在左边
- if(angle>-15){
- setDir(4);//面向上
- }
- if(angle<=-15 && angle>=-75){
- setDir(5);//面向右上
- }
- if(angle< -75 && angle>=-105){
- setDir(6);//面向右
- }
- if(angle< -105 && angle>=-165){
- setDir(7);//面向右下
- }
- if(angle<-165){
- setDir(0);//面向下
- }
- }else{
- //在右边
- if(angle>=75 && angle<=105){
- setDir(2);//面向左边
- }
- if(angle>=15 && angle<75){
- _setDir(3);//面向左上
- }
- if(angle<15){
- setDir(4);//面向上
- }
- if(angle>105 && angle<165){
- _setDir(1);//面向左下
- }
- if(angle>165){
- setDir(0);//面向下
- }
- }