0

私はスペースインベーダーのようなゲームをコーディングしています.マウスとキーボードの両方でプレイヤーが制御する船を動かしたいと思っています. キーボードで船を動かすときに使用されている速度定数があります。マウスで船を動かすと、船の位置だけが変わります。キーボードで船を動かすと、船の位置と一致するようにマウスの位置も変更されます。

私が言及した定数は int 値ではなく、float 値です。この背後にある理由は、船の速度を上げるためにパワーアップを追加したいということであり、それは int 型である場合とそうでない場合があります。また、プレイヤーやゲームが難しいという要求があれば、速度を微調整できるようにしたいと考えています。問題は、MouseState が 1 組の int 座標を提供することですが、船の位置は 1 組の float 座標です。ここに問題があります:

各フレームで、船をマウスの位置に移動する必要があり (マウス制御)、各フレームでマウスの位置を船に移動する必要があります (キーボード制御)。マウスは int 座標を与えてくれるので、船の位置から float のものを int に変換しなければなりません。XNA またはその他の API (DirectX または WINAPI) の回避策として、マウスに float 座標を強制的に使用させる方法はありますか? また、仮想座標と画面座標のアイデアをいじり、それらの間で変換しています。

乾杯、アレックス

編集:コードスニペットを追加:

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 に答える