【问题标题】:XNA Monogame Mouse Projectile ClickXNA Monogame 鼠标弹丸点击
【发布时间】:2018-08-05 03:34:15
【问题描述】:

我正在为一款游戏编写代码,它运行良好,但我遇到了弹丸问题。我不知道如何计算鼠标位置并发射弹丸。我看过许多 stackoverflow 教程和许多 youtube 视频,但它们要么太模糊,要么非常复杂。有人可以解释一下这个过程吗?我已经用 C# 编码 2 年了,所以我确实有背景知识。请帮忙!

【问题讨论】:

    标签: c# xna monogame


    【解决方案1】:

    好吧,你不知道你正在开发什么样的游戏以及你想要“发送”什么弹丸,不管这意味着什么,但这里有一些建议,也许会有帮助:

    #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 个轴的最小和最大旋转,将每个旋转与屏幕的全宽和全长与鼠标的比率相关联位置,然后使用角度和任何其他变量来计算弹丸在发射时的方向和速度,然后模拟每一帧的物理。

    我希望其中之一会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-27
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多