C言語ゲーム製作4 ソース公開 勉強中 ファイル分割

このQ&Aのポイント
  • C言語ゲーム製作4のソースコードを公開!ファイル分割を施し、迷路の移動処理を修正しました。
  • 関数定義のstaticの使い方やヘッダーの取り込みの仕方について疑問があります。具体的な意見をお待ちしています。
  • C言語ゲーム製作4のソースコードをダウンロードできます。ファイルサイズは1.0Mです。
回答を見る
  • ベストアンサー

C言語ゲーム製作4 ソース公開 勉強中 ファイル分割

お世話になっています。 前回より迷路のカドを移動しやすく修正、ファイル分割を重点的に対応しました。プレイヤーが十字方向に動くまでです。 (敵の処理は途中なので気にしないでください) ダウンロード(ソース10、ヘッダ10、その他)1.0M http://gamdev.org/up/img/10466.lzh 疑問点が以下の2点です ・関数定義のstaticの使い方 ・ヘッダーの取り込みの仕方がわからないコードの上で (#include "..\\include\\player.h")と記述している  メニューから設定するか、環境変数設定のようなのですが… まだまだ力不足です。他にも多々突っ込みどころがあると思います できれば具体的な意見を宜しく願いします<(_ _)>

  • wdam7
  • お礼率100% (13/13)

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

ソースを分けたので、だいぶすっきりしましたね。 >・関数定義のstaticの使い方 ファイル内の関数から呼ばれるだけの関数はstaticを使います。 staticにする関数はヘッダから外して.cppの始めの方に記述します。 >・ヘッダーの取り込みの仕方がわからないコードの上で >(#include "..\\include\\player.h")と記述している > メニューから設定するか、環境変数設定のようなのですが… 通常は.cppと.hは同じ場所(フォルダ)に置きます。 同じ場所に置けば、 #include "player.h" で済みますから。 ソースを見て気になったことを何点か。 ・WinMainとInitFuncやEndFuncはソースを分けないほうが良いと思います。後々、面倒じゃないでしょうか。 ・変数のextern宣言が.cpp側にあるのが変。.hに書きましょう! extern int MapData[ MAP_HEIGHT ][ MAP_WIDTH ]; とかはmap.hにあるべきです。 ・m_countをexternで参照しているのが私の趣味からすると気持ち悪いですね。私ならm_countの値を返す関数を作ります。理由は外部参照可能にしておくと思わぬ場所で更新してしまうバグを作る可能性が有るからです。 if( m_count = 1 ) とか書いちゃったらm_countを更新する上に、自分は条件を書いたつもりだからバグがなかなか発見できません。 ・player.cに移動処理が複雑すぎですね。上下左右を1つの関数で処理するアルゴリズムに変更しないと必ずバグを作るでしょう。変更も手間がかかりすぎます。テーブルとかで処理を単純化できますよ(キー入力の方向値を添え字として、x,yの移動データを得られる配列を作りましょう) 壁や相手との当たり処理を自キャラと敵キャラで共通化する必要もあると思います。 ・壁に引っかかったときの補正処理で、壁を越えられるときは良いですが、補正によっては通路に戻されてしまいます。 これは、仮の移動という概念を取り入れずに必ずプレーヤーの座標を動かしてしまっているのが原因だと思われます。仮に移動させて、その方向に問題があればその座標を捨てるのが良いでしょう。px,pyをローカル変数にコピーして使います。

wdam7
質問者

お礼

回答有難うございます。 >staticは.cppの始めの方に記述します。 なるほど。わかりわかりやすいです。 >通常は.cppと.hは同じ場所(フォルダ)に置きます。 わかるのですがフォルダをまとめて整理をしたいのです。 そして、調べたらメニューのツール>オプションでインクルードできて短縮できそうです メニューのツール>オプションでインクルードできて短縮できそうです >・WinMainとInitFuncやEndFuncをわける これに関しては、なんとなく納得するのですが他の人の意見も 聞きたいです。自分で考え、次の質問で結論を出す方向で >・変数のextern宣言が.cpp側にあるのが変。.hに書きましょう! 修正の方向で検討します >私ならm_countの値を返す関数を作ります。 今はグローバルの扱い方を確認しているのでしばらくはそのままの方向で 最終的にはグローバル変数を使わないのがいいと思っています >テーブルとかで処理を単純化できますよ そんなやり方があるのですか?もう少し勉強して対応していきます。 できれば効率のいい形でまとめたいです。 >壁に引っかかったときの補正処理で、壁を越えられるときは良いですが、 >補正によっては通路に戻されてしまいます。 通路のカドに入ろうとしたら自動で通路に入ろうとするしくみのこと でしょうか?今後何か支障があれば修正しますが現時点では仕様なので未定です >px,pyをローカル変数にコピーして この方法は使えそうです 今後の反省点として、沢山対応すると大変なので 質問を基本的に一つに絞ったほうがいいと思いました。 ^^ 引き続きゲーム作成を通してC言語を勉強していきたいと思います 又、何かありましたら宜しく願います。 <(_ _)>

関連するQ&A

  • C言語ゲーム製作中 ソース公開

    プレイヤーが画面を四方八方に移動までです。コードを一通り見ていただきたいです 現在、定番で見やすいプログラムを意識しています。又、今後質問が宜しく願います 以下よりダウンロードです(実行ファイル、ソースコード(268ステップ)等) http://gamdev.org/up/img/10406.lzh 環境 OS:VISTS、統合開発環境:VC++2005 EE、言語:C ライブラリ:DXライブラリ、 ----------------------------------------------------------------- 前回の質問時の修正としてコメント、マジックナンバー、メイン3分割等を行った。 ファイルは分割せずに1ファイルにまとめています。 ----------------------------------------------------------------- 聞きたい優先順位(下に行くほど無視してもよいです) 1: 以下の164行目と166行目のマジックナンバーを#define or typedef enum or それ以外の方法はあるのか…           赤、緑、青 SetTransColor( 255 , 255 , 255 ) ; // 透過色を変更 *strclr = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得 2: WinMain関数で多くのローカル変数を宣言しているが他の関数でやったほうがいいか struct player ply や int KeyStat[KET_MAX] を他のローカルで宣言するとstaticに しなければいけないとか考えてしまいます。メインで宣言したほうが都合が良さそうと思っていますが… 他に気になった点、こうしたほうがいい等、色々な意見を願います <(_ _)>

  • C言語ゲーム製作途中(勉強中)

    プレイヤーが画面を四方八方に移動まで。コードを一通り見ていただきたいです 現在、定番で見やすいプログラムを意識しています。又、今後質問が宜しく願います 以下よりダウンロードです(実行ファイル、ソースコード(234行)等) http://gamdev.org/up/img/10376.lzh 環境 OS:VISTS、統合開発環境:VC++2005 EE、言語:C ライブラリ:DXライブラリ、画像エディタ:ペイント、 自動作曲:Random various music v1.5、MP3変換ソフト:iTunes 聞きたい優先順位(下に行くほど無視してもよいです) (1) 関数名(頭は大文字)、変数名(全て小文字、アンダーバー使用)、グローバル変数名(g_をつけたほうがいいのか…)、 などの区別化 関数分け(他の方法)、マクロ定義名(名称つけ方がよくない等) (2) 関数ごとのヘッダコメント。用途と引数くらいは書いたほうがいいのか (3) ウインドウのアクティブ、非アクティブで一時停止と再生の処理の仕方 動作はうまくいっているようですがやり方は正しいのか DXライブラリを使っていますが、コメントで大体理解できると思います 他に気になった点、こうしたほうがいい等、色々な意見を願います <(_ _)>

  • C言語ゲーム製作(3)

    お世話になっています。 一般、定番的で見やすいプログラムを意識しています。(コメント等) 気になる所があれば意見を宜しくお願いします。 引数を減らすために関数化、マップの表示、キー入力、後は全般的に修正しました。 まだまだ力不足です。できれば具体的な意見を宜しく願いたいです。 ----------------------------------------------------------------- 以下よりダウンロードです(実行ファイル、ソースコード等) ****://gamdev.org/up/img/10414.lzh ----------------------------------------------------------------- 環境はOS:VISTA、統合開発環境:VC++2005 EE、言語:C、ライブラリ:DXライブラリ 過去の質問リスト C言語ゲーム製作途中(勉強中) (1) http://okwave.jp/qa3460149.html C言語ゲーム製作中 ソース公開 (2) http://okwave.jp/qa3470422.html ----------------------------------------------------------------- 聞きたい優先順位 1:関数の分け方と引数のやりとりが怪しいかも…OKならばファイル分割作業に入る予定です 2:KeyBoard関数で2つ以上ボタンが押されていたら クリアする処理は必要か(指摘があったため組み込み) 他に気になった点、こうしたほうがいい等、色々な意見を願います <(_ _)>

  • C言語で、記憶クラス指定子extern・staticを関数に指定

    C言語の本に、「関数の定義と呼び出す側が別ソースファイルの場合、プロトタイプはヘッダーファイルに書き、定義側と呼び出し側の両方でインクルードしましょう」ということが書かれていました。 例えば、 ===code1a.c=== extern void funcB(int); static void funcA() { funcB(1); } ===code1b.c=== void funcB(int a) { printf("%d\n",a); } このような場合には、もしcode1b.cの中の関数funcBに引数を追加した場合、再コンパイルしても気づかないのでよくない。 そこで、次のようにヘッダーファイルを作り、プロトタイプはそこに書くべきだ。 ***code2b.h*** extern void funcB(int); ***code2a.c*** #include "code2b.h" static void funcA() { funcB(1); } ******code2b.c**** #include "code2b.h" void funcB(int a) { printf("%d\n",a); } 記述は以上のようなことです。 #include "code2b.h" とは、 extern void funcB(int); が書いてあるのと同じだと思います。 私が思ったのは、本の勧める方法では、 funcBを定義しているcode2b.cで、プロトタイプの記憶クラス指定子が、externになっているが良いのか(externとは、別のソースファイルで定義されているという意味ではないか)ということです。 extern, staticは、プロトタイプに書くべきなのか、関数の定義に書くべきなのか、も両方に書くべきなのでしょうか。 私の処理系では、 ・プロトタイプ宣言でexternを付けて関数定義でstaticを付ける、 ・staticを付けた関数を他のソースファイルで呼ぶ、 などの明らかに矛盾する場合は、コンパイルエラーになります。 でも、extern単独での役割はなさそうです。 他の処理系でも同じでしょうか。 (main等省略)

  • C言語でのソースファイル

    n個の整数データを入力し、最後に平均を出力 nは最初に入力する(nは自然数) 平均は小数部まで求める 実行例として 入力するデータ数は? 3 NO. 1 :12 NO. 2 :7 NO. 3 :4 以上3個の平均 :7.666667 こんな感じにしたいのですができません どなたか教えてください。 お願いします。

  • C言語でのソースファイルが・・・

    C言語でのソースファイルが・・・ 最近C言語(MinGW、MSYS)の勉強をしていました。 それで今日も勉強の続きをしようと全てのソースファイルを見たらMSYSでしか開けなかったのが普通にWクリックで開けるメモ帳になっていました。 自分でそのソースファイルに何かをしたわけではなく本を見ながら文字を書いて覚えるみたいな作業をしていただけなので何かをしたというわけではないです。 なのでなにをしてこうなった。何があってこうなった。と言うことがまったくわかりません。 これはもとのソースファイルにもどせるのでしょうか? また予想でいいのでなにが原因か考えてはもらえないでしょうか? 少々現状を理解できなくて質問が曖昧になってます・・・。すいません。 ご回答お願いします。

  • OpenCVで32bit ヘッダ無しRaw画像表示

    OpenCVのIPLimage構造体にヘッダ無しRaw画像を読み込んで表示させたいのですが、OpenCVではヘッダ無しRaw画像を直接読み込む関数がないため(cvLoadImageは対応せず)自作しなければいけません。まだCプログラムを勉強し始めたばかりなのでなかなか上手くいかなくて困っております。どなたか教えていただけませんか?ここまで作っみました。コンパイルはできますが、原画像どおり表示してくれません。扱う画像はレントゲン画像で512*512 32bit実数データです。 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int main(int argc, char *argv[]) { char infile[512]; /* (1) */ float *inputimg; /* (3) */ int i, j; int mszx, mszy; FILE *fp; IplImage* img; strcpy(infile,argv[1]); mszx = atoi(argv[2]); mszy = atoi(argv[3]); static const char* title="display"; inputimg = (float*)malloc(mszx*mszy*sizeof(float)); if((fp=fopen(infile,"rb")) == NULL) { printf("OPEN FAILED %s\n",infile); exit(0); } fread(inputimg, sizeof(float), mszx*mszy, fp); fclose(fp); img = cvCreateImage(cvSize(512,512),IPL_DEPTH_32F,1); cvSetZero(img); for (j = 0; j < mszy; j++) { for (i = 0; i < mszx; i++){ img->imageData[mszx * j + i] = inputimg[mszx * j + i]; } } cvNamedWindow(title,CV_WINDOW_AUTOSIZE); cvShowImage(title,img); cvWaitKey(0); cvDestroyWindow(title); cvReleaseImage(&img); return 0; } ここまでしかできませんでした。

  • C言語のソース

    他人が書いたC言語のソースを見てC言語の勉強をしようと思っていますが、インターネットで探しても、なかなか見つかりません。どなたか、Cのソースを公開しているサイトを教えていただけないでしょうか。お願いします。

  • C言語のソース

    初心者です。100ステップ位で理解するのにちょうどいいソースプログラムはホームページ上に無いでしょうか?

  • ロックマンシリーズに対してツッコミは駄目?

    ゲームロックマンシリーズのあらゆる設定に対してツッコミを 入れるのは不味かったでしょうか?思うところお教えください。 例えば「ブルースの口笛」。彼の口笛は果して本当に笛と言う 音を出す原理に従っての笛の音なのでしょうか? 私はてっきりラジカセと同じ原理だと思っていましたが。 他にもロボットを動かす動力源として原子力を使っていると言う 設定にも無茶を感じますし(ロボットの動力源が原子力だと、 周りの人々が被爆してしまう!)、敵ロボットを倒してICチップを 奪えばその能力を盗み取る事が出切ると言う設定にも根本的な 問題点を感じますし(泡とか出すのICチップを交換するのではなく、 普通にロックバスターの構造を変えてやらないといけないだろ。)、 ツッコミを入れだしたらキリが無い。 そもそも200X年とか年代設定されていますが、ひと昔前はそれで 近未来を描いていると言う設定で良かったのでしょうが、 今となれば大昔ですよ、そこにも問題点を感じる。 当時の予想よりも現代の未来化のスピードが遅いんだろうなぁ、 うん・・・。 で、本当にロックマンシリーズに対してツッコミを入れだすと キリが無いのですが、ロックマンシリーズにツッコミを入れるのは、 もはや、タブー、空気を読めと言う次元だったでしょうか? 思うところお教えください。 空想科学読本がロックマンの特集をすると、本当に酷い事に なりそうな気がするなぁ・・・。

専門家に質問してみよう