質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

6回答

1293閲覧

ゲーム開発におけるファイルの分け方に関して質問です!

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

1グッド

2クリップ

投稿2019/08/05 04:32

編集2019/08/10 00:46

私は勉強のためにVC++とDirectXでRPGを制作しています。
今回は技術的な質問ではなく、ゲームの構造をどう設計しようか悩んでいます。

例えば敵1、敵2、敵3が存在し、基本的なステータス情報(HP、AP etc...)は持っていますが、プレイヤーへの追跡の仕方や攻撃の仕方が違うとします。
その場合は、enemy01.cpp、enemy02.cpp、enemy03.cppのように別々にファイルを分けて書いたほうが良いのか、
それとも、enemy.cppのように一つのファイルにまとめて書いたほうが良いのか悩んでいます。

現在は、敵の構造体に基本的なステータスと種類情報を入れ、一つのファイルで種類情報をもとに管理しています。
動作としては問題ないのですが、やや見にくい感じはしています。

実際にゲーム開発されている方はどうしていますか?
経験談をお伺いたいです。

宜しくお願い致します。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/08/09 06:31

RPGタグは削除して下さい。(ゲームジャンルのRPGではありません)
退会済みユーザー

退会済みユーザー

2019/08/10 00:45

本当ですね! すみません、修正します!
guest

回答6

0

ベストアンサー

こんにちは。ゲーム畑ではありませんが、VC++歴だけは無駄に長いので参考になれば。

その場合は、enemy01.cpp、enemy02.cpp、enemy03.cppのように別々にファイルを分けて書いたほうが良いのか、それとも、enemy.cppのように一つのファイルにまとめて書いたほうが良いのか悩んでいます。

悩んでいるのであれば、「どちらもやってみて検証してみては?」と思いました。

プログラムを書いていると正解が見つからない事も多く、ネットや他人の情報を参考にする事もあるかと思いますしそれ自体を否定することはありませんが、人によって正解/不正解の基準が変わる事が多いため、とりあえずやってみるしかないのではないかと思います。
(悩んでいる理由やポイントも外野はわからんのです。)

質問者さんの質問の意図を無視すると、構造体を使うのをやめて、Enemyクラスでも作って、動作が違う「追跡」や「攻撃」に当たる関数を仮想関数化して派生クラス側でオーバーライドしてポリモーフィズムするのがおすすめです。
ファイルはクラス単位で別けます。

投稿2019/08/05 07:36

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/08/05 08:16 編集

> 「追跡」や「攻撃」に当たる関数を仮想関数化して派生クラス側でオーバーライドしてポリモーフィズムするのがおすすめです。 例えば、追跡ABC、攻撃ABCと3種類ずつあるとして 追跡A、攻撃Aをデフォルトとし BBの組み合わせ、CCの組み合わせをオーバーライドして実装する ぐらいまでなら、オーバーライドで対応できると思うんですが 全ての組み合わせ(AB、BA、AC、CB、BC等))を実装すると重複コードが出てきてしまうと思います。(マクロでインクルードするとかいう荒技はありますが) ですので、Attackクラスみたいなものを作って Enemyインスタンスを引数に取るAtttackクラス内のactionメソッドを作成し actionメソッド内でEnemyインスタンスを操作するようにするとさらに汎用性が高まるかと思います。 (追跡も同様) これをDIと言います まあキャラの数が多くなければここまでしなくてもいいと思いますが・・・。 規模によりますよね。全てユニークな動作ならオーバーライドでいいと思います
takabosoft

2019/08/05 08:21

そのような細かい事情まではわからんです。
退会済みユーザー

退会済みユーザー

2019/08/05 11:22

私もそう思います。
fuzzball

2019/08/09 06:34

>>どちらもやってみて検証してみては? に対して+1です。しばらく並行してやってみるとか。
退会済みユーザー

退会済みユーザー

2019/08/10 00:38

遅くなりました! 回答ありがとうございます! なるほど、、 とても参考になりました! 色々と試行錯誤してみようと思います。
Zuishin

2019/08/10 00:55

追跡や攻撃に関しては私もメソッドのオーバーライドではなく、行動専用のオブジェクトの作成をお勧めします。種類が少ないうちはオーバーライドでもどちらでもいいのですが、RPG であれば敵の種類は多く、行動は限られます。行動を敵の数だけ作っていたのでは何のためのオブジェクト指向かわかりません。
Zuishin

2019/08/10 01:05

適当なオブジェクト指向入門というのを読むと、たいてい犬はワンワン、猫はニャーニャー的なことが書いてあるんですよね。そしてプロパティはそのオブジェクトの見た目などで、メソッドは動きを表すと書いてあります。 これの弊害で、行動はメソッドだと思い込んでしまうことが多いのですが、行動はプロパティにした方がうまくいくことが多いです。
guest

0

行動パターンも攻撃の仕方もクラス化してDIした方が共通機能がまとめられて便利かと思う
(攻撃の仕方は違うが行動パターンは一緒とか)

リリースを前提に開発しているのでなければ(勉強のためにやっている)
オブジェクト指向やデザインパターンについて調べ、一旦遠回りしてみてもいいのではないかと思います

投稿2019/08/05 06:17

編集2019/08/05 06:59
mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 00:35

遅くなりました! 回答ありがとうございます! オブジェクト指向とデザインパターンについて調べてみます。
guest

0

ファイルを分けることで「見やすさ」を何とかしたいという話みたいですから,今現在「見にくい」と感じる具体的な要因を考えて,それを軽減する方向を模索してみれば良いのではないでしょうか.
その形は

enemy01.cpp、enemy02.cpp、enemy03.cpp

という敵の種類という観点とは異なるかもしれません.

  • あれとこれとは並んで書いてある方が見やすい

という要素があるならば,そこは分割しない方が良いのでしょうし,

  • 何かあれを見るためにいつもめっちゃスクロールして探してる

みたいなことがあるなら,そこは分割してみるとか.
あるいは単にファイル内での順序を変えるだけでも改善するのかもしれません.

投稿2019/08/06 04:45

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 00:45

遅くなりました! 回答ありがとうございます! ファイルを見直してみます!
guest

0

敵の種類が少ないのであれば、一つのファイルにまとめても良いと思います。

ですが、RPGということですので、敵は数十種類は登場するのではないかと思います。
この場合、一つのファイルにすべての敵の処理を書いてしまうと、かなり煩雑になってしまうので、各敵でファイルを分割した方が良いでしょう。

EnemyBase のような基底クラスを用意し、敵の基本的な処理はここに書いておきます。
各敵は EnemyBase の派生クラスとして定義して、個別の処理のみを書くようにすれば、一つのファイルが大きくならず、全体を把握しやくなるのではと思います。

また、さらに種類が多くなったり処理が複雑になる場合は、外部スクリプトファイル(Lua や Squirrel など)に書く場合もあります。

投稿2019/08/05 10:11

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 00:43

遅くなりました! 回答ありがとうございます! 基底クラスと派生クラスですね、、 ここら辺をもう少し勉強してみます!
guest

0

その場合は、enemy01.cpp、enemy02.cpp、enemy03.cppのように別々にファイルを分けて書いたほうが良いのか、

それとも、enemy.cppのように一つのファイルにまとめて書いたほうが良いのか悩んでいます。

書く量、敵の種類数にもよりますが、分けた方がいいでしょう。
.cppはコメント行を省いて、100行(長くても500行以内)に収めるのが一番スッキリして読みやすいです。

現在は、敵の構造体に基本的なステータスと種類情報を入れ、一つのファイルで種類情報をもとに管理しています。

動作としては問題ないのですが、やや見にくい感じはしています。

敵の情報を持ったcsvファイルなどを作成するとその辺が解消されますよ。

投稿2019/08/05 09:07

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 00:41

遅くなりました! 回答ありがとうございます! だとすると1000行くらい書いてしまっていたので、多いですね汗 無駄なところがないか見直してみます。 csvファイル、試してみます!
guest

0

例えば敵1、敵2、敵3が存在し、基本的なステータス情報(HP、AP etc...)は持っていますが、プレイヤーへの追跡の仕方や攻撃の仕方が違うとします。

昔、ゲーム作った時には、この「プレイヤーの追跡の仕方(行動パターン)」や「攻撃の仕方(兵装の種類)」といった情報も基本的なステータス情報として持って、場合によっては付け替えられるようにして、それぞれファイル別に定義していました。
情報といっても「数値」や「文字列」で持っているのではなく、関数ポインタで持つ感じですかね?

ゲーム関連のライブラリについては詳しくないですが、ドキュメントを読むなりサンプルを調べてみたりするなりすると何かしらヒントでもあるのではないでしょうか?

投稿2019/08/05 05:37

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 00:33

遅くなりました! 回答ありがとうございます! なるほど、関数ポインタですか、、 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問