基于鼠标单击 XNA 的移动
本文关键字:单击 XNA 移动 鼠标 于鼠标 | 更新日期: 2023-09-27 18:36:20
我正在制作一款服务器/客户端游戏,其移动类似于魔兽争霸 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是角色的当前位置(在上次更新结束时的位置)。移动速度只是它移动的速度。我使用增量和角度来确定角色在本次更新中应该移动的位置。
那么,当角色移动的点在它上方时,是什么让角色以圆形方式移动?
我看到这段代码的一些问题源于角度的使用。并不是说你不能使用角度,而是这种方法会使代码变得更加复杂并且容易出错。取而代之的是,我使用了一些矢量方法,例如Length()
来检查术士是否接近他的目的地,以及当我将增量矢量隐藏为具有相同方向和移动速度大小的单位矢量时(以便将他移动那么远)时Normalize()
。这是我想到的:
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
)。