• ベストアンサー

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

aris-wizの回答

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

前回のURLも張っておきますね。 http://oshiete.nikkeibp.co.jp/qa3460149.html No2さんが指摘されているKeyBoardですが、 渡しているのは配列なので、少し誤認があるようです。 配列にアクセスする場合に、KeyBoardでは *(KeyStat + KEY_UP) = 0;と行っているのに対し、 PlayerSyoriではpkenGraph[ply->direc]としています。 どちらかに統一する方が良いと思います。 直感的に、渡されるものがポインタであるか、配列であるかを 呼び出し元を確認しないでも良いように、KeyBoardには int KeyBoard( int *KeyStat, int ArraySize )のように 配列のサイズを渡すようにしたり(今回は特に必要ないですが。。。) 関数の引数説明をコメントとして入れるほうが良いかと。 >1: 用法によると思います。 変更する必要が無ければ #define SET_COL_RED 255 #define SET_COL_GREEN 255 #define SET_COL_BULE 255 程度で良いでしょうし、動的に変更する必要があるならば、 変数を使う方が良いかもしれませんね。 C++では定数定義はconst変数を使用して行われます。 const int SET_COL_REG = 255; const int SET_COL_GREEN = 255; const int SET_COL_BULE = 255; const変数は定義後の値の代入を許さないので定数として扱われます。 これは殆どがGlobalに定義されるため、Cなどでは グローバル変数をタブーとする為defineを使っている事が多いです。 >2: KeyStatやgwafはWinMainの中では使用されていないので、 MainProcで定義することで引数を2つ減らすことが出来ますね。 これらは、状態を保持する必要が無く毎回MainProcの中で 更新されている値です。それ以上のスコープを持っても、 持たなくても、結局MainProcの中で書き換えられているものですので MainProcで定義しましょうstaticは不要です。 そうしないと、MainProc内で無駄に「*」の使用が増えてしまいますし 逆に関数に渡す時には「&」がつきますが、引数の数はスタックサイズなどにも微妙に影響すると思うので、必要な変数は必要なスコープに 置くように心がける方がいいと思います。 前回、最後に書いた一言は、ズバリNo1さんが指摘している ところで、今回はply->pspd = P_MV_SPD;とせっかく代入してるのに、 ply->px -= P_MV_SPD ;とここでは定数を使っています。 とこのくらいでしょうか

wdam7
質問者

お礼

過去のURLを張ったほうがいいかと思いました 気づかず…*(KeyStat + KEY_UP) = 0;と一緒の形の方向で int KeyBoard( int *KeyStat, int ArraySize )という形も あるのですね。必要な時に使ってみます >1 #defineが3つでいいのですね。同じような数字なので いいのかなと迷っていました。<(_ _)> >2 確かにKeyStatとgwafは、その関数以後にしか使われていないから 引数を2つ消すことができる。引数が多いことに困惑していました。 視覚的にもすっきりしてよかったです。関数化のメリット!?に 気づいた感じです! ply->pspd = P_MV_SPD;に関しては修正します ものすごく分かりやすい説明、有難うございました。感動です!

関連するQ&A

  • 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言語ゲーム製作4 ソース公開 勉強中 ファイル分割

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

  • ライブラリ作成時のグローバル変数の対応(C言語)

    C言語を用いてライブラリを作成しています。 ライブラリは機能ごとにファイルを分けています。 今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。 このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。 しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。 このようなことをC言語で実現するためにはどうしたらよいのでしょうか? 開発環境は Windows7 VisualC++2010 です。 VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、 C言語でプログラミングしたいのです。 以下のようなサイトがあったのですが、これを使うしかないでしょうか? http://0xcc.net/blog/archives/000108.html

  • C言語のライブラリ関数の勉強の仕方

    はじめまして、私はC言語を勉強中の初心者です。 基本的な構文などを理解して、標準ライブラリ関数を勉強して行こうと思ったのですが、うまく勉強できずに苦戦しています。そこで2つ聞きたいことがあります。 1.普通標準ライブラリ関数はどの程度覚えるものなのでしょうか? 徹底的に網羅するのか、一般的なところは押さえて後は適当にやるのか、などを知りたいです。 2.関数はどうやって勉強したらいいのでしょうか? 私は細かいところまで徹底的に覚えたいタイプで、今は、自分のコンパイラ(VC++ 2008)のincludeフォルダにあるヘッダファイルを調べ、関数のプロトタイプ宣言をしてあるところを見つけて関数名を洗い出し、その関数名で検索を掛けて関数を覚えていく、という方法を取っているのですが、これだと恐ろしく効率が悪いです。皆さんはどうやってライブラリ関数について勉強していったのでしょうか? 質問したいのは上記の2点です。回答よろしくお願いします。

  • C言語のローカル変数の使い方について質問です。

    C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }

  • C言語 テキストファイルの文字列を配列に代入したい

    aaa.txt というテキストファイルがあり、その中身が 8 5 21 13 であるとします(1行のみ)。 main関数内で宣言した整数の配列、 int A[10]; に対して、 A[0]=8 A[1]=5 A[2]=21 A[3]=13 のように代入したいのですが、どのファイルポインタの関数を使ってどのように書けばいいのかわかりません。 ご教授お願いします。

  • ソースファイルの分割

    自分で作成したプログラムが長くなってしまったのでいくつかのファイルに分割したいのですが、一般にはどのように分けるのでしょうか? 作成したプログラムは以下のような内容を含んでいます。 クラス  クラスの定義  メンバ関数の定義 関数×2  定義  プロトタイプ宣言 main関数 プリプロセッサ制御文も教えてくださると助かります。

  • JNAでc言語ファイルの読み込み方が分かりません

    JNAでc言語ファイルの読み込み方が分かりません JNAを使用して、javaからcを読み込み動作するプログラムを作っています。 なんとなく定義は分かってきたのですが、 javaのソースコードに CLibrary.INSTANCE.printf(); のように、c言語を書き込んでいる状況なのですが、 JNAを利用した.javaファイルから.cファイルを読み込む方法はありますか? c言語の場合、.cファイルごとに分割された関数をmainが呼び出すとき、 extern void Sample(); とプロトタイプ宣言の後に Sample(); で呼び出せるみたいなので、 これを使って、 CLibrary.INSTANCE.extern void Sample(); とやってみましたが、コンパイルできませんでした;; 他にやり方がありますか? 知ってる方がいらっしゃいましたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。