簡體   English   中英

基於鼠標單擊XNA的運動

[英]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.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM