滑らかな移動

Last-modified: 2008-05-24 (土) 13:59:55

スプライトをある座標からある座標まで、
滑らか(指定した時間で指定した距離を正確に進むように)移動したい場合があります。
その処理のコードは以下のようになります。

コード
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;
}