キング・オブ・ファイターズ2002のような2D格闘ゲームの製作を目指している
JINといいます。
キャラクターのアニメーション関数を次のように書いたところ滑らかに
表示させることができました。
graph_ch{
//ch.xとch.yはキャラクターの原点座標です。
//ch.anim_cnt[0]は初期化関数にて0を代入しました。
//ch.anim_cnt[0]をカウンタにして1コマ毎の表示フレーム数を制御しています。
ch.anim_cnt[0] = ch.anim_cnt[0]++;
if(ch.anim_cnt[0]<4)
LoadGraphScreen(ch.x-28,ch.y-98,"ch0001.bmp",TRUE);
if(ch.anim_cnt[0]>=4 && ch.anim_cnt[0]<8)
LoadGraphScreen(ch.x-28,ch.y-99,"ch0002.bmp",TRUE);
if(ch.anim_cnt[0]>=8 && ch.anim_cnt[0]<12)
LoadGraphScreen(ch.x-28,ch.y-100,"ch0003.bmp",TRUE);
if(ch.anim_cnt[0]>=12 && ch.anim_cnt[0]<16)
LoadGraphScreen(ch.x-27,ch.y-101,"ch0004.bmp",TRUE);
if(ch.anim_cnt[0]>=16 && ch.anim_cnt[0]<20)
LoadGraphScreen(ch.x-27,ch.y-101,"ch0005.bmp",TRUE);
if(ch.anim_cnt[0]>=20 && ch.anim_cnt[0]<24)
LoadGraphScreen(ch.x-28,ch.y-100,"ch0006.bmp",TRUE);
if(ch.anim_cnt[0]>=24 && ch.anim_cnt[0]<28)
LoadGraphScreen(ch.x-28,ch.y-99,"ch0007.bmp",TRUE);
if(ch.anim_cnt[0]>=28 && ch.anim_cnt[0]<32)
LoadGraphScreen(ch.x-28,ch.y-98,"ch0008.bmp",TRUE);
if(ch.anim_cnt[0]>=32 && ch.anim_cnt[0]<36)
LoadGraphScreen(ch.x-29,ch.y-97,"ch0009.bmp",TRUE);
if(ch.anim_cnt[0]>=36 && ch.anim_cnt[0]<=40)
LoadGraphScreen(ch.x-29,ch.y-97,"ch0010.bmp",TRUE);
if(ch.anim_cnt[0]>=40)
ch.anim_cnt[0]=0;
}
このLoadGraphScreenをDrawRectGraphに書き換えてみました。
graph_ch{
//アニメーションに使われている1コマ毎の画像をまとめた、
//サイズ512x512の画像を初期化関数にてimg_ch[0][0]に代入してあります。
ch.anim_cnt[0] = ch.anim_cnt[0]++;
if(ch.anim_cnt[0]<4)
DrawRectGraph(ch.x-29,ch.y-99,2,2,56,103,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=4 && ch.anim_cnt[0]<8)
DrawRectGraph(ch.x-29,ch.y-100,59,2,56,104,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=8 && ch.anim_cnt[0]<12)
DrawRectGraph(ch.x-29,ch.y-101,116,2,56,105,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=12 && ch.anim_cnt[0]<16)
DrawRectGraph(ch.x-28,ch.y-102,173,2,55,106,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=16 && ch.anim_cnt[0]<20)
DrawRectGraph(ch.x-28,ch.y-102,229,2,55,106,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=20 && ch.anim_cnt[0]<24)
DrawRectGraph(ch.x-29,ch.y-101,285,2,56,105,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=24 && ch.anim_cnt[0]<28)
DrawRectGraph(ch.x-29,ch.y-100,342,2,56,104,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=28 && ch.anim_cnt[0]<32)
DrawRectGraph(ch.x-29,ch.y-99,399,2,56,103,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=32 && ch.anim_cnt[0]<36)
DrawRectGraph(ch.x-30,ch.y-98,455,2,57,102,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=36 && ch.anim_cnt[0]<=40)
DrawRectGraph(ch.x-30,ch.y-98,1,108,57,102,img_ch[0][0],TRUE,FALSE);
if(ch.anim_cnt[0]>=40)
ch.anim_cnt[0]=0;
}
このように書き換えたところ、最後のコマの表示時間が長くなってしまい、
結果、最後のコマから最初のコマに戻るまでの間が滑らかに表示されなくなりました。
「龍神録プログラミングの館」の、「FPSの制御と表示を可能にする関数」を使わせて頂いたところ、
処理速度に問題はありませんでした。
解決法が見つからず困っています。
DrawRectGraphを使って、ループするアニメーションを
滑らかに表示できる方法はないのでしょうか?
