タグ付けされた質問 「architecture」

コードの構造。ゲームエンジンの内部設計に関する質問。

5
キーボード入力システムの取り扱い
注:API制限(SFML)のためにコールバックを行うのではなく、ポーリングする必要があります。「まともな」タイトルがないこともおizeび申し上げます。 ここで2つの質問があると思います。受け取った入力を登録する方法と、それをどうするか。 入力の処理 たとえば、「A」キーが押されたことを登録したという事実と、そこからそれを行う方法について話します。 私は次のようなキーボード全体の配列を見てきました: bool keyboard[256]; //And each input loop check the state of every key on the keyboard しかし、これは非効率的です。たとえば、「A」キーを「左に移動するプレーヤー」に結合するだけでなく、毎秒30〜60回すべてのキーをチェックします。 次に、必要なキーを探すだけの別のシステムを試しました。 std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'. input->BindKey(Keys::PlayerLeft, …

2
Managerクラスを作成しないようにするにはどうすればよいですか?
XxxManagerゲームエンジンプログラミングでスタイルクラスを使用することは悪い考えですが、使用を避けようとしても、常にすべてのアクター/エンティティ/ゲームワールドの場所を保持し、それらに作用するものになります。Manager別の名前ではifになります。 これは本当に悪いパターンですか?もしそうなら、選択肢は何ですか?

3
ゲームエンジンのアセットを識別しますか?
ロードされたアセットを特定したいのですが、どちらを選択すべきかわかりません。2つのオプションがあります。 名前(文字列) これはunordered_map(O(1))を使用すると最も簡単で高速ですが、整数を使用する場合よりもずっと遅くなります。 コードで簡単に理解できます。 整数 最速。 コードでは理解できません。 文字列はそれほど安全でも高速でもないことを知っていますが、それはそれほど悪いのでしょうか、それともAAAタイトルで悪いとみなされるだけですか?整数を使用するために列挙を作成できましたが、実行時にファイルからシーン、アセットなどをロードすると、列挙を使用できません。実行時に生成されたこれらの整数を読みやすくする方法はありますか? この問題にはインターネット全体にいくつかのスレッドがあることは知っていますが、どの場合にこれが重要であるかはわかりませんでした。

4
開発の後半の段階で、ネットワークコードをどのように記述できますか?
私は現在、ゲームの作成の初期段階にあり、最終的にはほとんどの面で改善したいと思っています。 ネットワークコードの作成をスキップして、かなり簡単に実装したまま、つまり追加するだけでゲーム全体を書き直す必要がないようにするにはどうすればよいですか。 何を覚えておく必要がありますか? 物理学/衝突検出、ゲームロジック、データタイプ、アニメーション/レンダリングを互いに分離するコンポーネントパターンがあります。 ネットワークコードがまだ実装されていないクライアントとサーバーを作成して、ローカルでテストする方法を教えてください。 クライアントで何をすべきか、サーバーで何をすべきか?ネットワークコードが終了し、サーバーとクライアント間でメッセージを送信し、遅延などがない場合でもアカウントにメッセージを送信するふりをする必要がありますか? 編集:トップダウンRPGになる予定です。友人のためにサーバーをホストするシンプルなマルチプレイヤーは私が考えていることです。それでも、「サーバーは常に正しい」というアプローチにしたいと思います。 編集2:私は私の心のセットがどうあるべきかについてのいくつかのポインタを探していると思います。すべてのエフェクト/変更を即座に適用するのではなく、キーボード入力やアニメーションなどをどのように処理すればよいですか。うーん、私は結局のところどこかに行く前にネットワークについて適切に読む必要があるかもしれません。

2
ネットワーク化されたリアルタイムゲームにゲーム状態のスナップショットシステムをどのように実装しますか?
ネットワーククラスのプロジェクトとして、シンプルなクライアントサーバーリアルタイムマルチプレイヤーゲームを作成したいと思います。 リアルタイムのマルチプレイヤーネットワークモデルについて多くのことを読んでおり、クライアントとサーバーの関係と遅延補償のテクニックを理解しています。 私がしたいことは、Quake 3ネットワークモデルに似たものです。基本的に、サーバーはゲーム全体の状態のスナップショットを保存します。クライアントから入力を受け取ると、サーバーは変更を反映した新しいスナップショットを作成します。次に、新しいスナップショットと最後のスナップショットの差を計算し、それらを同期するためにそれらをクライアントに送信します。 このアプローチは本当に堅実に思えます-クライアントとサーバーが安定した接続を持っている場合、それらを同期させるために必要最小限のデータのみが送信されます。クライアントの同期が外れると、完全なスナップショットも要求できます。 ただし、スナップショットシステムを実装する良い方法を見つけることはできません。シングルプレイヤープログラミングアーキテクチャから離れて、ゲームの状態を次のように保存する方法を考えるのは本当に難しいと思います。 すべてのデータはロジックから分離されています ゲームの状態のスナップショット間の差を計算できます ゲームエンティティはコードを使用して簡単に操作できます スナップショットクラスはどのように実装されますか?エンティティとそのデータはどのように保存されますか?すべてのクライアントエンティティには、サーバー上のIDと一致するIDがありますか? スナップショットの違いはどのように計算されますか? 一般的に:ゲーム状態のスナップショットシステムはどのように実装されますか?

3
純粋な関数型プログラミングとゲームの状態
関数型プログラミング言語で(一般に)状態を処理する一般的な手法はありますか?グローバル状態を処理するためのすべての(機能的な)プログラミング言語には解決策がありますが、できる限りこれを避けたいと思います。 純粋に機能的な方法でのすべての状態は、機能パラメーターです。そのため、特定の入力またはトリガーで世界を操作するすべての関数のパラメーターとして、ゲーム全体の状態(世界、プレイヤー、ポジション、スコア、アセット、敵などの巨大なハッシュマップ)を配置する必要があります。関数自体は、gamestate blobから関連情報を選択し、それを使用して、gamestateを操作し、gamestateを返します。しかし、これは問題に対する貧弱な解決策のように見えます。ゲームステート全体をすべての関数に入れた場合、グローバル変数や命令型アプローチとは対照的に、私にとってメリットはありません。 関連する情報だけを関数に入れて、指定された入力に対して実行されるアクションを返すことができます。そして、1つの関数がすべてのアクションをgamestateに適用します。しかし、ほとんどの機能には多くの「関連する」情報が必要です。move()オブジェクトの位置、速度、衝突のマップ、すべての敵の位置、現在のヘルスなどが必要です。したがって、このアプローチも機能しないようです。 私の質問は、関数型プログラミング言語で膨大な量の状態をどのように処理するのか、特にゲーム開発の場合ですか? 編集: Clojureでゲームを構築するためのゲームフレームワークがいくつかあります。この問題を部分的に解決するアプローチは、ゲーム内のすべてのオブジェクトを「エンティティ」としてスレッド化し、巨大なバッグに入れることです。ギガント主な機能は、画面を保持しているし、エンティティとハンドルイベント(:on-key-down、:on-initこのエンティティのため、...)とは、メインディスプレイのループを実行します。しかし、これは私が探しているクリーンなソリューションではありません。

2
エンティティIDシステムを使用する利点は何ですか?
現在、Programming Game AI By Exampleという本を読んでいます。 この本では、ゲーム内の各エンティティに一意のID番号を割り当てることに言及しています。場合エンティティしばしばAのニーズコンタクトエンティティにB、Aが参照なるBを送信することによってBへのID番号をEntityDatabaseのクラス。このクラスはID番号を受け取り、エンティティへの参照を返します。 一部のエンティティのID番号は、一部のエンティティ(メインのゲームキャラクター)のIDを含むファイルから取得することもできます。 私の質問は次のとおりです。なぜこれを行うのでしょうか?参照を直接操作できないのはなぜですか?直接参照を取得するのは難しいですか?IDシステムの使用は一般的なアプローチですか?IDを使用しないゲームはありますか? ゲーム開発は初めてです。エンティティIDシステムを使用する利点を説明してください。長所と短所。具体的な例は素晴らしいでしょう。ありがとう

3
「一定のゲーム速度最大FPS」ゲームループで非常に混乱
最近、ゲームループに関する次の記事を読みました:http : //www.koonsolo.com/news/dewitters-gameloop/ 推奨される最後の実装は、私を深く混乱させます。私はそれがどのように機能するか理解していません、そしてそれは完全な混乱のように見えます。 私は原則を理解しています:ゲームを一定の速度で更新し、残っているものはできるだけ多くゲームをレンダリングします。 私はあなたが使用できないと考えています: 25ティックの入力を取得 975ティックのゲームをレンダリングする あなたは2番目の最初の部分の入力を取得するだろうし、これは奇妙に感じるので、アプローチ?それとも、記事で何が起こっているのですか? 基本的に: while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) それはどのように有効ですか? 彼の価値を仮定しましょう。 MAX_FRAMESKIP = 5 メインゲームループが言う前に、初期化の直後に割り当てられたnext_game_tickを想定しましょう... 500。 最後に、ゲームにSDLとOpenGLを使用しており、OpenGLはレンダリングのみに使用されているためGetTickCount()、SDL_Initが呼び出されてからの時間が返されると仮定します。 SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization. ソース:http : //www.libsdl.org/docs/html/sdlgetticks.html 著者もこれを想定しています: DWORD next_game_tick = GetTickCount(); // GetTickCount() returns the …

1
クラス間のデータと依存関係をきれいにエレガントに処理する方法
私はSFML 2の2Dトップダウンゲームに取り組んでおり、すべてがうまく機能し、調和するエレガントな方法を見つける必要があります。 説明させてください。drawメソッドとupdateメソッドをすべてのクラスに提供する抽象ベースから継承するクラスがいくつかあります。 ゲームループでは、updateを呼び出してから各クラスを描画します。これは非常に一般的なアプローチだと思います。タイル、コリジョン、プレーヤー、およびすべてのタイル/画像/テクスチャを含むリソースマネージャーのクラスがあります。SFMLでの入力の動作方法のため、各クラスで(必要に応じて)更新呼び出しで入力を処理することにしました。 これまで、必要に応じて依存関係を渡してきました。たとえば、移動キーが押されたときのプレーヤークラスで、衝突クラスのメソッドを呼び出して、プレーヤーが移動したい位置が衝突かどうかを確認します。衝突がない場合にのみプレーヤーを移動します。 これはほとんどの部分でうまく機能しますが、もっと良くできると信じています。どうすればいいのかわかりません。 実装する必要のあるより複雑なものがあります。例えば、プレーヤーは地面のオブジェクトに近づき、キーを押してそれを拾い上げたり、それをインベントリに表示することができます。これは、いくつかのことを行う必要があることを意味します。 プレイヤーがキーを押すとルート可能なアイテムの範囲内にあるかどうかを確認し、そうでない場合は先に進まないでください。 アイテムを見つけます。 アイテムのスプライトテクスチャをデフォルトのテクスチャから「looted」テクスチャに更新します。 アイテムの衝突を更新します。形状が変更されたか、完全に削除された可能性があります。 追加されたアイテムでインベントリを更新する必要があります。 すべてを通信させるにはどうすればよいですか?現在のシステムでは、クラスがスコープ外になり、メソッド呼び出しが至る所で行われます。1つの大きなマネージャーですべてのクラスを結び付けて、それぞれに親マネージャークラスへの参照を与えることができますが、これはほんの少しだけ良いようです。 どんなヘルプ/アドバイスも大歓迎です!不明な点がある場合は、詳しく説明させていただきます。
12 c++  2d  architecture  sfml 

4
循環クラスの依存関係
互いに必要な2つのクラスがあるのは悪い設計ですか? 私はGameEngineいくつかのGameStateオブジェクトを持っているクラスを持っている小さなゲームを書いています。いくつかのレンダリングメソッドにアクセスするには、これらのGameStateオブジェクトもGameEngineクラスを知る必要があります。つまり、循環依存関係です。 この悪いデザインを呼んでもらえますか?よくわからないが、現時点ではこれらのことをリファクタリングできるので、私はただ尋ねている。
12 c++  architecture 

1
ネットワーク上でデータ構造の同期を維持する方法は?
環境 私が取り組んでいるゲーム(一種のポイントアンドクリックグラフィックアドベンチャー)では、ゲームの世界で起こるほとんどすべてのことが、次のような構造のアクションマネージャーによって制御されます。 たとえば、オブジェクトを調べた結果、キャラクターに挨拶をさせ、少し歩き、座った場合、次のコードを生成します。 var actionGroup = actionManager.CreateGroup(); actionGroup.Add(new TalkAction("Guybrush", "Hello there!"); actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300)); actionGroup.Add(new SetAnimationAction("Guybrush", "Sit")); これにより、新しいアクショングループ(上の画像の行全体)が作成され、マネージャーに追加されます。すべてのグループは並行して実行されますが、各グループ内のアクションはチェーン化され、2番目のグループは最初のグループが終了した後にのみ開始されます。グループ内の最後のアクションが終了すると、グループは破棄されます。 問題 ここで、この情報をネットワーク全体に複製する必要があります。そのため、マルチプレイヤーセッションでは、すべてのプレイヤーが同じものを見ることができます。個々のアクションをシリアル化することは問題ではありません。しかし、私はネットワーキングに関してはまったくの初心者であり、いくつか質問があります。この説明の単純化のために、アクションマネージャーコンポーネントを次のように抽象化できると思います。 var actionManager = new List<List<string>>(); 上記のデータ構造の内容をすべてのプレーヤー間で同期させるにはどうすればよいですか? コアの質問に加えて、私はそれに関連するいくつかの他の懸念も持っています(つまり、上記と同じ問題のすべての可能な影響): 私は、との1(サーバーとクライアントの両方として動作する選手の一人で)サーバ/クライアントアーキテクチャを使用している場合は、クライアント生み出したアクションのグループを、彼はマネージャーに直接追加、または唯一のリクエストを送信する必要がありますサーバーに、順番にすべてのクライアントにそのグループを追加するように指示しますか? パケット損失などはどうですか?ゲームは決定論的ですが、クライアントで実行されるアクションのシーケンスに矛盾があると、世界の一貫性のない状態につながる可能性があると考えています。そのような問題からどのように保護しますか? 一度に追加するアクションが多すぎると、接続に問題が発生しませんか?それを軽減する方法はありますか?

4
オブジェクト指向OpenGL
私はしばらくの間OpenGLを使用しており、多数のチュートリアルを読みました。それらの多くがまだ固定パイプラインを使用しているという事実は別として、彼らは通常、すべての初期化、状態変更、および描画を1つのソースファイルにスローします。これは限られた範囲のチュートリアルには適していますが、完全なゲームにスケールアップする方法を見つけるのに苦労しています。 OpenGLの使用をファイル間でどのように分割しますか?概念的には、たとえば、純粋に画面に素材をレンダリングするレンダリングクラスを持つことの利点を見ることができますが、シェーダーやライトのようなものはどのように機能しますか?ライトやシェーダーなどのクラスを個別に用意する必要がありますか?

2
イベントハンドラに夢中になることはできますか?私は自分のデザインで「間違った方法」で進んでいますか?
私は、イベントハンドラが本当に好きだと決めたと思います。分析の麻痺に少し苦しんでいるかもしれませんが、デザインを扱いにくくしたり、デザインの決定に対する他の予期せぬ結果にぶつかったりすることを心配しています。 私のゲームエンジンは現在、パンニングオーバーヘッドカメラで基本的なスプライトベースのレンダリングを行っています。私のデザインは次のようになります。 SceneHandler SceneListenerインターフェイスを実装するクラスのリストが含まれます(現在はSpriteのみ)。ティックごとにrender()を呼び出し、onCameraUpdate()を送信します。SceneListenersへのメッセージ。 InputHandler ティックごとに1回入力をポーリングし、単純な「onKeyPressed」メッセージをInputListenersに送信します。SceneHandlerインスタンスを保持し、updateCamera()をトリガーするCamera InputListenerがあります。入力内容に基づいたイベント。 AgentHandler ティックごとにエージェント(AI)でデフォルトアクションを呼び出し、登録されている新しいイベントがないかスタックをチェックし、必要に応じて特定のエージェントにディスパッチします。 そのため、シーン内を移動し、基本的なステアリング動作を使用して移動できる基本的なスプライトオブジェクトがあります。私は衝突の検出に着手しましたが、これは私の設計が進んでいる方向が良いかどうかわからないところです。多数の小さなイベントハンドラを用意するのは良い習慣ですか?ある種のCollisionHandlerを実装しなければならないという自分のやり方を想像する。 AI、衝突の更新、および1つのクラスでの他のエンティティの相互作用を処理する、より統合されたEntityHandlerを使用した方が良いでしょうか?それとも、どんな種類のイベントに基づいてメッセージを相互に渡す多くの異なるイベント処理サブシステムを実装するだけでいいのでしょうか?これらすべてのサブイベントハンドラーを調整するだけの責任を負うEntityHandlerを作成する必要がありますか? InputHandlerやSceneHandlerなど、場合によっては、これらが非常に特殊なタイプのイベントであることを認識しています。ゲームコードの大部分は入力を気にせず、大部分は純粋にシーンのレンダリングで発生する更新を気にしません。したがって、これらのシステムの分離は正当であると感じています。ただし、私はこの質問を具体的にゲームロジックタイプイベントに近づいています。

2
XBoxコントローラーを抽象化する正しい方法
アプリケーションの入力として使用したいXBox360コントローラーがあります。 私が解決できないのは、インターフェースを介してこれを公開するベストプラクティスの方法です。 舞台裏では、コントローラーを処理するクラスはポーリングボタンの状態に依存しています。 最初に何かリンクを試しました: Event ButtonPressed() as ButtonEnum どこにButtonEnumあったButtonRed、ButtonStartなど これは、ボタンの押下のみをサポートし、ホールド/パターン(2回押すなど)をサポートしないという点で少し制限されています 次のアイデアは、単にボタンの状態をアプリに公開することです Property RedPressed as Boolean Property StartPressed as Boolean Property Thumb1XAxis as Double これは非常に柔軟ですが、実際にはアプリに多くの作業を強制し、アプリにポーリングを要求します-可能であればイベント駆動型を好むでしょう。 たとえば、複数のイベントを追加することを検討しました。 Event ButtonPressed(Button as ButtonEnum) Event ButtonPressedTwice(Button as ButtonEnum) Event ButtonHeldStart(Button as ButtonEnum) Event ButtonHeldEnd(Button as ButtonEnum) しかし、これは少し不格好なようで、「バインドボタン」画面に大きな痛みがありました。 誰かが、コントローラーからの入力を処理する「正しい」方法を教えてください。 注:インターフェイスを実装するクラス内でSlimDXを使用しています。これにより、状態を非常に簡単に読み取ることができます。私の問題を解決する代替品も歓迎します

2
XNAを使用したゲームアーキテクチャに関する質問
だから私はついにXNAで遊んで、2Dゲームを作ることをいじっていました(iOSで開発した友人からたくさんのアート資産があります) 多くのことは簡単に実行できるように見えますが、ほとんどの文学(たとえば、私が買った本)は2Dにあまり注意を払っていないので、私はたくさんのものに困惑しています。 私は、以下の質問についての明確化またはより多くの情報を指摘されていることを本当に感謝します: ゲームサービスのポイントは何ですか?他のGameComponentがオブジェクトを取得できるようにオブジェクトをサービスとして登録するイディオム全体を理解していますが、これを単純に公開または静的にするだけではどうでしょうか?たとえば、私の本では、Game.csクラスにSpriteBatchオブジェクトを登録することを推奨しています。とにかくGameのインスタンスは1つだけ(シングルトン)でなければならないので、これを単純にパブリック/静的にするのがどのように好ましいのかわかりません。 GameComponentまたはRenderableGameComponentから継承する必要がある場合、私は混乱しています。私はすべてのエンティティが単一のマネージャーによって作成/所有され、他の事柄についても同じになるように、マネージャー/コントローラーの設計に従うことを試みています。現在、各Manager / ControllerにGameComponentを継承させていますが、GameオブジェクトがすべてのManagerを所有し、それらの更新を手動で呼び出して描画することで、これをどのように解決できますか? ContentLoad()の前に Initializeが呼び出されることに気付きました。Initializeでエンティティ(スプライト、プレーヤーなど)の一部を作成したいので、この迷惑を見つけましたが、それらをロードすることはできません。読み込むための呼び出しがまだ行われていないため、SpriteSheetsまたはTextures。私はおそらく間違って初期化していますか、または人々はContentLoadのさらに下のテクスチャを割り当てるだけですか? それらは本当に理解していないという私の最大の「WTF」のようです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.