1

私は現在、C++でSFMLを使用する方法を学ぶために簡単なゲームの作成に取り組んでいます。これまでのところ順調に進んでおり、SFMLに関するほとんどのことを基本的に理解しています。私が遭遇した問題は、時間ベースのイベントへの効率的な方法を見つけることです。

私が取り組んでいるゲームは、レベル中の事前定義された時間に敵の波が入ってくる非常に単純な宇宙侵略者風のゲームです。現在のところ、単純なイベントを複数回再利用できるようにするために、呼び出された各イベントで発生することになっていることを保持および制御するイベントクラスがあります。今のところ、SFML cloockを利用してループし、ゲームループの各反復で現在のレベルのすべてのイベントのベクトルを実行し、時計の経過時間をイベントの指定された時間と比較することで、これらのイベントをトリガーします。呼ばれる。問題は、ゲームループの反復ごとにイベントのベクトル全体をチェックする必要があることです。イベントリストが十分に長くなると、ゲームのパフォーマンスに影響を及ぼし始めるのではないかと心配しています。

各イベントにタイムラインでの位置の単純な数値IDを与え、次にどのイベントが実行されるかを単純に保存するというアイデアがありました。ループの反復ごとに1つのイベントの時間をチェックするだけで、これは機能します。かなりよく思いますが、ループの反復ごとにチェックを必要としない、より効率的な方法が可能かどうか興味がありましたか?イベント駆動型プログラミングを少し調べましたが、時間ベースのイベントに特に関連するものはあまり見つかりませんでした。

したがって、誰かがタイムラインまたは時間ベースのイベントトリガーの経験があり、より効率的なアイデアを理解するために見ることができるヒントやリソースがあるかどうか疑問に思っていましたか?どんな助けでも素晴らしいでしょう、ありがとう!

4

2 に答える 2

2

あなたが提案する方法は、ゲームループのたびに1回だけ比較することです. それ以上速くなることはありません。

複数のイベントを同時に発生させるには、 を使用しmultimapます。ここで、キーはイベント時間であり、値はイベント自体です。マルチマップは時間順にソートされます。

ゲーム ループのたびに、次のようなことを行います (疑似コード)。

now = getCurrentTime()
while not events.isEmpty() and events.firstElement().key() < now:
  e = events.firstElement().value
  e.execute()
  events.removeFirst()
于 2012-04-04T17:18:26.860 に答える
0

イベントの時間に基づいてベクターを並べ替えてから、これまでにベクターをどの程度通過したかを保存します。次に、ループごとに、次のイベントがまだ発生しなくなるまでその位置を進め、繰り返したばかりのイベントを発生させます。

std::vector<Event> time_line;
size_t time_line_position;

void fire_new_events(Time t) {
    size_t new_time_line_position = time_line_position;

    while(new_time_line_position < time_line.size()
          && time_line[new_time_line_position].time <= t)
      ++new_time_line_position;

    fire_events(time_line.begin() + time_line_position,
                time_line.begin() + new_time_line_position);

    time_line_position = new_time_line_position;
}
于 2012-04-04T18:33:34.007 に答える