繁体   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-2024 STACKOOM.COM