0

矢印キーでキャラクターを操作する2Dゲームを作っています。

        if((win.GetInput().IsKeyDown(sf::Key::Down)))
        {
            y = y + Speed;
        }

        if((win.GetInput().IsKeyDown(sf::Key::Left)))
        {
            x = x - Speed;
        }

Speedを10に設定しました。次に、aiはSprite.SetPosition(x、y)を使用して実際にキャラクターをアニメートします。

すべてが正常に動作します。しかし、問題は、矢印キーを押すたびに、キャラクターが1/2秒間移動し、約1/2秒間停止してから、再びスムーズに移動することです。これは、矢印キーを押すたびに発生します。

はい、複数のイベントを同時に処理するために、上部にwhileループを使用しています。

私の質問が十分に明確であったことを願っています。私を助けてください!

ありがとう。

4

1 に答える 1

3

イベントを正しく処理していないと思います。ここで行っているのは、各イベント(キーボード入力であるかどうかに関係なく)でsf :: Key :: Downキーが押されているかどうかをチェックすることです(sf :: Key :: Leftでも同じです)。

第一に、あなたが望む結果が得られないので、それは効果的ではありません。次に、イベントがマウスの移動、マウスのクリックなどである可能性があることを認める無駄なチェックを実行します。このような場合にこれらのキーが押されているかどうかをチェックすることは、プログラムにとって無意味です。

私はあなたのコード全体を見ることができませんが、あなたはあなたのメインループとしてこの味の何かを試してみるべきです:

bool isMovingLeft = false;
bool isMovingDown = false;
sf::Event event;

while (win.IsOpen())
{
    // While window catches events...
    while(win.GetEvent(event))
    {
         // If the caught event is a click on the close button, close the window
         if (event.Type == sf::Event::Closed)
             win.Close();
         // If it's a key press, check which key and move consequently
         else if (event.Type == sf::Event::KeyPressed)
         {
              if(event.Key.Code == sf::Key::Left)
                   isMovingLeft = true;
              else if(event.Key.Code == sf::Key::Down)
                   isMovingDown = true;
         }
         // If it's a key release, stop moving in the following direction
         else if (event.Type == sf::Event::KeyReleased)
         {
              if(event.Key.Code == sf::Key::Left)
                   isMovingLeft = false;
              else if(event.Key.Code == sf::Key::Down)
                   isMovingDown = false;
         }    
    }

    // Now that we have caught events, we move the lil' thing if we need to.
    if(isMovingLeft)
          x = x - SPEED;
    if(isMovingDown)
          y = y - SPEED;


    win.Clear();

    // Draw things on the screen...

    win.Display();
}

このコードでは、プロセス全体が2つの部分に分割されています。

  • まず、ユーザー入力をインターセプトして、モノの移動状態を変更する必要があるかどうかを確認します。
  • 次に、すべてのイベントをキャッチして徹底的に分析したら、必要に応じて移動します。これは2つのブール値を介して行われます(4方向の制御が必要な場合は4つに増やす必要があります。斜めの方向を処理する場合は、8つのブール値よりも列挙型を使用する方が賢明です。 -そのような単純なタスクのために消費します。)

注:「Speed」を「SPEED」に変更したことに気付くかもしれません。それがdefineなのか、const varなのか、それとも単にあなたが与えたコードからのvarなのかはわかりませんが、最良のオプションは最初の2つのうちの1つです。私はそのようなことに#defineを使用することを好みます。これは、定数に簡単に到達できるようにするため(プリプロセッサに配置されるため)、完全にキャップされた書き込みにより、コード内の従来の変数との差別化が容易になります。しかし、それは私たちがここで話しているコーディングスタイルです:)

于 2012-11-16T08:21:11.130 に答える