質問

私は人気のある Flash ゲームである Chrontron を C++ で「エミュレート」したいと考えていましたが、始めるにはいくつかの助けが必要でした。(注記:リリース用ではなく、自分用に練習しているだけです)

Basics:
Player has a time machine. On each iteration of using the time machine, a parallel state
is created, co-existing with a previous state. One of the states must complete all the
objectives of the level before ending the stage. In addition, all the stages must be able
to end the stage normally, without causing a state paradox (wherein they should have
been able to finish the stage normally but, due to the interactions of another state,
were not).

ということで、これでゲームの仕組みが説明できました。あなたは私の問題が何であるかを本当に理解するためにそれを少しプレイする必要があります。

これを解決する良い方法は、リンクされたリストを使用して各状態を保存することだと思います。これは、おそらく時間に基づいてハッシュマップであるか、時間に基づいて反復するリンクされたリストです。まだ自信がありません。

実際の質問:

大まかな仕様がいくつかわかったので、これにどのデータ構造を使用するか、そしてその理由を決定するための助けが必要です。また、これを行うためにどのグラフィックス API/レイヤーを使用する必要があるのか​​知りたいです。SDL、OpenGL、または DirectX (現在の選択は SDL)。そして、並列状態を実装するにはどうすればよいでしょうか?並列スレッドでは?

編集(さらに明確にするため):
OS -- Windows (これは趣味のプロジェクトなので、後で Linux で行う可能性があります)
グラフィックス-2D言語-C ++(C ++である必要があります - これは次の学期のコースの練習です)

Q-未回答:SDL:OpenGL:ダイレクトX
Q-回答:並列処理を避ける
Q-回答:STL を使用してタイムステップ アクションを実装します。

So far from what people have said, I should:
1. Use STL to store actions.
2. Iterate through actions based on time-step.
3. Forget parallel processing -- period. (But I'd still like some pointers as to how it
could be used and in what cases it should be used, since this is for practice).

質問に付け加えますと、私はこれまで主に C#、PHP、Java を使用してきたので、自分を注目のプログラマーとは言いません。このプロジェクトを容易にするのに役立つ C++ 固有の知識は何ですか?(すなわち。ベクトル?)

役に立ちましたか?

解決

あなたがすべきことは、まず「固定タイムステップ」ゲーム ループを読んで理解することです (わかりやすい説明は次のとおりです: http://www.gaffer.org/game-physics/fix-your-timestep).

次に、フレームカウンターとアクションのペアのリストを保持します。STL の例:

std::list<std::list<std::pair<unsigned long, Action> > > state;

あるいは、ペアのリストのベクトルかもしれません。状態を作成するには、アクション (プレイヤーのインタラクション) ごとにフレーム番号と実行されるアクションを保存します。おそらく、アクションが単純に「キー <X> が押された」または「キー <X> が放された」場合に最良の結果が得られます。 ":

state.back().push_back(std::make_pair(currentFrame, VK_LEFT | KEY_PRESSED));

以前の状態を再生するには、プレーヤーがタイム マシンをアクティブにするたびにフレーム カウンターをリセットし、以前の各状態の状態リストを繰り返し処理して、現在のフレームと一致するものがあるかどうかを確認する必要があります。存在する場合は、その状態に対するアクションを実行します。最適化するには、以前の各状態リストの位置までの反復子のリストを保持できます。ここにいくつかあります 疑似コード そのために:

typedef std::list<std::pair<unsigned long, Action> > StateList;
std::list<StateList::iterator> stateIteratorList;
//
foreach(it in stateIteratorList)
{
  if(it->first == currentFrame)
  {
    performAction(it->second);
    ++it;
  }
}

ご理解いただけると幸いです...

別々のスレッドを使用すると、問題が非常に複雑になります。この方法では、毎回同じ結果が得られます。これは、別々のスレッド (どのように実装されるか実際にはわかりません) や非固定タイムステップ ゲーム ループを使用しても保証できません。

グラフィックス API に関しては、おそらく SDL が最も簡単に開始できるため、SDL を使用することになります。3D に移行したい場合は、後からいつでも SDL の OpenGL を使用できます。

他のヒント

これは非常によく似ています 三つ編み. 。これには並列処理は絶対に必要ありません。並列プログラミングは 難しい, このようなものでは、パフォーマンスは問題になりません。

ゲーム状態ベクトルは非常に急速に増大するため (フレーム レートと保存するデータ量に応じて、おそらく 1 秒あたり数キロバイト程度)、大量のオーバーヘッドを伴うリンク リストは望ましくありません。 (レイアウトが不適切な場合、キャッシュミスによりパフォーマンスに大きなペナルティが発生する可能性があります)。並列タイムラインごとに、ベクトル データ構造が必要です。各並列タイムラインをリンクされたリストに保存できます。各タイムラインは、それがいつ始まったかを知っています。

ゲームを実行するには、すべてのアクティブなタイムラインを反復処理し、各タイムラインから 1 フレーム分のアクションをロックステップで実行します。並列処理は必要ありません。

私は前にこのゲームをプレイしたことがあります。私は必ずしも並列処理が最善の方法だとは思いません。ゲーム内に共有オブジェクト (レバー、ボックス、エレベーターなど) があり、プロセス間 (場合によってはデルタごと) で共有する必要があるため、並列処理の効率が低下します。

私は個人的にアクションのリストを保持し、後続の反復ごとにアクションをインターリーブし始めます。たとえば、リストが <[iteration.action]> の形式である場合、3 回目以降はアクション 1.1、2.1、3.1、1.2、2.2、3.3 などが実行されます。

説明をざっと読んだ後、あなたは正しい考えを持っていると思います。状態データを保持する状態オブジェクトを用意し、これをリンクされたリストに配置します...並列スレッドは必要ないと思います...

グラフィックス API に関しては、私は opengl しか使用したことがありませんが、これは非常に強力で、優れた C / C++ API を備えていると言えます。*Nix コンピューターで messa ライブラリを使用できるため、opengl はよりクロスプラットフォームでもあります。

非常に興味深いゲームのアイデアです。並列コンピューティングがこの設計には有益であるという意見は正しいと思いますが、他の高リソース プログラムと同様ではありません。

質問は少し曖昧です。これを C++ で書くつもりのようですが、どの OS 向けにコーディングしているのでしょうか?クロスプラットフォームにする予定はありますか?また、どのような種類のグラフィックス (3D、2D、ハイエンド、Web ベースなど) を希望しますか。

したがって、基本的にはさらに多くの情報が必要です。

並列処理が解決策ではありません。プレイヤーのアクションを単に「記録」し、それを「前のアクション」として再生するだけです。

そこで、アクションを保持するベクトルのベクトル (単一リンク リスト) を作成します。アクションが実行されたフレーム番号 (またはデルタ) を保存し、その特定のインスタンス中にプレイヤーを表す「ダミー ボット」上でそのアクションを完了するだけです。ステートをループして次々にトリガーするだけです。

次のアクションが失敗したというだけの理由で状態パラドックスが発生すると、ゲームが簡単に「中断」されるという副作用が生じます。

自分自身の教育のために C++ を使用することに必死でない限り、必ず次の内容を参照する必要があります。 XNA ゲームとグラフィックス フレームワーク用 (C# を使用します)。これは完全に無料で、さまざまな機能を備えており、間もなく Xbox Live でゲームを販売できるようになります。

主な質問に答えると、Flash ですでに実行できることは、複数のスレッドを使用する必要はありません。位置のリストを配列に保存し、ロボットごとに異なるオフセットを使用してループするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top