2015-01-04 136 views
1

我正在制作一个类似于诸如魔兽1/2/3等战略游戏的移动的服务器/客户端游戏,其中玩家通过右键点击该区域的某处并且尝试移动搬到那里。我试图让角色总是直线前进,直到它到达那里(或足够近)。我现在使用的代码在那里得到了角色,但是以一种奇怪的方式。基于鼠标点击的移动XNA

当我点击字符下方的某个位置(Y坐标较高)时,它会沿直线移动,但当我点击它上方(Y坐标较低)时,角色会像移动时形成一个圆圈一样移动,但仍然会那里,只有我不希望它的方式。

下面是运行每个更新以移动它的代码。

 if (this.order == "Move") 
     { 
      if (Math.Abs(this.orderPos.X - this.warlockPos.X) < this.moveSpeed && Math.Abs(this.orderPos.Y - this.warlockPos.Y) < this.moveSpeed) 
      { 
       this.warlockPos = this.orderPos; 
       this.order = "None"; 
       this.orderPos = Vector2.Zero; 
      } 
      else 
      { 
       delta = this.orderPos - this.warlockPos; 
       if (delta.Y == 0) 
       { 
        if (delta.X < 0) 
         angle = -90; 
        else 
         angle = 90; 
       } 
       else 
       { 
        if (delta.Y < 0) 
         angle = 180 + Math.Atan(delta.X/delta.Y); 
        else 
         angle = Math.Atan(delta.X/delta.Y); ; 
       } 
       this.warlockPos = new Vector2(this.warlockPos.X + this.moveSpeed * (float)Math.Sin(angle), this.warlockPos.Y + this.moveSpeed * (float)Math.Cos(angle)); 
      } 
     } 

this.order ==移动表示客户端的最后一个订单是移动。 orderPos是客户最后告诉角色应该移动的服务器的地方。 warlockPos是角色的当前位置(在上一次更新结束时的位置)。 moveSpeed就是它移动的速度。 我使用增量和角度来确定角色在此更新中移动的位置。

那么,当角色移动的角度超过角色时,角色以循环方式移动的原因是什么?

回答

0

我看到这个代码源自使用角度的一些问题。这并不是说你不能使用角度,但是这种方法的代码变得更加复杂,并且容易出错。相反,我使用了一些矢量方法,如Length()来检查术士是否靠近他的目的地,当我将德尔塔矢量转换为单位矢量时,他的moveSpeed方向和幅度相同(为了移动他那么远)。以下是我想出了:

if (order == "Move") 
{ 
    Vector2 delta = orderPos - warlockPos; 

    if (delta.Length() < moveSpeed) 
    { 
     warlockPos = orderPos; 
     order = "None"; 
     orderPos = Vector2.Zero; 
    } 
    else 
    { 
     delta.Normalize(); 
     delta *= moveSpeed; 
     warlockPos += delta; 
    } 
} 

我也建议不要,如果它是没有必要使用this关键字(仅当有另一个局部变量或参数名称相同)。我很抱歉,如果这是一个故意的风格选择。此外,我建议使用枚举来代替订单变量(例如order == Orders.Move)。

+0

谢谢你,完美的工作:D!顺便说一下,我不得不补充这一点。到一切,但那是因为代码是在一个类内的函数内部,所以有参数。 – RontoKing 2015-01-04 12:25:14

+0

没问题!啊,可以理解。快乐的XNAing! – Ideae 2015-01-04 12:27:59

+0

对不起,您能不能帮我解决一些问题(这段代码完美地工作)?如何计算术士在被附近术士击倒时会被击倒的位置(矢量2)。因此,如果A点靠近B点,B点使A点远离自身,那么点A会移动到什么点? (我知道如何让它移动到这一点,这要感谢你已经给我的代码,但我不知道如何找到那个点) – RontoKing 2015-01-05 23:24:27