タグ付けされた質問 「design-patterns」

設計パターンは、ソフトウェア設計の特定のコンテキスト内で一般的に発生する問題に対する一般的な再利用可能なソリューションです。

8
ゲームアーキテクチャでMVCとTDDが採用されないのはなぜですか?[閉まっている]
私はこれを序文として、膨大な量のゲームソースを見たことがなく、ゲームのやり方で多くを構築したこともないと言います。 しかし、Webアプリで「エンタープライズ」コーディングプラクティスを採用しようとすると、ゲームのソースコードを真剣に見ると頭が痛くなります。「このビューロジックはビジネスロジックで何をしているのでしょうか。リファクタリングが必要です。 」 これを使用してゲームプロジェクトを開始しようとしているので、これを心配しています。これを使用するゲームの例があまりないので、開発プロセスをmvc / tddしようとしても邪魔されるのか、助けになるのかわかりませんまたは、コミュニティでより良いアーキテクチャの実践を推進します。 以下は、プロトタイピングゲームに関する素晴らしい記事からの抜粋です。しかし、私には、多くのゲーム開発者が本番ゲームコードを記述する際に使用しているように見える態度を正確に感じました。 間違いその4:ゲームではなくシステムを構築する ...あなたが自分の前に直接進まない何かに取り組んでいるのを見つけたら、すぐにそこで止めてください。プログラマーとして、私たちはコードを一般化し、エレガントにし、あらゆる状況に対処できるようにする傾向があります。かゆみはひっかき傷ではなく非常に難しいことがわかりましたが、その方法を学ぶ必要があります。コードではなく、最終的に出荷するゲームであることに気付くまでに何年もかかりました。 エレガントなゲームコンポーネントシステムを記述せず、エディターを完全にスキップしてコード内の状態を固定し、データ駆動型の自己解析的なXMLの狂気を避け、気の毒なことをコーディングするだけです。 ...できるだけ早く画面に表示します。 また、「余分な時間をかけてこれを正しい方法で行えば、ゲームでそれを再利用できる」という議論を決して使わないでください。今まで。 ゲームは(ほとんど)視覚指向であるため、コードがビュー内で大きく重み付けされるので、モデル/コントローラーにデータを移動するメリットはほとんどありません。 MVCがパフォーマンスオーバーヘッドを導入するという議論を聞いたことがありますが、これは時期尚早な最適化であり、MVCオーバーヘッドを心配する前に取り組むべきより重要なパフォーマンスの問題があるようです(たとえば、レンダリングパイプライン、AIアルゴリズム、データ構造トラバーサルなど)。 TDDについても同じです。テストケースを採用しているゲームはあまり見られませんが、おそらくこれは上記の設計上の問題(ビューとビジネスの混合)と、視覚的なコンポーネント、または確率的な結果に依存するコンポーネント(物理シミュレーション内で操作するなど)をテストするのが難しいという事実による可能性があります)。 おそらく間違ったソースコードを見ているだけなのに、なぜゲームデザインでこれらの「エンタープライズ」プラクティスが採用されていないのでしょうか?ゲームの要件は本当に大きく異なりますか、それとも人/文化の問題ですか(つまり、ゲーム開発者のバックグラウンドが異なるため、コーディングの習慣も異なります)。

9
ゲーム開発に役立つプログラミングデザインパターンは何ですか?[閉まっている]
私はデザインパターンに関する書籍をいくつか持っており、いくつかの記事を読みましたが、どのプログラミングデザインパターンがゲーム開発に役立つかを直感的に理解することはできません。 たとえば、モデルビューコントローラー、シングルトン、ファクトリー、コマンドなどのいくつかのデザインパターンを詳しく説明したデザインパターンを含むActionScript 3という本があります。 これを初めて知った人として、これらのどれが役立つか、または実際、これらのどれが私が学び、使用しようとしている設計パターンであるかを理解できません。おそらく、私が気づいていないゲームプログラミング固有のデザインパターンが他にありますか? ゲーム開発で特定のデザインパターンを使用した経験がある場合は、ぜひ聞いてください。それが使用された理由、コードサンプル、またはオンラインリソースについての推論は、それらがあれば非常に役立ちます。私は現在、ActionScript 3とC ++の実装に最も興味を持っていますが、あらゆる言語の経験と例から間違いなく恩恵を受けることができます。 ありがとう!

5
GameManager神オブジェクトを回避する方法は?
ゲームコードの構造化に関する質問の答えを読んだところです。ユビキタスGameManagerクラスについて、そしてそれが本番環境でどのように頻繁に問題になるのかと思いました。これについて説明しましょう。 まず、プロトタイピングがあります。素晴らしいコードを書くことを誰も気にせず、ゲームプレイが積み重なるかどうかを確認するために何かを実行しようとします。 その後、グリーンライトがあり、物事をきれいにするために、誰かがを書きますGameManager。おそらく、たくさんのを保持するために、おそらくGameStatesいくつかを保存するためGameObjectsに、実際には大きなものはありません。かわいい、小さな、マネージャー。 プリプロダクションの穏やかな領域では、ゲームはうまく形成されています。コーダーには、適切な睡眠の時間と、素晴らしいデザインパターンを使用して物事を構築するための多くのアイデアがあります。 その後、生産が開始され、もちろん、すぐにクランチタイムがあります。バランスの取れた食事はなくなり、バグトラッカーは問題を抱えて割れ、人々はストレスを感じ、昨日ゲームをリリースする必要があります。 その時点で、通常、GameManagerある本物のビッグ(滞在丁寧に)混乱。 その理由は簡単です。結局のところ、ゲームを作成するときは、すべてのソースコードが実際にゲームを管理するためにここにあります。この小さな追加機能またはバグ修正をに追加するだけで、他のすべてがとにかく保存されます。時間が問題になると、別のクラスを記述したり、この巨大なマネージャーをサブマネージャーに分割する方法はありません。GameManager もちろん、これは古典的なアンチパターン、つまり神オブジェクトです。それは悪いことであり、合併する痛み、維持する痛み、理解する痛み、変革する痛みです。 これを防ぐために何を提案しますか? 編集 名前のせいにするのは魅力的だと思います。もちろん、GameManagerクラスを作成することはそれほど素晴らしい考えではありません。しかし、同じことがクリーンに起こることができるGameApplicationか、GameStateMachineまたはGameSystem、ダクトテープの好きなプロジェクトの終わりまでになってしまうこと。命名に関係なく、ゲームコードのどこかにそのクラスがあります。これは現時点では単なる胚に過ぎません。どのモンスターになるかはまだわかりません。したがって、「ネーミングのせいにする」という答えは期待していません。これが発生しないようにする方法、コーディングアーキテクチャ、および/またはチームが本番のいずれかの時点で発生することを知って従うことができるプロセスが必要です。1か月間のバグ修正と土壇場での機能が、それらがすべて1つの巨大な保守不能なマネージャーになったという理由だけで、言うのを捨てるのはあまりにも悪いことです。

5
ゲームの俳優は自分自身を描く責任がありますか?
私はゲーム開発は初めてですが、プログラミングは初めてです。 私は(再び)JavaScriptのcanvas要素を使用してPongタイプのゲームで遊んでいます。 Paddle次のプロパティを持つオブジェクトを作成しました... width height x y colour 次のPongようなプロパティを持つオブジェクトもあります... width height backgroundColour draw()。 draw()現在、メソッドはをリセットしてcanvasおり、そこで問題が発生しました。 必要があるPaddleオブジェクトが持つdraw()その描画方法は責任、または必要があるdraw()のPongオブジェクトがその役者を描くための責任がある(私が間違ってる場合、私はそれが正しい用語であると仮定し、私を修正してください)。 私はのためにそれがadvantagousだろうと考え出しPaddle自体を描画するために、私は2つのオブジェクトをインスタンス化するように、PlayerとEnemy。それはでなかった場合Pongのdraw()、私は二度同様のコードを記述する必要があると思います。 ここでのベストプラクティスは何ですか? ありがとう。

9
Unityで、シングルトンパターンを正しく実装するにはどうすればよいですか?
主に、Unityでシングルトンオブジェクトを作成するためのいくつかのビデオとチュートリアルを見てきましたGameManager。これらは、シングルトンのインスタンス化と検証にさまざまなアプローチを使用しているようです。 これに対する正しい、またはむしろ好ましいアプローチはありますか? 私が遭遇した2つの主な例は次のとおりです。 最初 public class GameManager { private static GameManager _instance; public static GameManager Instance { get { if(_instance == null) { _instance = GameObject.FindObjectOfType<GameManager>(); } return _instance; } } void Awake() { DontDestroyOnLoad(gameObject); } } 第二 public class GameManager { private static GameManager _instance; public static GameManager Instance …

7
小売ゲームは「制御の反転」と「依存性注入」を使用していますか?
私が知っているより勤勉なソフトウェア開発者の多くは、オブジェクトへの参照を処理するために、制御の反転と依存性注入に移行しています。Flashゲームの観点から言えば、私はAAAスタジオのすべてのインとアウトを知らないので、これらは小売ゲームの世界で使用されていますか?

3
チームはソースファイルの上書きをどのように防止しますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Game Development Stack Exchangeで話題になるようにします。 4年前に閉鎖されました。 たとえば、ゲームエンジンなどが複数の人によって同時に処理されているときに、上書きをどのように防ぐことができるのか、ということが起こりました。 開発者1が作業してAudio.cppおり、開発者2も作業をしているとしましょう。Audio.cppこれは、一般的に大規模なチームで上書きに対処するためにどのように管理されていますか?(つまり、開発者2がファイルを開くのを停止して、開発者1が終了するまで)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

1
新しいオブジェクトを即座にインスタンス化するのではなく、オブジェクトプールの作成と使用を常に検討する必要があるのはなぜですか?
このパターンについて何度か読みました(ベストプラクティスの観点から)。 メモリ割り当て:新しいオブジェクトを即座にインスタンス化する代わりに、オブジェクトプールの作成と使用を常に検討してください。メモリの断片化を減らし、ガベージコレクタの動作を減らすのに役立ちます。 ただし、実際に何を意味するのかわかりません。どうすれば実装できますか? たとえば、Unity GameObjectのInstantiateメソッドを使用してをインスタンス化できますか? Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity); この使用は推奨されませんか?他に何を意味できますか?

4
「ゲームオブジェクト」-およびコンポーネントベースのデザイン
私は過去3〜4年間、趣味のプロジェクトに取り組んでいます。シンプルな2Dおよび3Dゲーム。しかし最近、より大きなプロジェクトを始めました。ここ数か月間、私はすべてのゲームオブジェクトのベースとなるゲームオブジェクトクラスを設計しようとしていました。何度も試行錯誤を繰り返した後、グーグルに目を向けると、すぐにいくつかのGDC PDFおよびPowerPointが示されました。そして今、私はコンポーネントベースのゲームオブジェクトを把握しようとしています。 エンジンはゲームオブジェクトを作成し、その後、健康、物理学、ネットワークなどの処理を行うさまざまなコンポーネントをアタッチすることを理解しています。しかし、私が理解していないのは、コンポーネントXがYがオブジェクトの状態を変更したかどうかを知る方法です。健全性はHealthComponentによって制御されているため、PhysicsComponentはプレーヤーが生きているかどうかをどのように知るのでしょうか。そして、HealthComponentはどのようにして「プレイヤーが死んだアニメーション」を再生しますか? 私はそれが次のようなものであると感じていました(HealthComponent内): if(Health < 0) { AnimationComponent.PlayAnimation("played-died-animation") } しかし、もう一度、HealthComponentは、どのように接続されているゲームオブジェクトにAnimationComponentが接続されていることを知るのでしょうか?私がここで見る唯一の解決策は AnimationComponentがアタッチされているかどうかを確認してください(コンポーネントコード内またはエンジン側) コンポーネントには他のコンポーネントが必要ですが、それはコンポーネント設計全体と戦うようです。 HealthWithAnimationComponent、HealthNoAnimationComponentなどのように書きます。これもコンポーネント設計のアイデア全体と戦うようです。

2
2つのゲーム状態を補間する方法は?
すべてのオブジェクトの位置が2つの更新状態の間で補間されるシステムを作成するための最良のパターンは何ですか? 更新は常に同じ頻度で実行されますが、任意のFPSでレンダリングできるようにしたいです。そのため、更新頻度よりも低いか高いかに関係なく、1秒あたりのフレーム数に関係なく、レンダリングは可能な限りスムーズになります。 現在のフレームから将来のフレームまで、1フレームを将来の補間に更新します。この回答には、これを行うことについて説明するリンクがあります。 半固定または完全固定のタイムステップ? 編集:補間で最後と現在の速度をどのように使用できますか?たとえば、線形補間だけでは、位置間を同じ速度で移動します。2つのポイント間の位置を補間する方法が必要ですが、補間の各ポイントでの速度を考慮します。パーティクル効果のような低レートのシミュレーションに役立ちます。

3
ドワーフ要塞の命令順序アーキテクチャ
AI用のコマンドオーダーシステムを実装する最もエレガントな方法は何ですか?たとえば、小人の要塞では、森林伐採エリアに木材の切断をマークすると、小人は次のシーケンスを実行します。 木に行く 木を切る 備蓄に木材を届ける 別の木に行く 等々.. 私はすでにスタックコマンドが動作していません。アイドル状態からツリーの宛先タイルに到達する1。 私が恐れているのは、このような注文をさらに作成すると、これがどのように面倒になるかです: 家を建てる 備蓄に行く 建設エリアに木材を持ち込む 備蓄に戻る 建設エリアに石を持参 建物のスプライトをアニメートする 植付 備蓄に行く 種を農場に持ち込む 醸造 備蓄に行く 植物を静止させる 醸造スプライトをアニメートする だから私の質問は、ドワーフ要塞のようなコマンド順序システムをどのように実装し、同時にスパゲッティコードを回避するのですか?調査する必要があるデータ構造はありますか?コマンドシーケンスを別のxmlファイルに配置する必要がありますか?

9
ユーザーフレンドリーな魔法の呪文システムを作成するには?
私は、魔法の呪文システムを備えた小さな2Dトップダウンのオープンワールドサバイバルっぽいゲームを設計しています。これまでの動作方法: プレイヤーはゲームの開始時に「杖」を受け取ります プレイヤーが新しいアイテムや敵に遭遇すると、それらのアイテムを使用したり、敵を倒したりするのに役立つ呪文を獲得します 私が抱えている問題は、呪文を唱える方法を設計することです。最初は、0〜10のキーにさまざまなスペルをバインドしましたが、すぐにスペルの数がそれを圧倒しました。また、ゲームの後半で使用されない低レベルのスペルが最も有用なキーにバインドされるという問題があります。 それでは、ユーザーフレンドリーなスペルキャストシステムを作成する最良の方法は何ですか?必要に応じて、ゲームでのマジックの動作をオーバーホールできます。 編集:明確にするために、スペルの種類と目的が大幅に異なるPC用にリアルタイムで開発していますが、この質問はすべてのプラットフォームに当てはまります。

2
オブジェクトが何であるかに基づいてコンテキストメニューを設計する方法
「右クリックオプション」動作のソリューションを探しています。 基本的に、ゲーム内のすべてのアイテムは、右クリックすると、オブジェクトが何であるかに基づいて一連のオプションを表示できます。 さまざまなシナリオの例を右クリックします。 インベントリ:ヘルメットはオプション(装備、使用、ドロップ、説明)を表示します 銀行:ヘルメットにオプションが表示されます(テイク1、テイクX、すべてテイク、説明) フロア:ヘルメットはオプションを表示します(テイク、ここを歩く、説明) 明らかに、各オプションは、言われていることを行う特定の方法を何らかの形で指し示しています。これは、私が理解しようとしている問題の一部です。単一のアイテムに非常に多くのポテンショニングオプションがあるのに、クラスを非常に乱雑にならないように設計するにはどうすればよいですか? 私は継承について考えましたが、それは本当に長くかかり、チェーンが巨大になる可能性があります。 インターフェイスを使用することを考えましたが、Xmlファイルからアイテムデータをロードして汎用の「Item」クラスに配置することができないため、これはおそらく少し制限されます。 Runescapeと呼ばれるゲームに基づいて、目的の最終結果を作成しています。ゲーム内ですべてのオブジェクトを右クリックすると、オブジェクトの種類や場所(インベントリ、フロア、銀行など)に応じて、プレーヤーが操作できるさまざまなオプションセットが表示されます。 これをどのように達成しますか?まず、どのアプローチをとるべきか、どのオプションを表示すべきかを決定し、クリックしたら、対応するメソッドを呼び出す方法を決定する必要があります。 私はC#とUnity3Dを使用していますが、実際のコードとは対照的にパターンを追っているので、提供された例はどちらにも関係する必要はありません。 どんな助けでも大歓迎です。質問や希望する結果が明確でない場合は、コメントを投稿してください。できるだけ早く対応します。 ここに私がこれまで試したものがあります: 私は実際に、さまざまな種類のアイテム(追加攻撃、追加防御、コストなど)のすべての値を保持する一般的な「アイテム」クラスを実装することができました。これらの変数には、Xmlファイルのデータが入力されます。 可能な限りすべての対話メソッドをItemクラス内に配置することを考えましたが、これは信じられないほど面倒で貧弱なフォームだと思います。おそらく、1つのクラスのみを使用し、異なるアイテムにサブクラス化することにより、この種のシステムを実装するための間違ったアプローチを取っていますが、Xmlからデータをロードしてクラスに保存できる唯一の方法です。 Xmlファイルからすべてのアイテムをロードすることを選択した理由は、このゲームが40,000以上のアイテムを使用できる可能性があるためです。私の数学が正しければ、各アイテムのクラスは多くのクラスです。

3
ゲーム開発で使用されるメモリ割り当てパターン
私は独自のアロケーターメソッド(メモリプールやプロファイリングなどをサポートする)の作成を研究していますが、研究を続けるにつれて、ゲーム開発でこれがどのように行われるかを探していました。 どのようなメモリ割り当て手法を使用できますか、なぜそれが優れた手法なのでしょうか?

3
アクションに副作用があるターンベースのゲームの設計
私はゲームDominionのコンピューター版を書いています。アクションカード、​​トレジャーカード、および勝利ポイントカードがプレイヤーの個人デッキに蓄積される、ターンベースのカードゲームです。クラス構造はかなりよく発達していて、ゲームロジックの設計を始めています。私はpythonを使用していますが、pygameで簡単なGUIを後で追加するかもしれません。 プレイヤーのターンシーケンスは、非常に単純なステートマシンによって管理されます。時計回りに回すと、プレイヤーはゲームが終了するまでゲームを終了できません。シングルターンのプレイもステートマシンです。一般的に、プレイヤーは「アクションフェーズ」、「購入フェーズ」、「クリーンアップフェーズ」をこの順番で通過します。ターンベースのゲームエンジンを実装する方法の質問への回答に基づいて?、状態マシンはこの状況の標準的な手法です。 私の問題は、プレイヤーのアクションフェーズ中に、自分自身または他のプレイヤーの1人以上に副作用のあるアクションカードを使用できることです。たとえば、1枚のアクションカードを使用すると、プレーヤーは現在のターンの終了後すぐに2ターン目を取ることができます。別のアクションカードを使用すると、他のすべてのプレーヤーは手札から2枚のカードを捨てます。さらに別のアクションカードは、現在のターンでは何も行いませんが、プレーヤーは次のターンに追加のカードを引くことができます。物事をさらに複雑にするために、新しいカードを追加するゲームへの新しい拡張が頻繁にあります。すべてのアクションカードの結果をゲームのステートマシンにハードコーディングすると、見苦しくなり、適応できなくなります。ターンベースの戦略ループへの答え この問題を解決するための設計に取り組む詳細レベルには入りません。 ターン内で行われるアクションによってターンを取るための一般的なパターンを変更できるという事実を包含するために、どのようなプログラミングモデルを使用すべきですか?ゲームオブジェクトは、すべてのアクションカードの効果を追跡する必要がありますか?または、カードに独自の効果を実装する必要がある場合(たとえば、インターフェイスを実装することによって)、十分なパワーを与えるにはどのようなセットアップが必要ですか?この問題に対するいくつかの解決策を考えましたが、それを解決する標準的な方法があるかどうか疑問に思っています。具体的には、アクションカードがプレイされた結果としてすべてのプレイヤーがしなければならないアクションを追跡する責任を負うオブジェクト/クラス/その他、および通常のシーケンスの一時的な変更との関係を知りたいターンステートマシン。

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