【发布时间】:2018-08-05 03:34:15
【问题描述】:
我正在为一款游戏编写代码,它运行良好,但我遇到了弹丸问题。我不知道如何计算鼠标位置并发射弹丸。我看过许多 stackoverflow 教程和许多 youtube 视频,但它们要么太模糊,要么非常复杂。有人可以解释一下这个过程吗?我已经用 C# 编码 2 年了,所以我确实有背景知识。请帮忙!
【问题讨论】:
我正在为一款游戏编写代码,它运行良好,但我遇到了弹丸问题。我不知道如何计算鼠标位置并发射弹丸。我看过许多 stackoverflow 教程和许多 youtube 视频,但它们要么太模糊,要么非常复杂。有人可以解释一下这个过程吗?我已经用 C# 编码 2 年了,所以我确实有背景知识。请帮忙!
【问题讨论】:
好吧,你不知道你正在开发什么样的游戏以及你想要“发送”什么弹丸,不管这意味着什么,但这里有一些建议,也许会有帮助:
#1:如果你正在做一个 2D 游戏,并且你想从某个点向鼠标光标发送一个弹丸,那么你只需通过在 MouseState 实例上调用 GetState() 来获取鼠标的位置,然后读取它是 X 和 Y 属性,然后通过从鼠标位置中减去弹丸原点的位置来获得弹丸的方向。然后你可以通过存储你发射它的时间来沿着这条线移动弹丸,从实际时间中减去每一帧来得到它在路上的时间,然后加上它的速度乘以归一化方向到它的原点的许多倍坐标。
示例: 为此,我假设您有一个 Projectile 类,该类具有 Vector2 字段,称为原点,一个称为方向,一个称为位置,一个称为速度的浮点数和一个称为 startTime 的整数,并且您有一个已设置原点和速度的实例。根据实际代码的需要进行修改。
MouseState ms = new MouseState();
在您的更新方法中:
ms.GetState();
projectile.direction = new Vector2(ms.X, ms.Y) - projectile.origin;
projectile.direction.Normalize();
projectile.position = projectile.origin + projectile.speed * (gameTime.TotalGameTime.TotalMilliseconds - projectile.stratTime) * projectile.direction;
然后在 Draw 方法中,您只需将弹丸绘制到 projectile.position 中的坐标。
#2:您正在做一个 3D 游戏,并且想要从您的相机射出一个射弹并指向您的鼠标指向的任何物体。您将需要使用以下内容生成 Ray:
private Ray getClickRay(Vector2 clickLocation, Viewport viewport, Matrix view, Matrix projection)
{
Vector3 nearPoint = viewport.Unproject(new Vector3(clickLocation.X, clickLocation.Y, 0.0f), projection, view, Matrix.Identity);
Vector3 farPoint = viewport.Unproject(new Vector3(clickLocation.X, clickLocation.Y, 1.0f), projection, view, Matrix.Identity);
Vector3 direction = farPoint - nearPoint;
direction.Normalize();
return new Ray(nearPoint, direction);
}
从那里您可以通过与上述相同的方式获取弹丸的位置,只是使用 Vector3-s 而不是 Vector2-s。
#3:你想模拟某种发射器并对射弹的轨迹进行物理模拟。因为我发现这比前两个不太可能,所以我只描述这个想法:您为启动器设置沿 2 个轴的最小和最大旋转,将每个旋转与屏幕的全宽和全长与鼠标的比率相关联位置,然后使用角度和任何其他变量来计算弹丸在发射时的方向和速度,然后模拟每一帧的物理。
我希望其中之一会有所帮助。
【讨论】: