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

8
ゲームを開発するためにオブジェクトの継承を可能な限り使用しないでください。
Unityでゲームを開発するときは、OOP機能が好きです。通常、基本クラス(ほとんどが抽象化された)を作成し、オブジェクトの継承を使用して、同じ機能を他のさまざまなオブジェクトと共有します。 ただし、最近、継承を使用することは避けなければならず、代わりにインターフェイスを使用する必要があると誰かから聞きました。だから私は理由を尋ねて、「オブジェクトの継承はもちろん重要ですが、拡張オブジェクトがたくさんあると、クラス間の関係は深く結合されます。 私は、のようなものを抽象基底クラスを使用していますWeaponBaseし、同様に、特定の武器クラスを作成しShotgun、AssaultRifle、Machinegunそのような何か。非常に多くの利点があり、私が本当に楽しんでいるパターンの1つはポリモーフィズムです。サブクラスによって作成されたオブジェクトを基本クラスであるかのように扱うことができるため、ロジックを大幅に削減し、再利用可能にすることができます。サブクラスのフィールドまたはメソッドにアクセスする必要がある場合、サブクラスにキャストし直します。 私は、一般的に異なるクラスで使用したのと同じフィールドを定義する必要が好きではありませんAudioSource/ Rigidbody/ Animatorそして私は次のように定義されたメンバフィールドをたくさんfireRate、damage、range、spreadというように。また、場合によっては、一部のメソッドが上書きされる可能性があります。そのため、その場合は仮想メソッドを使用しているため、基本的には親クラスのメソッドを使用してそのメソッドを呼び出すことができますが、子でロジックが異なる場合は、手動でオーバーライドします。 それで、これらすべてを悪い習慣として捨てるべきですか?代わりにインターフェイスを使用する必要がありますか?

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 

6
C ++エンジンプログラミングでシングルトンを正しく使用するにはどうすればよいですか?
私はシングルトンが悪いことを知っています。私の古いゲームエンジンは、すべてのデータを保持してから実際のゲームループまですべてを処理するシングルトン「ゲーム」オブジェクトを使用していました。今、私は新しいものを作っています。 問題は、window.draw(sprite)ウィンドウがである場所で使用するSFMLで何かを描画することですsf::RenderWindow。ここに表示される2つのオプションがあります。 ゲーム内のすべてのエンティティが取得するシングルトンゲームオブジェクトを作成します(以前使用したもの) これをエンティティのコンストラクタにします:(Entity(x, y, window, view, ...etc)これはばかげて面倒です) エンティティのコンストラクタをxとyだけに保ちながらこれを行う適切な方法は何ですか? メインのゲームループで作成したすべてを追跡して、ゲームループでスプライトを手動で描画することもできますが、それも面倒で、エンティティの描画機能全体を完全に完全に制御したいと考えています。

6
多くの属性を持つヒーロー向けのOOPアーキテクチャ
他の人と(受動的に)戦うことができるキャラクターで、単純なブラウザーテキストRPGを開始しようとしています。これには、強さ、器用さなどの約10のスキルのリストが含まれ、さまざまな武器の追加の熟練度が含まれます。 これらのスキルをクラス属性として持つだけで、このキャラクタークラスを設計するより良い方法はありますか?簡単そうに思えますが、不器用なので嫌がります。 class Char(self): int strength int dexterity int agility ... int weaponless int dagger ...
14 architecture  oop 

3
構成が重いOOP対純粋なエンティティコンポーネントシステム?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 私は認めます、私は相続財産を濫用し、さらには虐待の罪を犯しました。OOPコースを受講するときに作成した最初の(テキスト)ゲームプロジェクトは、「ドア」と「1つのドアがある部屋」、「2つのドアがある部屋」から「ロックされたドア」と「ロック解除されたドア」 「部屋」から。 私が最近取り組んだ(グラフィカルな)ゲームでは、自分のレッスンを学び、継承の使用に制限をかけたと思いました。しかし、問題がすぐに現れ始めたことに気付きました。私のルートクラスはどんどん肥大化し始め、リーフクラスは重複したコードでいっぱいになりました。 私はまだ間違ったことをしていると思っていたので、オンラインで調べたところ、この問題を抱えているのは自分だけではないことがわかりました。いくつかの徹底的な調査の後、エンティティシステムを発見することになりました(読む:googlefu) 読み始めたとき、コンポーネントを使用した従来のOOP階層で発生していた問題をどれだけ明確に解決できるかを知ることができました。ただし、これらは最初の測定値でした。もっとつまずいたとき… T-machineのような「ラジカルな」ESアプローチ。 私は彼らが使っていた方法に反対し始めました。純粋なコンポーネントシステムは過剰であるか、直感的ではなく、おそらくOOPの強さのように見えました。著者は、ESシステムはOOPの反対であると言っており、OOPに沿って使用できるかもしれませんが、実際には使用すべきではありません。私はそれが間違っていると言っているわけではありませんが、実装したい解決策のような気がしませんでした。 ですから、私にとって、そして私の直感に反することなく、投稿の冒頭で抱えていた問題を解決するには、まだ階層を使用することですが、以前に使用したようなモノリシックな階層ではなく、ポリリシックなもの(モノリシックの反対語が見つかりませんでした)は、いくつかの小さな木で構成されています。 次の例は、私が何を意味するかを示しています(これは、Game Engine Architectureの第14章で見つけた例から着想を得ています)。 車両用の小さなツリーがあります。ルート車両クラスには、レンダリングコンポーネント、衝突コンポーネント、位置コンポーネントなどが含まれます。 そして、車両のサブクラスであるタンクは、そこからこれらのコンポーネントを継承し、独自の「キャノン」コンポーネントが与えられます。 キャラクターについても同じことが言えます。キャラクターは独自のコンポーネントを持ち、プレイヤークラスはそれを継承し、入力コントローラーを与えられますが、他の敵クラスはキャラクタークラスを継承し、AIコントローラーを与えられます。 この設計には問題はありません。純粋なEntity Controller Systemを使用していないにもかかわらず、バブリングアップ効果と大きなルートクラスの問題はマルチツリー階層を使用することで解決され、葉が重複しないため、葉を複製する重いコードの問題はなくなりました開始するコードは、コンポーネントだけです。リーフレベルに変更を加える必要がある場合、コードをどこにでもコピーペーストするのではなく、単一のコンポーネントを変更するのと同じくらい簡単です。 もちろん、私と同じように経験が浅いので、最初に単一階層の継承の重いモデルを使用し始めたときに問題は見られなかったため、現在実装を考えているモデルに問題がある場合は、それを見ることができます。 あなたの意見は? PS:私はJavaを使用しているため、通常のコンポーネントを使用する代わりに、多重継承を使用してこれを実装することはできません。 PPS:コンポーネント間の通信は、依存コンポーネントを相互にリンクすることにより行われます。これは結合につながりますが、私はそれが良いトレードオフだと思います。

3
C ++でゲームエンジンを整理する方法 私の継承の使用は良い考えですか?
私はゲーム開発とプログラミングの両方の初心者です。 ゲームエンジンの構築に関する原則を学びたいと思っています。 シンプルなゲームを作成したいのですが、ゲームエンジンを実装しようとしているところです。 だから私は私のゲームエンジンがこれを制御する必要があると思った: - Moving the objects in the scene - Checking the collisions - Adjusting movements based on collisions - Passing the polygons to the rendering engine 私は私のオブジェクトを次のように設計しました: class GlObject{ private: idEnum ObjId; //other identifiers public: void move_obj(); //the movements are the same for all the objects (nextpos …
11 c++  architecture  oop 

4
OOPなしでゲームを作るには?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、1つの問題のみに焦点を当てますこの投稿を編集するます。 6年前休業。 現在、ゲーム開発の勉強とゲーム制作の練習をしています。 私はゲームで多くのOOPを使用しています。たとえば、発射される各ミサイルはMissileオブジェクトのインスタンスであり、オブジェクトのリストに追加されMissileます。ゲームの各戦車はTankオブジェクトです。等。 プログラム全体の設計はこれに基づいています。たとえば、Missileオブジェクトのあると、すべてのフレームでミサイルを移動したり、それらを描画したりできます。またTank、すべての戦車にオブジェクトのインスタンスがあると、何かと衝突したかどうかなど、各戦車をチェックできます。 ゲーム(パックマンよりも複雑)が非OO言語でプログラムされる方法を想像するのは難しいです。(もちろん、非OOプログラマを軽視しません)。所要時間だけでなく、ほとんどの場合、この方法でゲームを設計する方法についてもです。 オブジェクト指向プログラミングを使用せずにゲームを設計することは想像できません。ゲームプログラムの設計方法に関する私の完全な理解はOOPに基づいているためです。 質問したいのですが、今日、OOPを使用してプログラミングされていないゲームはありますか?開発プロセスの主要な要素としてOOPを使用しない「プロフェッショナル」ゲームはありますか? もしそうなら、たとえば、OOPなしで、タンクとN個のミサイルの間の衝突検出をどのように実装できるかについて教えてください。


3
AIエージェントはどのようにして環境に関する情報にアクセスしますか?
これはちょっとささいな質問かもしれませんが、私はこれを理解するのに苦労しています。よろしくお願いします。 オブジェクト指向設計を使用したゲーム開発で、AIエージェントがアクションを実行するためにゲームの世界から必要な情報にアクセスする方法を理解したいと思います。 誰もが知っているように、ゲームではAIエージェントが「環境を認識」し、周囲で何が起こっているかに応じて行動する必要があることがよくあります。たとえば、エージェントは、プレイヤーが十分に近づいたらプレーヤーを追跡する、移動中に障害物を回避する(障害物回避のステアリング動作を使用する)などのようにプログラムされている場合があります。 私の問題は、それを行う方法がわからないことです。AIエージェントは、ゲームの世界について必要な情報にどのようにアクセスできますか? 可能なアプローチの1つは、エージェントが必要な情報をゲームの世界から直接要求することです。 GameWorldというクラスがあります。重要なゲームロジック(ゲームループ、衝突検出など)を処理し、ゲーム内のすべてのエンティティへの参照も保持します。 このクラスをシングルトンにすることができます。エージェントがゲームワールドからの情報を必要とするとき、それは単にGameWorldインスタンスから直接それを取得します。 たとえば、エージェントSeekはプレーヤーが近くにいるときにプレーヤーにプログラムされます。これを行うには、エージェントはプレーヤーの位置を取得する必要があります。そのため、直接要求することができますGameWorld.instance().getPlayerPosition()。 エージェントは、ゲーム内のすべてのエンティティのリストを取得し、それをニーズに合わせて分析することもできます(どのエンティティが近くにあるか、またはその他の何かを把握するため): GameWorld.instance().getEntityList() これは最も簡単な方法です。エージェントはGameWorldクラスに直接連絡して、必要な情報を取得します。しかし、これが私が知っている唯一のアプローチです。良いものはありますか? 経験豊富なゲーム開発者はこれをどのように設計しますか?「すべてのエンティティのリストを取得し、必要なものを探す」アプローチは単純ですか?AIエージェントがアクションを実行するために必要な情報にアクセスできるようにするには、どのようなアプローチとメカニズムがありますか?
9 architecture  ai  oop 

2
エンティティシステム内でのエンティティの割り当て
エンティティシステム内でエンティティをどのように割り当て/類似する必要があるのか​​、よくわかりません。私にはさまざまなオプションがありますが、それらのほとんどには短所が関連付けられているようです。すべての場合において、エンティティはID(整数)に似ており、おそらくラッパークラスが関連付けられています。このラッパークラスには、エンティティにコンポーネントを追加/削除するメソッドがあります。 オプションについて言及する前に、ここに私のエンティティシステムの基本構造を示します。 エンティティ ゲーム内のオブジェクトを説明するオブジェクト 成分 エンティティのデータを格納するために使用されます システム 特定のコンポーネントを持つエンティティが含まれています 特定のコンポーネントでエンティティを更新するために使用されます 世界 エンティティシステムのエンティティとシステムが含まれています エンティティを作成/破棄し、システムをそこに追加/削除できます 私が考えた私の選択肢は次のとおりです: オプション1: エンティティラッパークラスを保存せず、次のID /削除されたIDのみを保存します。つまり、エンティティは次のように値で返されます。 Entity entity = world.createEntity(); これは、この設計にいくつかの欠陥があることを除いて、ententxによく似ています。 短所 エンティティラッパークラスが重複している可能性があります(コピークターを実装する必要があり、システムにエンティティを含める必要があるため) エンティティが破棄された場合、重複するエンティティラッパークラスの値は更新されません オプション2: エンティティラッパークラスをオブジェクトプール内に保存します。つまり、エンティティは次のようにポインタ/参照によって返されます。 Entity& e = world.createEntity(); 短所 重複するエンティティがある場合、エンティティが破棄されると、同じエンティティオブジェクトが別のエンティティの割り当てに再利用されることがあります。 オプション3: 未加工のIDを使用し、ラッパーエンティティクラスを忘れます。これの落とし穴は、それに必要な構文だと思います。これを実装するのが最も簡単で簡単に思えるので、これを行うことを考えています。構文が原因で、私はそれについてかなり確信が持てません。 つまり、このデザインでコンポーネントを追加するには、次のようになります。 Entity e = world.createEntity(); world.addComponent<Position>(e, 0, 3); これに付け加えて: Entity e = world.createEntity(); e.addComponent<Position>(0, 3); 短所 …

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