2

人気のフラッシュ ゲーム Chrontron を C++ で "エミュレート" したいと考えていたので、始めるにあたって助けが必要でした。(注: リリース用ではなく、自分用に練習しているだけです)

基本:
プレイヤーはタイムマシンを持っています。タイムマシンを使用する反復ごとに、並列状態
以前の状態と共存して作成されます。状態の 1 つがすべてを完了する必要があります。
ステージ終了前のレベルの目標。さらに、すべてのステージが可能でなければなりません
状態のパラドックスを引き起こすことなく、ステージを正常に終了する
普通にステージをクリアできたが、別の状態の影響で、
そうではなかった)。

そういうわけで、ゲームがどのように機能するかを説明します。私の問題が何であるかを本当に理解するには、少しプレイする必要があります。

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

実際の質問:

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

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

Q-未回答: SDL : OpenGL : Direct X
Q-回答済み: 並列処理を避ける
Q-回答済み: STL を使用して時間ステップ アクションを実装します。

人々が言っ​​たこととはかけ離れていますが、私は次のことをすべきです。
1. STL を使用してアクションを保存します。
2. 時間ステップに基づいてアクションを繰り返します。
3. 並列処理を忘れる -- ピリオド。(しかし、それがどのように行われるかについてのいくつかの指針が欲しい
これは練習用であるため、どのような場合に使用する必要があるかを示します)。

質問に加えて、私は以前に C#、PHP、および Java を主に使用したことがあるので、自分自身をホットショット プログラマーとは言いません。このプロジェクトを容易にするのに役立つ C++ 固有の知識は何ですか? (つまり、ベクトル?)

4

7 に答える 7

6

まず、「固定タイム ステップ」ゲーム ループを読んで理解する必要があります (ここに良い説明があります: 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 を使用します。3D にしたい場合は、後でいつでも SDL から OpenGL を使用できます。

于 2008-09-16T15:25:19.173 に答える
5

これはBraidと非常によく似ています。このための並列処理は本当に必要ありません-並列プログラミングは困難であり、このようなものでは、パフォーマンスは問題になりません。

ゲームの状態ベクトルは非常に急速に拡大するため (フレーム レートと保存するデータ量に応じて、おそらく 1 秒あたり数キロバイトのオーダーで)、リンクされたリストは必要ありません。スペースの不足 (レイアウトが不適切な場合、キャッシュ ミスによりパフォーマンスが大幅に低下する可能性があります)。並列タイムラインごとに、ベクトル データ構造が必要です。各並列タイムラインをリンク リストに保存できます。各タイムラインは、開始時刻を認識しています。

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

于 2008-09-16T15:06:15.053 に答える
1

私は以前にこのゲームをプレイしたことがあります。必ずしも並列処理が正しいとは思いません。ゲーム内のオブジェクト (レバー、ボックス、エレベーターなど) をプロセス間で、おそらくすべてのデルタで共有する必要があるため、並列処理の有効性が低下します。

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

于 2008-09-16T14:49:18.590 に答える
0

並列処理は答えではありません。プレーヤーのアクションを単に「記録」し、「前のアクション」のために再生する必要があります。

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

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

于 2008-09-16T14:57:53.123 に答える
0

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

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

于 2008-09-16T14:49:54.767 に答える
0

自分の教育に C++ をどうしても使用したい場合を除き、ゲームとグラフィックスのフレームワークにはXNAを検討する必要があります (C# を使用しています)。それは完全に無料で、多くのことを行います。まもなく Xbox Live でゲームを販売できるようになります。

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

于 2008-09-16T15:03:56.807 に答える
0

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

質問は少しあいまいです。これを C++ で記述しようとしているようですが、どの OS 向けにコーディングしていますか? クロス プラットフォームにする予定はありますか。3D、2D、ハイエンド、Web ベースなど、どのような種類のグラフィックが必要ですか。

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

于 2008-09-16T14:51:41.970 に答える