-1

私は今、C++ (SFML 2.0) で最初のゲームを作成しており、できるだけクリーンにしようとしています。コードをいじった後、それをオブジェクト指向のコードに変換するつもりですが、動きが私に考えさせました。

を update 関数に渡してsf::Event、ボタンの押下を読み取り、クラス内で移動することを考えています。しかし、それが賢明な行動であるかどうかはわかりません。コードはきれいになりますが、ボタンを押すようなことはクラス内で行うべきではないということをどこかで読んだことを覚えています。問題は、それが本当であるかどうか、理由がわからないということです。

これに関するヒントを教えてくれる人はいますか?

4

2 に答える 2

3

あなたの質問は少し大雑把ですが、人々が反対するのは難しいと思うヒントをここに示します。入力デバイス (キーボード、マウスなど) をアクションから分離します。ゲーム オブジェクトは、キーボードの左キーに反応したり、何も認識したりしてはなりません。代わりに、たとえば「Go Left」コマンドに応答する必要があります。別のコード (おそらく ObjectController クラス) で、左キーを「Go Left」コマンドにバインドします。Aこれにより、代わりにキーまたは左ジョイスティック ボタンを簡単にバインドできるため、コントロールがはるかに構成しやすくなります。または、「Go Left」コマンドを発行する AI をプラグインすることで、オブジェクトをプレーヤー制御からコンピューター制御に切り替えることができます。

于 2013-05-12T14:11:07.540 に答える
1

はい、Benjamin Lindley が言ったように、最も賢明な選択は、入力をコンテナーに格納し (入力キュー、リスト、またはキーのブール マップを作成する)、ゲーム ロジックで、入力に応じて、オブジェクトの更新メソッドを呼び出すことです。 . 短い SFML の例:

  sf::Clock timer;
  sf::Event Event;
  bool isRunning = true;
  while (isRunning)
    {
      Window.clear(sf::Color(255, 255, 255));
      while (Window.pollEvent(Event))
      {
          switch(Event.type)
            {
             case sf::Event::Closed:
             isRunning = false;
             break;

            case sf::Event::KeyPressed:
                    if (Event.key.code == sf::Keyboard::Up)
                    keys[WK] = true;
                        [...]

                case sf::Event::KeyReleased:
                    if (Event.key.code == sf::Keyboard::Up)
                    keys[WK] = false;
                        [...]
                }
          }
      if (keys[WK])
          MyCharacter.move(0, -100 * timer.getElapsedTime().asSeconds());
      Window.draw(MyCharacter);

      Window.display();
      timer.restart();
    }

これは、私が作成したゲームで入力を処理する方法の例です。「キー」はブール配列であり、押されているかどうかに応じて、さまざまなキーを true または false に設定します。次に、イベント ポーリングとキーの更新が完了すると、ゲーム ロジックが作成されます (ここでは、例を簡略化するために 1 行を残してすべて削除しています)。一定のゲームプレイを維持するためにタイマーを使用することを忘れないでください。これがお役に立てば幸いです。

于 2013-05-13T03:55:23.517 に答える