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

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

3
その場でスタックチャンクをロードする方法は?
私は現在、Minecraftに触発された無限の世界に取り組んでいます。チャンクは 16x16x16のブロックで構成されています。ブロック(キューブ)は1x1x1です。 これは、私のコンピューターで12チャンク(12x16)のViewRangeを使用して非常にスムーズに実行されます。いいね。 チャンクの高さを256に変更すると、これは-明らかに-途方もない遅延になります。 だから私が基本的にやりたいことはチャンクを積み重ねることです。つまり、私の世界は[∞、16、∞]チャンクが大きくなる可能性があります。 問題は今、その場でチャンクを生成する方法ですか? 現時点では、自分の位置を中心にして(ほぼ遠くに)存在しないチャンクを生成しています。まだチャンクをスタックしていないので、これはそれほど複雑ではありません。 ここで重要な注意点として、私はまた、最小/最大の高さが異なるバイオームを持ちたいと思っています。だから、バイオームに平地ブロックと最も高い層は、8(8×16)になります-バイオームで山脈のブロックと最も高い層は、14(14x16)になります。例として。 私ができることは、例えば私の上と下に1チャンクをロードすることです。 しかし、ここでの問題は、異なるbioms間の遷移がyの1つのチャンクよりも大きくなる可能性があることです。 私の現在のチャンクの読み込みアクションで 完全を期すために、現在のチャンクは「アルゴリズム」をロードしています private IEnumerator UpdateChunks(){ for (int i = 1; i < VIEW_RANGE; i += ChunkWidth) { float vr = i; for (float x = transform.position.x - vr; x < transform.position.x + vr; x += ChunkWidth) { for (float z …

2
OpenGL-モデル、ビュー、ワールドマトリックスの関係を理解する
これらのマトリックスがどのように機能するか、および適切なシステムを実行するために相互に関連してそれらをセットアップする方法を理解するのに少し問題があります。 私の理解では、モデルマトリックスはオブジェクトのマトリックスであり、たとえば立方体や球体です。アプリケーション/ゲームにはこれらの多くが存在します。 ワールドマトリックスは、3Dワールドの原点を定義するマトリックスです。出発点。 そして、ビューマトリックスは、すべてがこれで変換される「カメラ」であり、実際にすべてがこのマトリックスの代わりに動いているときに、実際のカメラのような錯覚を持っていることを確認します。 ここで少し迷ってしまいました。だから私はここの誰かがこれを正しく理解するのを助けてくれることを望んでいた。 すべてのmodelMatrixは、worldMatrixとworldMatrix、次にviewMatrixで変換/乗算されますか?それとも、すべてのmodelMatrixがviewMatrixで翻訳/乗算され、次にworldMatrixで翻訳/乗算されますか? これらすべてのマトリックスはどのように関連し、複数のオブジェクトと「カメラ」を備えた世界をどのように設定しますか? 編集: すでにフィードバックをありがとうございました。私はググリングをしましたが、もう少しよく理解できたと思いますが、疑似コードのアドバイスを得ることができますか? projectionMatrix = Matrix; makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix); modelMatrix = Matrix; identity(modelMatrix); translate(modelMatrix, [0.0, 0.0, -10.0]); // move back 10 on z axis viewMatrix = Matrix; identity(viewMatrix); // do some translation based on input with viewMatrix; viewMatrixをmodelMatrixで乗算または変換しますか、それとも逆にしますか?そしてそれから?私は現在、引数を描画するために2つの行列のみを必要とするような方法で、drawメソッドを持っています。 これが私の描画方法です: draw(matrix1 matrix2) …

2
コンポーネントベースのエンティティシステムのメッセージ処理に関するヒント
コンポーネントベースのエンティティシステムを実装しようとしていますが、メッセージングの処理方法について少し混乱しています。システムをテストできるように、解決したい2つの問題があります。以下は私がこれまでに持っているコードです、 Entityクラス: class Entity{ public: Entity(unsigned int id): id_(id) {}; void handleMessage(BaseMessage &message){ for(auto element: components_){ element.second->handleMessage(message); } } template<class T> void attachComponent(T *component){ //Consider making safer in case someone tries to attach same component type twice components_[typeid(T).hash_code()] = component; } template<class T> void detachComponent(void){ components_.erase(typeid(T).hash_code()); } template<class T> T* …

1
PC / Linuxでゲームメニュー/シェルオーバーレイを作成するためのアーキテクチャアプローチ?
私はカスタムデジタルテーブルトップインストール用のゲームのコレクションに取り組んでいます(Microsoft Surfaceテーブルと同様)。各ゲームは、フルスクリーンで実行される個別の実行可能ファイルになります。さらに、同時に実行するメニュー/シェルオーバーレイプログラムが必要です。メニュー/シェルを使用すると、ユーザーはゲームを一時停止したり、他のゲームに切り替えたり、ゲームの履歴を確認したりできます。 シェルのいくつかの重要な要件: 現在実行中のゲームに渡す前に、まずすべてのユーザー入力(主にマルチタッチ)をインターセプトします(たとえば、「一時停止」コマンドでポップアップすることを認識できるようにします)。 画面の任意の部分を表示でき、現在実行中の(おそらく一時停止されている)ゲームが下に表示されたまま、理想的には形状/サイズが動的で、ゲーム上でアニメーション化された入出力ドロワーエフェクトを作成できます。 現在、この問題に対するさまざまなアーキテクチャアプローチ(FrapsやDirectXオーバーレイなど)を調査していますが、これについて考えるいくつかの方法がないと思います。考慮すべき主なアプローチは何ですか? (テーブルは現在Windows PCで実行されていますが、代わりにLinuxボックスである可能性があることに注意してください。これにより、OSに依存しないソリューションが必要になるわけではありません。Windows固有のソリューションで満足します。しかし、 Linuxでこれを実現する方がはるかに簡単な場合は、Linuxに切り替えてLinux固有のソリューションを使用することを検討します。)

4
ゲームメッセージングシステムの設計
私は簡単なゲームを作っており、メッセージングシステムの実装を試みることにしました。 システムは基本的に次のようになります。 エンティティはメッセージを生成します->メッセージはグローバルメッセージキューにポストされます-> messageManagerはonMessageReceived(Message msg)を介してすべてのオブジェクトに新しいメッセージを通知します->オブジェクトが必要な場合、メッセージに作用します。 メッセージオブジェクトを作成する方法は次のとおりです。 //base message class, never actually instantiated abstract class Message{ Entity sender; } PlayerDiedMessage extends Message{ int livesLeft; } これで、SoundManagerEntityは、onMessageReceived()メソッドでこのようなことを実行できます。 public void messageReceived(Message msg){ if(msg instanceof PlayerDiedMessage){ PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg; if(diedMessage.livesLeft == 0) playSound(SOUND_DEATH); } } このアプローチの利点: 非常にシンプルで実装が簡単 必要な情報を持つ新しいMessageサブクラスを作成するだけでよいので、メッセージには必要なだけの情報を含めることができます。 短所: メッセージのサブクラスごとに異なるプールがない限り、メッセージオブジェクトをオブジェクトプールにリサイクルする方法を理解できません。そのため、時間の経過とともに、オブジェクトの作成やメモリの割り当てが非常に多くなっています。 特定の受信者にメッセージを送信できませんが、ゲームではまだ必要ないので、あまり気にしません。 ここで何が欠けていますか?より良い実装または私が見逃しているいくつかのアイデアがあるはずです。

1
ブラウザーゲームでロジックとデータを分離する
私はこれを何日も考えてきましたが、どうすればよいかわかりません。私はPHPで戦闘システムをリファクタリングしようとしています(...申し訳ありません。)これまでに存在したものは次のとおりです。 これまでのところ、戦闘に参加できるエンティティには2つのタイプがあります。それらをプレイヤーとNPCと呼びましょう。彼らのデータはすでにかなりよく書かれています。 戦闘に関与する場合、これらのエンティティはと呼ばれるDB内の別のオブジェクトでラップされCombatant、特定の戦いに関する情報を提供します。彼らは一度に複数の戦闘に参加することができます。 戦闘員を投入して戦闘用のロジックエンジンを作成しようとしています。 テスト用にすべてを模擬できるようにしたい。 ロジックとデータを分離するために、私は2つのインターフェース/基本クラス、ICombatantDataつまり1つともう1つを用意したいと考えていますICombatantLogic。データの2つの実装者は、データベースに格納されている実際のオブジェクト用と、モックオブジェクト用です。 私は今、物事の論理的な側面を設計することに関して不確実性にぶつかっています。プレイヤーとNPCごとに1つの実装者を指定できますが、問題があります。戦闘員は、ラップするエンティティを返すことができる必要があります。このゲッターメソッドはロジックまたはデータの一部である必要がありますか?ロジック部分は戦闘の実行に使用されるため、データ内にあるべきだと強く思います。誰かが今度の戦いについての情報を探しているだけでは利用できません。しかし、データクラスはDBからモックのみを分離し、NPCからのプレーヤーは分離しません。DBデータインプリメンターの2つの子クラス(エンティティタイプごとに1つ)を試してみる場合、モックをループに維持しながらどのように設計すればよいですか?IEntityProviderデータクラスに注入するような3つ目のインターフェイスが必要ですか? また、私が検討していたいくつかのアイデアでは、NPCのロジックが誤ってプレーヤーのデータをラップするなど、不一致がないことを確認するためにチェックを配置する必要があると思います。それは意味がありますか?それは、アーキテクチャが正しい場合にさえ起こり得る状況でしょうか、それとも、適切な設計がそれを完全に禁止しているので、チェックする必要がないのでしょうか? 誰かがクラス図などをレイアウトするのを手伝ってくれるなら、それはとても役に立ちます。ありがとう。 編集する また、モックデータクラスではは実際には必要ありませんEntity。代わりに、戦闘統計のようなすべてのパラメーターを直接指定しているだけです。おそらくそれは正しい設計に影響を与えるでしょう。

3
システムごとにプロファイリングとメモリプーリングを行う方法
各サブシステムの管理されたメモリプールのプロファイリングと維持に興味があったので、サウンドやグラフィックスなどで使用されているメモリの量に関する統計を取得できました。しかし、これを行うために機能するデザインは何でしょうか?複数のアロケーターを使用し、サブシステムごとに1つだけ使用することを考えていましたが、その場合、アロケーターのグローバル変数が発生します(または、私にはそれが見えるようになります)。私が見た/提案した別のアプローチは、単にnewをオーバーロードし、パラメータのアロケータを渡すことです。 私はここでバウンティを使ってスタックオーバーフローについて同様の質問をしましたが、それはおそらく私が漠然としているか、主題に関する知識を持つ十分な人々がいないかのようです。

1
コンポーネントプールの問題の処理-エンティティサブシステム
アーキテクチャの説明 エンティティシステムを作成(設計)していて、多くの問題に遭遇しました。私はそれを可能な限りデータ指向で効率的に保つようにしています。私のコンポーネントは、同種のプールに割り当てられたPOD構造(正確にはバイトの配列)です。各プールにはComponentDescriptorがあります。コンポーネント名、フィールドタイプ、フィールド名のみが含まれています。 エンティティは、コンポーネントの配列へのポインタにすぎません(アドレスはエンティティIDのように機能します)。EntityPrototypeには、エンティティ名とコンポーネント名の配列が含まれています。最後に、コンポーネントプールで機能するサブシステム(システムまたはプロセッサ)。 実際の問題 問題は、いくつかのコンポーネントが他のコンポーネントに依存していることです(モデル、スプライト、PhysicalBody、アニメーションは変換コンポーネントに依存します)。これは、コンポーネントの処理に関して多くの問題を引き起こします。 For example, lets define some entities using [S]prite, [P]hysicalBody and [H]ealth: Tank: Transform, Sprite, PhysicalBody BgTree: Transform, Sprite House: Transform, Sprite, Health and create 4 Tanks, 5 BgTrees and 2 Houses and my pools will look like: TTTTTTTTTTT // Transform pool SSSSSSSSSSS // Sprite pool …

3
弾丸パターンを効果的に作成する方法
現在、東方のようなトップダウンのシューティングゲームを作成しています。ゲームの最も重要な要素は、弾丸が生成されてプレーヤーに発砲されるさまざまなパターンと方法がたくさんあることです。このビデオを参照してください:http : //www.youtube.com/watch?v=4Nb5Ohbt1Sg # start=0 :60;終了= 9:53 ; 現時点では、移動と撮影の一連のステップがある「パターン」というクラスを使用しています。ただし、この方法は攻撃ごとに新しいパターンを作成する必要があり、おそらく特定の動作を実装する新しいBulletクラスを作成する必要があるため、非常に手間がかかると感じています。 この質問には、特定のパターンで弾丸を簡単に作成および保存するためにBulletMLを調べる必要があることを示すコメントが寄せられました。見た目はまともですが、他にどのような解決策がありますか。 更新 私の現在のデザインは次のとおりです: 実装されたパターンの例: 私のGigasPatternは、最初にアリスを画面上の特定のポイント(X、Y)に移動するテレポートを実行します。これが完了すると、パターンはMoverを使用してスプライトを移動し始めます(テレポーティングには個別のエフェクトとアニメーションがあります)。これらは非常に単純なので、実際には問題ありません。 シューターはまた、さまざまな攻撃を作成します。これも、私が投稿した質問のように、シューターがさまざまなパターンの弾丸を作成するために使用できるクラスです。ムーバーが目的地に到達すると、ムーバーとシューターの両方が停止し、非アクティブな状態に戻ります。パターンが完了し、AIによって削除され、新しいパターンが選択されます。

7
オブジェクトの更新、内部か外部か?
タイトルは少しわかりにくいですが、質問を短いフレーズで説明する方法は考えられません。だからここにあります: 物理/タイルベースなど、ゲームエンジンを作成しているときはいつでも、物事をどのように管理すればよいかわからないところにいつも行きます。世界のエンティティは自分で処理する必要がありますか、それとも管理するグローバルシステムが必要ですか? 簡単な例を次に示します。各オブジェクトが彼の周りの世界を見て(衝突をチェック)、それに基づいて移動する必要があります。 [注、これはオブジェクトがタイルごとに移動するタイルベースのゲームなので、物理を使用してタイル間を移動していません] public class Actor : GameObject { private void MoveTo(Vector2 location) { if (world.getTile(location) != solid && world.objAtTile(location) == null) { Tweener.addTween(this, location); } } } または、各オブジェクトの動きは、世界がすべてをチェックする世界で操作する必要がありますか? public class Actor : GameObject { private void MoveTo(Vector2 location) { world.moveTo(location); } } public class World { public void …

2
多数の独立した俳優をリアルタイムで管理する
私は大規模なリアルタイムストラテジーゲーム(理想的には数千のユニットを同時にアクティブにする)に取り組んでいますが、驚くほど遅くなることなくすべてのユニットを一度に管理するのに問題があります。問題は、タイムステップごとにすべての位置と状態を更新するのに時間がかかることです。これを軽減するための設計パターン/方法論/ヒントを知っていますか?

3
OpenGLの内部を学習するためにOpenGLドライバーがどのように実装されるのか知りたいのですが?
私はOpenGLを学んでいて、グラフィックスカードとの相互作用がどのようになるかを本当に知りたいです。 それがグラフィックスドライバーでどのように実装されたかを理解し、openglの完全な内部を知らせます(これにより、openglでのパフォーマンスに関する決定にどの段階/要因が影響するかを知ることができます)。 このパスを進める方法はありますか?「Mesa lib」を探索することは、この点で私に役立ちますか?私は正しい道にいますか? [この質問をSOFに投稿しましたが、ここがこの質問の正しい場所であるようです。]

3
コンポーネントベースのシステムにおけるエンティティの状態の役割は?
最近では、コンポーネントベースのエンティティシステムが大流行しています。誰もが自分たちが進むべき道であることに同意しているようですが、そのようなシステムを確実に実装している人は誰もいません。エンティティの状態(左折、立っている、ジャンプなど)がCBSでどのような役割を果たしているのでしょうか。それらはコントローラーのように機能しますか(つまり、イベントを処理し、それらのイベントに基づいてエンティティーの属性を変更します)? たとえば、状態がエンティティにクリップなしモードに入ることを要求する場合はどうでしょうか?それが入るときに、その状態は、エンティティのCollisionComponentをnullポインタまたは何かに設定する必要がありますか?(次に、終了時に、状態はエンティティのCollisionComponentを以前の状態に復元する必要があります。) また、エンティティの状態を別の状態に変更するのは、現在の状態の仕事だと思いますよね?

2
サーバー上のすべてのNPC / AIオブジェクトを管理する方法は?
私は単純なMMOを作成しており、現在、複数のユーザーがお互いを確認し、一緒に移動できるようにサーバークライアントアーキテクチャを配置しています。今度は敵を追加します。 世界で管理する必要のある何百ものNPCオブジェクトを最適に処理する方法を論じている記事へのリンクがあるかどうか疑問に思っていました。私はいくつかの検索を行ったが、これが通常どのように行われるかについての多くの情報を見つけることができなかった。 私が考えることができる実装を構造化する2つの方法: すべてのインスタンス化されたNPCオブジェクトをリストに保持し、NPCスレッドがそれらを順番にループして、それぞれに処理および必要なアクションを実行する必要があるロジックがあるかどうかを確認します。このデザインのパフォーマンスが十分かどうかはわかりませんか? イベントベースのシステム。AI / Logicを処理するメソッドをNPCクラスで作成し、関連するイベントが通知されたときにこのメソッドが呼び出されるようにします(相互作用しないAI機能のタイマーで(ワンダリングなど)、またはパケットから外部にイベントを通知します)。ハンドラー(近くに移動するプレーヤー、または範囲内で攻撃するプレーヤー)。 これらのアプローチのどちらが正しい方法ですか?これを行う他の方法は何ですか?

4
RPGのデータのロード
私はpythonを練習する方法として小さなテキストRPGを作成していますが、データをロードする方法についての質問に遭遇しています。ゲームはワイルドウェストゲームですが、あまり関連性はありません。武器とそのプロパティのリスト、キャラクター、シナリオなどのリストを保存する必要があります。このデータはクラスとしてですが、データの格納方法とロード方法は明確ではありません。 私の主な質問は、データとクラスの関係を中心に展開しています。私はここSEに関するいくつかの投稿を読みましたが、それらの多くはストレージに関連しているので、そこにいくつかの良い情報があります。 いつそのデータをロードする必要がありますか?たとえば、ゲームの開始時にプレイヤーはいくつかの武器から選択します。その時点ですべての武器をロードし、すべての武器オブジェクトをインスタンス化する必要がありますか?武器クラスには、インスタンス化せずにデータベースから武器を表示する機能が必要ですか? 助けてくれてありがとう。

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