スプライトをある座標からある座標まで、
滑らか(指定した時間で指定した距離を正確に進むように)移動したい場合があります。
その処理のコードは以下のようになります。
game_main(void) { int nSp = SP_GET_UNUSE_NUM(); SP_SET_CG(nSp, 2); // **GA.ALDのリンク番号2にCGがある場合。ないならSP_CREATEで作ってね。 SP_MOVE_POS(nSp,200,300,5000); }
void SP_MOVE_POS(int nSP,int nX1,int nY1,int nTime = 1000) { int nX0, nY0;SP_GET_POS(nSP,nX0,nY0); float fX = 0.00000,fY = 0.00000; sact_timer_t tm;
for(;tm.Get < nTime;) { fX = (tm.Get * 1000 )/ nTime * (nX1 - nX0) / 1000; fY = (tm.Get * 1000 )/ nTime * (nY1 - nY0) / 1000; SP_SET_POS(nSP,nX0 + fX, nY0 + fY);UPDATE; } }
「SP_MOVE_POS」関数は、nSPで指定されたスプライトを現在の座標から
終了座標(nX1, nY1)まで、指定時間nTimeで移動するものです。
forループ内では、関数の最初の方で宣言したsact_timer_tと指定時間の比較と、
移動の最大値・最小値の比較を元に座標を割り出しています。
つまり、現在座標は、
指定時間nTimeに対し現在のタイマーがどれくらいの割合か求め、
その割合と等しい、最大座標との値を求めれば出るわけです。
現在座標をSP_SET_POS関数で座標を設定し、
UPDATE(SACT_UPDATE)関数で画面更新しています。
floatは宣言だけでなく、小数点の値を入れておきましょう。
void SP_POS_MOVE(int nSP,int nX1,int nY1,int nTime = 1000,int nBlend1 = 256,int nTime2 = 0) { int nX0, nY0;SP_GET_POS(nSP,nX0,nY0); int nBlend0 = SP_GET_BLEND_RATE(nSP); float fX = 0.00000,fY = 0.00000;float fB = 0.0000;
sact_timer_t tm;
for(;tm.Get <= nTime || tm.Get <= nTime2;) { if(nX0 + fX != nX1){fX = (tm.Get * 1000 )/ nTime * (nX1 - nX0) / 1000;} if(nY0 + fY != nY1){fY = (tm.Get * 1000 )/ nTime * (nY1 - nY0) / 1000;} if(nBlend0 + fB != nBlend1){fB = (tm.Get * 1000 )/ nTime2 * (nBlend1 - nBlend0) / 1000; } SP_SET_POS(nSP,nX0 + fX, nY0 + fY); if(nBlend1 > -1 && nBlend1 < 256){SP_SET_BLEND_RATE(nSP, nBlend0 + fB);} UPDATE; } //時間によっては正確にセットされない場合があるため、移動や透過が終了しきったあと、 //誤差を修正してから戻ります SP_SET_POS(nSP,nX1, nY1); SP_SET_BLEND_RATE(nSP,nBlend1);
return; }