我正在编写像游戏一样的太空入侵者,我希望能够用鼠标和键盘移动玩家控制的飞船。使用键盘移动飞船时,会使用一个速度常数。用鼠标移动船时,只改变船的位置。用键盘移动飞船时,鼠标的位置也会发生变化,与飞船的位置保持一致。
我提到的常量不是 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));