2015-01-04 178 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