おぉ、コジマさん。こんばんは。
見てるとわくわくする感じで出来てきていますね!サウンドが付くともっと臨場感が出そう。
初めて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フォルダは必要無い上にすごく重いので、
アップロードする時は消してから圧縮するとよいですよ。