0

我正在编写像游戏一样的太空入侵者,我希望能够用鼠标和键盘移动玩家控制的飞船。使用键盘移动飞船时,会使用一个速度常数。用鼠标移动船时,只改变船的位置。用键盘移动飞船时,鼠标的位置也会发生变化,与飞船的位置保持一致。

我提到的常量不是 int 值,而是 float 值。这背后的原因是我想添加一个加速器来提高船的速度,它可能是也可能不是 int 类型。另外,如果玩家要求或游戏难度较大,我希望能够微调速度。问题是,MouseState 给了我一对 int 坐标,但船的位置是一对浮动坐标。所以这就是问题所在:

每一帧,我需要将飞船移动到鼠标位置(鼠标控制),每一帧我需要将鼠标位置移动到飞船(键盘控制)。由于鼠标给了我 int 坐标,因此必须将来自船位的浮点坐标转换为 int,这破坏了我之前描述的想法。有什么方法可以强制鼠标使用浮点坐标,无论是 XNA 中的解决方法还是其他一些 API(DirectX 或 WINAPI)?我也在玩弄虚拟坐标和屏幕坐标的想法,并在它们之间进行转换。

干杯,亚历克斯

编辑:添加代码片段:

if (_keybState.IsKeyDown(Keys.Right))
{
    Mouse.SetPosition(
    (int)(_player1.GetPlayerPosition().X + Constants.HorizontalMovementSpeed), 
    (int)(_player1.GetPlayerPosition().Y));
}
if (_keybState.IsKeyDown(Keys.Left))
{
    Mouse.SetPosition(
        (int)(_player1.GetPlayerPosition().X - Constants.HorizontalMovementSpeed),
        (int)(_player1.GetPlayerPosition().Y));
}
if (_keybState.IsKeyDown(Keys.Up))
{
    Mouse.SetPosition(
        (int)(_player1.GetPlayerPosition().X ),
        (int)(_player1.GetPlayerPosition().Y - Constants.VerticalMovementSpeed));
}
if (_keybState.IsKeyDown(Keys.Down))
{
    Mouse.SetPosition(
        (int)(_player1.GetPlayerPosition().X),
        (int)(_player1.GetPlayerPosition().Y + Constants.VerticalMovementSpeed));
}
if (_keybState.IsKeyDown(Keys.Space) && _shootKeyPressed == false)
{
    _player1.Shoot();
    _shootKeyPressed = true;
}

_shoboState = Mouse.GetState();
_player1.MovePlayerShipToPosition(new Vector2(_shoboState.X, _shoboState.Y));
4

1 回答 1

0

而不是像这样将鼠标和船舶位置捆绑在一起:

_shoboState = Mouse.GetState();
_player1.MovePlayerShipToPosition(new Vector2(_shoboState.X, _shoboState.Y));

尝试以下方式:

  1. 找到鼠标和船之间的单位向量。这将使您从飞船到鼠标有 1 个单位的步长。(你应该可以很容易地找到这方面的教程)
  2. 将单位向量乘以您的移动量。这为您提供了移动船的方向和距离。
  3. 将新矢量应用到您的船上。
  4. 将鼠标尽可能靠近您的船的新位置。
于 2012-12-10T08:21:15.537 回答