[英]Movement based on mouse click XNA
我正在制作服務器/客戶端游戲,其動作類似於《魔獸爭霸1/2/3》等策略游戲。在該游戲中,玩家通過右鍵單擊區域中的某個位置進行移動,而角色嘗試移動到該位置。 我試圖使角色始終沿直線指向該點,直到到達該點為止(或足夠接近)。 我正在使用的代碼現在以一種奇怪的方式獲得了字符。
當我單擊字符下方的某個位置(較高的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 == move表示客戶的最后訂單是移動。 orderPos是客戶端最后告訴服務器角色應該移動的地方。 warlockPos是角色的當前位置(上一次更新結束時的位置)。 moveSpeed只是它移動的速度。 我使用增量和角度來確定角色在此更新中應移至的位置。
那么,當角色朝向的點位於角色上方時,是什么使角色以圓形方式運動?
我看到此代碼的一些問題源於使用角度。 不是您不能使用角度,而是這種方法使代碼變得更加復雜並且容易出錯。 取而代之的是,我使用了一些矢量方法,例如Length()
來檢查術士是否靠近他的目的地,當我將增量矢量沿相同方向並以他的moveSpeed的幅度隱藏到單位矢量中時,將使用Normalize()
Length()
進行檢查。為了將他移動到這么遠)。 這是我想出的:
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變量(例如order == Orders.Move
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.