RPGゲームを作りたいのですが・・・
-
こじこじ
RPGゲームを作りたいのですが・・・
こんばんは コジマです。
勉強会などで話をしてる作成中のゲームのソースコードを見ていただきたいので
送ります。
操作方法、説明書など書きたかったのですが、
PCが嫁にとられているので書けませんでした・・・・OTL
また日を改めて書きますね。
↓
http://www8.gigafile.nu/v3/?b821e764f95 ... b502a00856
勉強会などで話をしてる作成中のゲームのソースコードを見ていただきたいので
送ります。
操作方法、説明書など書きたかったのですが、
PCが嫁にとられているので書けませんでした・・・・OTL
また日を改めて書きますね。
↓
http://www8.gigafile.nu/v3/?b821e764f95 ... b502a00856
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
おぉ、コジマさん。こんばんは。
見てるとわくわくする感じで出来てきていますね!サウンドが付くともっと臨場感が出そう。
初めてRPGを作ったころを思い出しました。あの頃はとにかくがむしゃらに作った記憶があります。
明日改めてよくコードを拝見しますね。
とりあえずパっと見、コードレビューという観点で気づいた点を書いてみます。
=====================================================
1. グローバル変数が使われている。
これらは0にできますし、0にすることが望ましいです。
C++では他から参照できないものを参照できなくすることを隠蔽化とかカプセル化と言い、変数を参照できる人は最小限にするようにします。
C言語でも同様に、変数はなるべく最小限のモジュールからしかアクセスできなくすることが望ましいです。
例えば敵モジュールにバグがあったせいで自機モジュール変数に予期せぬアクセスが起こり、自機モジュールに不具合が生じてしまったとしましょう。
この時、自機モジュールの不具合の原因を自機モジュールの中で延々と探しても見つかりません。
そんな時、敵モジュールが自機モジュールの変数にアクセスできない仕組みであればこのようなことは起きません。
これは地味なようですごく大切なことで、大きなゲームになるほど重要になってきます。
この辺のことはゲームプログラミングの館の
「ゲームプログラム設計」
http://dixq.net/g/index.html#GameDesign
に書いておりますのでよければご覧ください。
2. ファイルがモジュール単位でわかれていない。
ファイルはモジュール単位、C言語であればC++に似せてクラスもどき単位で分割することが望ましいです。
そのためには、分け方を「オブジェクト指向」の概念で分割することが望ましいです。
※この話は長くなりそうなので明日にします。
3. 関数内でstatic変数を多用している
適切にファイル分割し、そのファイルの先頭でstatic変数を宣言してください。
するとそのファイル内で変数が使用可能になります。(これも前述のリンク先に書いてあります)
関数内でstatic変数を使っているとゲームをリセットしたいとき等、外から値をリセットすることができず困ることが多いです。
4. 1秒間に60回同じ画像をロードして破棄している
各シーンに入る前に一度ロードすればよく、各シーンから抜けるときに破棄すればよいです。
ゲームでよく「NowLoading」みたいな画面を見かけると思いますが、シーンからシーンへ移るときはリソースの解放と確保がされます。
5. function.hは非推奨
各モジュールごとに.cppと.hを作り、必要なモジュールが必要な.hをincludeする設計が望ましいです。
(例によってこれも前述のリンク先に書いてあります)
6. マジックナンバーの多用
マジックナンバー(数字を直接書くこと)は避けることが望ましいです。
例えば全く仕様を知らない人にこのコードを見せて意味を理解しなさいと言ったら難しいですよね。
ソースコードは誰が見てもすぐに意味が分かるように書くことが望ましいです。
そのため、マジックナンバーは定義値で置き換えたりenumで列挙体を使ったりします。
6. インデント
一部インデントがおかしいところがありましたが
Ctrl 押しながら A → K → F で全てを自動インデントできますよ。
7. 不要ファイルの同梱
.sdfファイルや隠しファイル、Debugフォルダやipchフォルダは必要無い上にすごく重いので、
アップロードする時は消してから圧縮するとよいですよ。
見てるとわくわくする感じで出来てきていますね!サウンドが付くともっと臨場感が出そう。
初めてRPGを作ったころを思い出しました。あの頃はとにかくがむしゃらに作った記憶があります。
明日改めてよくコードを拝見しますね。
とりあえずパっと見、コードレビューという観点で気づいた点を書いてみます。
=====================================================
1. グローバル変数が使われている。
これらは0にできますし、0にすることが望ましいです。
C++では他から参照できないものを参照できなくすることを隠蔽化とかカプセル化と言い、変数を参照できる人は最小限にするようにします。
C言語でも同様に、変数はなるべく最小限のモジュールからしかアクセスできなくすることが望ましいです。
例えば敵モジュールにバグがあったせいで自機モジュール変数に予期せぬアクセスが起こり、自機モジュールに不具合が生じてしまったとしましょう。
この時、自機モジュールの不具合の原因を自機モジュールの中で延々と探しても見つかりません。
そんな時、敵モジュールが自機モジュールの変数にアクセスできない仕組みであればこのようなことは起きません。
これは地味なようですごく大切なことで、大きなゲームになるほど重要になってきます。
この辺のことはゲームプログラミングの館の
「ゲームプログラム設計」
http://dixq.net/g/index.html#GameDesign
に書いておりますのでよければご覧ください。
2. ファイルがモジュール単位でわかれていない。
ファイルはモジュール単位、C言語であればC++に似せてクラスもどき単位で分割することが望ましいです。
そのためには、分け方を「オブジェクト指向」の概念で分割することが望ましいです。
※この話は長くなりそうなので明日にします。
3. 関数内でstatic変数を多用している
適切にファイル分割し、そのファイルの先頭でstatic変数を宣言してください。
するとそのファイル内で変数が使用可能になります。(これも前述のリンク先に書いてあります)
関数内でstatic変数を使っているとゲームをリセットしたいとき等、外から値をリセットすることができず困ることが多いです。
4. 1秒間に60回同じ画像をロードして破棄している
各シーンに入る前に一度ロードすればよく、各シーンから抜けるときに破棄すればよいです。
ゲームでよく「NowLoading」みたいな画面を見かけると思いますが、シーンからシーンへ移るときはリソースの解放と確保がされます。
5. function.hは非推奨
各モジュールごとに.cppと.hを作り、必要なモジュールが必要な.hをincludeする設計が望ましいです。
(例によってこれも前述のリンク先に書いてあります)
6. マジックナンバーの多用
マジックナンバー(数字を直接書くこと)は避けることが望ましいです。
例えば全く仕様を知らない人に
for(i = 0; i<20; i++){
for(j = 0; j<10; j++){
if(i == 0){
if(j==0){
DrawRotaGraph( 8, 8+16*i, 1.0, 0.0, Image_1[4], TRUE );
}else if(j==9){
DrawRotaGraph( 8+16*j, 8+16*i, 1.0, 0.0, Image_1[7], TRUE );
}else{
DrawRotaGraph( 8+16*j,8+16*i, 1.0, 0.0, Image_1[5], TRUE );
}
}
else if(i == 19){
if(j==0){
DrawRotaGraph( 8, 8+16*i, 1.0, 0.0, Image_1[28], TRUE );
}else if(j==9){
DrawRotaGraph( 8+16*j, 8+16*i, 1.0, 0.0, Image_1[31], TRUE );
}else{
DrawRotaGraph( 8+16*j, 8+16*i, 1.0, 0.0, Image_1[29], TRUE );
}
}
else{
if(j == 0){
DrawRotaGraph( 8,8+16*i, 1.0, 0.0, Image_1[12], TRUE );
}
else if(j == 9){
DrawRotaGraph( 8+16*j,8+16*i, 1.0, 0.0, Image_1[15], TRUE );
}
}
}
}ソースコードは誰が見てもすぐに意味が分かるように書くことが望ましいです。
そのため、マジックナンバーは定義値で置き換えたりenumで列挙体を使ったりします。
6. インデント
一部インデントがおかしいところがありましたが
Ctrl 押しながら A → K → F で全てを自動インデントできますよ。
7. 不要ファイルの同梱
.sdfファイルや隠しファイル、Debugフォルダやipchフォルダは必要無い上にすごく重いので、
アップロードする時は消してから圧縮するとよいですよ。
-
こじこじ
Re: RPGゲームを作りたいのですが・・・
>Dixqさん
早速の返答ありがとうございます。
短時間でこれだけアドバイスをいただけるとは思いませんでした!
さすが!の一言に尽きますWW
このゲームを仕上げるモチベーションが少し上がりました。
ありがとうございます。
早速の返答ありがとうございます。
短時間でこれだけアドバイスをいただけるとは思いませんでした!
さすが!の一言に尽きますWW
このゲームを仕上げるモチベーションが少し上がりました。
ありがとうございます。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
こじこじさんの方こそ本サイトをご利用下さってありがとうございます。
なお、本サイトに登録していただければ(画面左上の「ユーザー登録」より)、70MBまでファイルを添付できるようになり、
日記がかけたりチャットができたりアルバムが作れたりするようになりますのでよろしければどうぞ。
また、メニュー画面の作り方については
http://dixq.net/g/index.html#Menu
「メニュー画面の作り方」
が参考になると思いますのでよろしければ合わせてご覧ください。
なお、本サイトに登録していただければ(画面左上の「ユーザー登録」より)、70MBまでファイルを添付できるようになり、
日記がかけたりチャットができたりアルバムが作れたりするようになりますのでよろしければどうぞ。
また、メニュー画面の作り方については
http://dixq.net/g/index.html#Menu
「メニュー画面の作り方」
が参考になると思いますのでよろしければ合わせてご覧ください。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
こじこじ
Re: RPGゲームを作りたいのですが・・・
>Dixqさん
2.ファイルがモジュール単位でわかれていない。
について質問があります。
同じ役割を持った関数群で分割するということなのかなと
思ったのですが、あってますか?
具体的には、下記の5つは最低でもファイルでわけた方が
よいのかなと思いました。
1、main関数
2、セーブ・ロード
3、キャラクター歩行フィールド
4、メニュー画面
5、戦闘
どこまでわけるかなどは、管理のしやすさなどで判断するの
かなと思いました。
オブジェクト指向を理解するのは直近の壁ですね・・・
正しく理解したいです。
2.ファイルがモジュール単位でわかれていない。
について質問があります。
同じ役割を持った関数群で分割するということなのかなと
思ったのですが、あってますか?
具体的には、下記の5つは最低でもファイルでわけた方が
よいのかなと思いました。
1、main関数
2、セーブ・ロード
3、キャラクター歩行フィールド
4、メニュー画面
5、戦闘
どこまでわけるかなどは、管理のしやすさなどで判断するの
かなと思いました。
オブジェクト指向を理解するのは直近の壁ですね・・・
正しく理解したいです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
私の分割も参考にして頂けると良いかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
とりあえずもうダウンロード不可能になっていたようなので、こちらにアップしなおしました。問題があれば削除するので言ってください。
http://dixq.net/BBS/game_pro_v1.zip
1. まずはゲームプログラミング設計編を読んでいただく
http://dixq.net/g/index.html#GameDesign
2. メニューの作り方編を読んでいただく
http://dixq.net/g/index.html#Menu
3. softyaさんのRPG講座を読んでいただく
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
のがよいかと思います。
そこに
> 同じ役割を持った関数群で分割するということなのかなと
> 思ったのですが、あってますか?
の問いの答えとしてNOであることが書かれていると思います。
http://dixq.net/BBS/game_pro_v1.zip
1. まずはゲームプログラミング設計編を読んでいただく
http://dixq.net/g/index.html#GameDesign
2. メニューの作り方編を読んでいただく
http://dixq.net/g/index.html#Menu
3. softyaさんのRPG講座を読んでいただく
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
のがよいかと思います。
そこに
> 同じ役割を持った関数群で分割するということなのかなと
> 思ったのですが、あってますか?
の問いの答えとしてNOであることが書かれていると思います。
-
こじこじ
Re: RPGゲームを作りたいのですが・・・
下記の件了解しました!
ファイルは乗っけても問題ないです。
掲示板の受け答え等々で不手際があるかもしれませんが
これからも使用していくのでよろしくお願いします!
とりあえず、資料みます。。。
ファイルは乗っけても問題ないです。
掲示板の受け答え等々で不手際があるかもしれませんが
これからも使用していくのでよろしくお願いします!
とりあえず、資料みます。。。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
オブジェクト指向とは・・
ソフトウェアの構成をオブジェクト(物)単位で考えていく考え方です。
例えば、
・自転車
・バイク
・車
を作らなければならないとしましょう。
3つをそれぞれ1から作っていくと大変です。
どうにか効率的に開発できないでしょうか。
そこで、それぞれが持つ物体と処理に分けて考えてみましょう。

こうしてみるとかなり重複している要素がありそうです。
それなら、「自転車・バイク・車」よりもっと大きな概念の「車両」という概念を取り入れてみましょう。

そうすれば「車両」さえ作ってしまえば、あとは、それを受け継いで、それぞれに特化した部分だけ作りこめば良いことになります。
このようにオブジェクトは「変数と関数をセット」で扱う必要があり、これを「クラス」と呼びます。
そして、大きな概念としてとらえたクラスである車両クラスを「抽象クラス」といい、それぞれに受け継がせることを「継承」と言います。
ソフトウェアはモジュールをオブジェクト単位で分割して設計し、更に変数と関数のセットであるクラスを効率的に使うことで適切な設計ができます。
それはまだC++の話ですが、C言語のレベルでもそれを意識して設計することはできます。
例えば「バトルモジュール」という単位ではなくもっと「物」として分割して考えてみてください
・プレイヤー
・敵
・バトル管理者
バトルはまずこの3クラス(モジュール)で作ってみてはどうでしょう。
プレイヤーモジュールの作り方は前述のゲームプログラミングの館のゲームプログラム設計編にて紹介しています。
ソフトウェアの構成をオブジェクト(物)単位で考えていく考え方です。
例えば、
・自転車
・バイク
・車
を作らなければならないとしましょう。
3つをそれぞれ1から作っていくと大変です。
どうにか効率的に開発できないでしょうか。
そこで、それぞれが持つ物体と処理に分けて考えてみましょう。

こうしてみるとかなり重複している要素がありそうです。
それなら、「自転車・バイク・車」よりもっと大きな概念の「車両」という概念を取り入れてみましょう。

そうすれば「車両」さえ作ってしまえば、あとは、それを受け継いで、それぞれに特化した部分だけ作りこめば良いことになります。
このようにオブジェクトは「変数と関数をセット」で扱う必要があり、これを「クラス」と呼びます。
そして、大きな概念としてとらえたクラスである車両クラスを「抽象クラス」といい、それぞれに受け継がせることを「継承」と言います。
ソフトウェアはモジュールをオブジェクト単位で分割して設計し、更に変数と関数のセットであるクラスを効率的に使うことで適切な設計ができます。
それはまだC++の話ですが、C言語のレベルでもそれを意識して設計することはできます。
例えば「バトルモジュール」という単位ではなくもっと「物」として分割して考えてみてください
・プレイヤー
・敵
・バトル管理者
バトルはまずこの3クラス(モジュール)で作ってみてはどうでしょう。
プレイヤーモジュールの作り方は前述のゲームプログラミングの館のゲームプログラム設計編にて紹介しています。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
バトルの極々簡単なサンプルを書いてみました。
http://dixq.net/BBS/zip/rpg_sample.zip
エンターキーを押すと、プレイヤーが敵にダメージを与えるだけです。
前述のとおり、これらは
・プレイヤー
・敵
・バトル管理者
の3モジュールから成っています。
ちなみに本プログラムはゲームプログラミングの館d.6章を変更して作ったものです。

それぞれのモジュールにUpdateとDrawがセットになっていて、上から呼ぶ構造は館で紹介している通りです。

softyaさんの講座では別の方法でアタックをしているかもしれませんが、
上記サンプルでは、バトル管理者にアタックのお願いをして、バトル管理者が敵にアタックされたことを指示しています。
このようにモジュールをもの単位でもっと小さく分割し、管理しやすくするとよいと思います。
http://dixq.net/BBS/zip/rpg_sample.zip
エンターキーを押すと、プレイヤーが敵にダメージを与えるだけです。
前述のとおり、これらは
・プレイヤー
・敵
・バトル管理者
の3モジュールから成っています。
ちなみに本プログラムはゲームプログラミングの館d.6章を変更して作ったものです。

それぞれのモジュールにUpdateとDrawがセットになっていて、上から呼ぶ構造は館で紹介している通りです。

softyaさんの講座では別の方法でアタックをしているかもしれませんが、
上記サンプルでは、バトル管理者にアタックのお願いをして、バトル管理者が敵にアタックされたことを指示しています。
このようにモジュールをもの単位でもっと小さく分割し、管理しやすくするとよいと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: RPGゲームを作りたいのですが・・・
RPG講座のやつはBattleモジュールで全部管理してますね。
一対一での戦闘なので簡易化されていますが複数キャラやらアイテム効果やらの場合は分けた方が良いと思います。
一対一での戦闘なので簡易化されていますが複数キャラやらアイテム効果やらの場合は分けた方が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。