トップページ > 過去ログ > 記事閲覧
描画速度の変更方法
名前:tikuijin 日時: 2013/01/06 01:06

キャラをキー移動させる時に手をふるような形のを作ってるんですが、それは出来たのですが、描画が早すぎて腕振りというより羽ばたいてるように見えてしまいます。 WaitTimerを使うとカクカクするように見えてしまいました・・・。 なんとか方法はありませんでしょうか?

Page: 1 |

Re: 描画速度の変更方法 ( No.1 )
名前:softya(ソフト屋) 日時:2013/01/06 12:55

3Dモデルならフレームの指定で何とかなりますが、画像だと間のコマを描くしか無いと思います。
Re: 描画速度の変更方法 ( No.2 )
名前:紙袋 日時:2013/01/06 20:59

各画像を描画する時間を制御してあげればいいと思います。 疑似的コードですが main() { int count = 0;//カウント用の変数 while() { if(count >= 0 && count < 30) { //1コマ目を描画 } if(count >= 30 && count < 50) { //2コマ目を描画 } if(count >= 50 && count < 60) { //3コマ目を描画 } count++; if(count >= 60) { count = 0;//1コマに戻す } } } こうすれば例えば60FPSの時、1コマ目は30カウントの間描画するので、 30×0.016 = 0.5 つまり0.5秒間1コマ目を描画するという感じになります。 このようにやってアニメーションがカクカクするという場合は画像の枚数が少ないのだと思います。
Re: 描画速度の変更方法 ( No.3 )
名前:tikuijin 日時:2013/01/08 23:16

ありがとうございます。 そのコードでやってみたところ、countが60より大きくなるか等しくなる時に1コマに戻すところでキャラの表示が一旦消えてしまいます。 どうしたらよいでしょうか?
Re: 描画速度の変更方法 ( No.4 )
名前:紙袋 日時:2013/01/08 23:44

こちらでは消えるといった現象は確認できませんね・・・ もしかしたら他の部分で問題があるのかもしれません。 私の方で確認したコードを貼っておきます。 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ ChangeWindowMode(TRUE); if(DxLib_Init() == -1){ return -1; } int GHandle[3]; LoadDivGraph(_T("Graphics.bmp"),3,3,1,30,30,GHandle); int count = 0; SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ if(count >= 0 && count < 30){ DrawGraph(0,0,GHandle[0],TRUE); } if(count >= 30 && count < 50){ DrawGraph(0,0,GHandle[1],TRUE); } if(count >= 50 && count < 60){ DrawGraph(0,0,GHandle[2],TRUE); } count++; if(count >= 60){ count = 0; } ScreenFlip(); } DxLib_End(); return 0; }
Re: 描画速度の変更方法 ( No.5 )
名前:tikuijin 日時:2013/01/09 21:04

ありがとうございます。 再度検証します。 一応こちらではボタン判定させつつ描画しています。
Re: 描画速度の変更方法 ( No.6 )
名前:コナン 日時:2013/01/09 21:10

横から失礼します。 上記プログラムはcountが60以上の時はcountを0に 戻すだけでキャラクターを表示していないので、 消えてしまうのだと思います。
Re: 描画速度の変更方法 ( No.7 )
名前:tikuijin 日時:2013/01/09 22:06

ありがとうございます。 私もそうだと思いcountを0に戻すときにも描画させていますがやはり消えてしまいます。 なぜでしょうね・・・。
Re: 描画速度の変更方法 ( No.8 )
名前:紙袋 日時:2013/01/10 00:49

私のプログラムをよく見てもらうと分かるのですが countが59の時に3コマ目を描画して、countの値を1増やして60にした後に、 60以上なら0にするとしているのでループで描画をしない時はないはずだと思います。 (なので、count >= 60 のところは count == 60 でも大丈夫だと思います。) 多分、アニメーションということなのでLoadDivGraph関数を使って 配列に分割した画像を入れていると思うのですが、 その配列のどこかにうまく画像が入っていない可能性もあるので、配列に入っている画像を全部並べて描画してみていただけますか?
Re: 描画速度の変更方法 ( No.9 )
名前:tikuijin 日時:2013/01/12 18:33

ありがとうございます。 解決しましたが、countに0を入れるときにGHandle[2]を描画させると[0] [1]が1つずつ少なくなってしまいなんか動くが若干不自然です。 その場合は数字に[0][1]の描画だけ1プラスさせればいいのでしょうか? 説明が下手ですがよろしくお願いします。
Re: 描画速度の変更方法 ( No.10 )
名前:紙袋 日時:2013/01/13 13:35

だいぶソースコードが変わってしまうのですが、 キー入力対応+もう少し変更がしやすいように変更しました。 #include <tchar.h> #include <DxLib.h> const int ANIME_NUM = 3;//1つのアニメーションに使う画像の数 const int ANIME[ANIME_NUM] = {30,20,10};//1つのアニメーションに使う各画像の描画時間:※ここの値を変えることで各画像の描画時間が変わる int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ ChangeWindowMode(TRUE);//winodwモードで起動 //DXライブラリの初期化 if(DxLib_Init() == -1){ return -1; } int GHandle[3];//グラフィックを入れるハンドル int count = 0;//各画像の描画時間のカウント int GraphicNum = 0;//描画する画像番号の指定 int x = 0, y = 0;//画像を描画する位置 bool move = false;//キー入力があるかどうか LoadDivGraph(_T("Graphic.bmp"),3,3,1,50,50,GHandle);//画像の分割読み込み SetDrawScreen(DX_SCREEN_BACK);//裏画面に描画 //メインループ while(ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ //キー入力があるかの確認 if(CheckHitKey(KEY_INPUT_UP) || CheckHitKey(KEY_INPUT_DOWN) || CheckHitKey(KEY_INPUT_LEFT) || CheckHitKey(KEY_INPUT_RIGHT)){ if(CheckHitKey(KEY_INPUT_UP)){ y -= 3; } if(CheckHitKey(KEY_INPUT_DOWN)){ y += 3; } if(CheckHitKey(KEY_INPUT_LEFT)){ x -= 3; } if(CheckHitKey(KEY_INPUT_RIGHT)){ x += 3; } //描画している画像が指定時間になったか if(count == ANIME[GraphicNum]){ GraphicNum++;//描画する画像を次のにする count = 0;//カウントを元に戻す //アニメーションの最後のコマだったら if(GraphicNum == ANIME_NUM){ GraphicNum = 0;//最初の画像に戻す } } count++;//カウントの増加 move = true;//動いているのでアニメーションをさせる }else{ count = 0;//カウントを元に戻す GraphicNum = 0;//最初の画像に戻す move = false;//動いていないのでアニメーションをさせない } //動いているかの確認 if(move){ DrawGraph(x,y,GHandle[GraphicNum],TRUE);//現在のコマを描画 }else{ DrawGraph(x,y,GHandle[0],TRUE);//動いてないので待機画像を描画 } ScreenFlip();//裏画面の描画を表に反映 } DxLib_End();//DXライブラリの終了処理 return 0; } コメントで書いてありますが、最初のほうにある ANIMEの配列の値を変えれば描画時間が変わるようになります。 もちろん、このコードは簡単に実装したものなのであくまで参考にする程度にしてください。
Re: 描画速度の変更方法 ( No.11 )
名前:tikuijin 日時:2013/01/14 16:58

ありがとうございます。 試したのですが、ボタンをおしていないのに画像がパラパラ漫画みたいに次々表示されます・・・。 よろしくお願いします。
Re: 描画速度の変更方法 ( No.12 )
名前:紙袋 日時:2013/01/14 17:08

それは多分入力がある時と、ない時での分岐(私が書いたコードでいうmove変数)が出来ていないのだと思います。 修正方法に関しては実装の仕方により違うので実装を見てみないと何とも言えません。 とりあえず今回の質問である描画速度の変更に関しては問題ありませんか?
Re: 描画速度の変更方法 ( No.13 )
名前:tikuijin(解決済み) 日時:2013/01/15 00:21

ありがとうございます。 先ほどの現象はなくなりましたが、やはりキーを押すと自然とGHandle[0]にある待機画像も一緒に描画されますね。 キーを押していればGHandle[1]→[2]→[1]→[2]という感じにループされるはずですが、なぜか[0]にある待機画像も表示されます。 キーを話すときちんと待機画像が描画されます。 こちらでは分割ロードさせてないのでそれが原因でしょうかね? とりあえずの速度変更については大丈夫そうです。 ありがとうございます。 とここまで打っていて最後に一度試したら見事にきちんと動きましたw 今までありがとうございました。 またお世話になるかもしれないですがその時はお願いします。本当にお世話になりましたm(__)m

Page: 1 |