トップページ > 過去ログ > 記事閲覧
プログラムの動きが遅くなる
名前:クラウン 日時: 2008/01/15 15:37

こんにちは。 今、ゲームを作成していて、下記のような爆発プログラムを作成しました。 ただ、これを呼び出すとき(爆発中)、ほかの敵が動かなくなったりしてしまいます。 この問題を回避する方法は、ありますか?? よろしくお願いします。 <開発環境> OS:WindowsXP ライブラリ:DXライブラリ 開発言語:C言語 開発環境ソフト:Visual C++ 2005 Express Edition <プログラム> void explosion( int explosion_x , int explosion_y ) { int i; static int *explosion_img ; SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏描画に設定 for( i=0 ; i<15 ; i++ ) { explosion_img=&Explosion_Image[i]; DrawGraph( explosion_x , explosion_y , *explosion_img , TRUE ); ScreenFlip(); } PlaySoundMem( Explosion_BGM , DX_PLAYTYPE_NORMAL ); }

Page: 1 |

Re: プログラムの動きが遅くなる ( No.1 )
名前: 日時:2008/01/15 17:28

提示されたコード以外にもっと処理に時間の掛かる ネックな部分を探して改善するのが先決です。 アルゴリズムを全般見直すか、処理に時間の 掛かりそうな所を探してください。 兎に角無駄をなくすしか無いでしょう。 SetDrawScreen( DX_SCREEN_BACK );//プログラムの起動時に一回やればよい。 void explosion( int explosion_x , int explosion_y ) { int i; for( i=0 ; i<15 ; i++ ){ DrawGraph( explosion_x , explosion_y , Explosion_Image[i] , TRUE ); ScreenFlip(); } PlaySoundMem( Explosion_BGM , DX_PLAYTYPE_NORMAL ); }
Re: プログラムの動きが遅くなる ( No.2 )
名前:クラウン 日時:2008/01/15 19:25

ありがとうございます。
Re: プログラムの動きが遅くなる ( No.3 )
名前:浮浪者 日時:2008/01/15 19:59

横から失礼します。 処理に時間がかかるとかいう以前に 爆発の画像表示の処理をループ内でやっていますよね? つまり、ループが回っている間(画像が変わっている間)には、他の処理はしてないのではないですか? それから、ScreenFlip(); は呼び出すたびに画面が更新されてしまうので、 1フレームにつき一回しか呼び出さないようにした方が良いと思います。 (基本的にはメインループ内の最後ですかね)
Re: プログラムの動きが遅くなる ( No.4 )
名前:クラウン 日時:2008/01/16 11:42

浮浪者様、アドバイスありがとうございます。 ループが回っている間、確かにほかの処理はされませんね。 解決方法などはありますか?ほかの、爆発アニメーションの作成方法など・・・。
Re: プログラムの動きが遅くなる ( No.5 )
名前:SweetBlack 日時:2008/01/16 12:55

他の敵が動くのと同じように 爆発も動かして(アニメーション)させてやればいいだけですよ。 早い話、爆発も「キャラのひとつ」にしてしまうんです。
Re: プログラムの動きが遅くなる ( No.6 )
名前:クラウン 日時:2008/01/16 17:32

SweetBlack様ありがとうございます! 参考にこのように作ってみたんですが、これだと最後の画像が一瞬表示されるだけできえてしまいます。なにか、いい方法はありますか? <プログラム> void explosion( int explosion_x , int explosion_y , int i ) { DrawGraph( explosion_x , explosion_y , Explosion_Image[i] , TRUE ); if(i<15) explosion( explosion_x+1 , explosion_y , i+1 ); else PlaySoundMem( Explosion_BGM , DX_PLAYTYPE_NORMAL ); }
Re: プログラムの動きが遅くなる ( No.7 )
名前: 日時:2008/01/16 18:12

うーん、惜しいような、惜しくないような。 再起呼び出ししている間はループと同じように 他の処理を行えません。 #include "DxLib.h" int animation( void ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ){ // DXライブラリ初期化処理 return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK ); while( !ProcessMessage() && !CheckHitKey( KEY_INPUT_ESCAPE ) ){ ClearDrawScreen(); animation(); ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } int animation( void ) { static int frame; char* anime[] = { "1枚目", "2枚目", "3枚目", "4枚目", "5枚目", "6枚目", "7枚目", "8枚目", "9枚目", "10枚目", "11枚目", "12枚目", "13枚目", "14枚目", "15枚目" }; if ( frame >= 15 ){ frame = 0; } DrawString( 0, 16, anime[frame++], GetColor( 255 , 255 , 255 )); return 0; } 適当ですが、参考に。
Re: プログラムの動きが遅くなる ( No.8 )
名前:かたぱると 日時:2008/01/16 18:19

※通様とほぼ同時刻の返信になってしまっていたので修正しました。 No.6のようなプログラムですと explosionの中でexplosionを呼び出す手法なので 「再帰」という状態になってしまっています。 この状態ですと1フレームに15枚全て重ねて描いてしまっているので 最後の1枚しか見えていないように感じられるのではないでしょうか。 15枚のアニメーションを1フレームずつ表示したいのであれば、 ○1フレームで1枚描く。カウンタを1進める。カウンタが15なら爆発終了。計15フレームかかる ×1フレームでカウンタを1進めつつ15枚全部描く。一気に全部やってしまっているので計1フレーム(←上記No.6のプログラムですとこの状態) となるのがよろしいかと。 爆発アニメーション用のカウンターは1フレームで1だけ進める訳です。
Re: プログラムの動きが遅くなる ( No.9 )
名前:ZAP 日時:2008/01/16 22:24

ところで、爆発音を鳴らすときのパラメータ指定が DX_PLAYTYPE_NORMAL になっているので、 鳴り終わるまで処理がここで止まっていると思うのですが、 これはこれでいいのでしょうか?
Re: プログラムの動きが遅くなる ( No.10 )
名前: 日時:2008/01/17 05:24

鳴らすサウンドの長さにもよりますが、 確かに「DX_PLAYTYPE_BACK」を指定したほうが 良いですね。 効果音でも2・3秒はブロックされることになりそうです。。。
Re: プログラムの動きが遅くなる ( No.11 )
名前:クラウン 日時:2008/01/21 10:28

皆さんありがとうございます! DX_PLAYTYPE_BACKに変更したら大分マシになりました。あと、当たり判定もすこし、まずかったので変更したら大分マシになりました。 皆さん、本当にありがとうございました。

Page: 1 |