ページ 11

分割先でのこと。

Posted: 2010年8月29日(日) 14:33
by
ClearDrawScreenや ProsessMessageなどの関数を分割したファイルで使いたい場合どうすればいいですか?

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:36
by シエル
ゲームプログラミングの館さえしっかりやっていれば、こんなところでは悩みません。
その二つの関数はよほどのことがない限り、メインループ以外で呼び出す必要はありませんので。
下記のページのココ!って書いてるところに、プログラムを書けばよいのですから。

http://dixq.net/g/43.html

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:38
by
それだとソースコードが長くなり、デバッグにも苦労するので分割先のファイルの中だけで作ってしまいたいのです。どうすればいいですか?

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:45
by シエル
全部メインループの中だけで書こうとするから長くなるんです。

分割先のファイルの中でやりたい関数をいくつか書いて、それを一つの関数にすべてまとめます。

その一つにまとめた関数をメインループの中で呼び出せば、長くなりません。

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:45
by へろりくしょん
一度設計から見直してみては。

もし、デバッグコードとして埋め込むのであれば、ProsessMessage()はまだしもClearDrawScreen()はあちこちに埋め込むと、いろいろと不都合が出そうです。

どうしても使いたい場合は、それらを使うソースファイルの先頭あたりで #includce "Dxlib.h" とすればいいですよ。

分割コンパイル・翻訳単位・プロトタイプ宣言。 あたりをグーグル先生に聞くと幸せになれるかもしれません。

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:50
by シエル
とりあえずまだまだファイル分割に慣れていない感があります。

龍神録のプロジェクトファイルをダウンロードしてみて、
どのように分割されているか参考にし、自分にあった効率の良い設計に作り直して下さい。

Re:分割先でのこと。

Posted: 2010年8月29日(日) 14:51
by
分かりました。いろいろ勉強します。ありがとうございました。

Re:分割先でのこと。

Posted: 2010年8月29日(日) 15:13
by softya
ちなみに「龍神録プログラミングの館」の50章のプログラムのメインループはこれだけで構成されていますが、cppのファイルとしては22個あります。多分、京さんのお望みの事が実現できているんじゃないかと思います。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;

}
DxLib_End();//DXライブラリ終了処理
return 0;
}