SACT: Improve sprite move animation

- Move operation for hidden sprites shouldn't be ignored.
- Move time set by SACT.SetMoveTime shouldn't be reset after move.

This makes Save Lion in Rance 5D animate smoothly.
This commit is contained in:
kichikuou
2021-11-13 18:28:43 +09:00
parent fc3d66195f
commit 28ac087bca
2 changed files with 15 additions and 12 deletions
+6 -7
View File
@@ -363,10 +363,8 @@ int sp_set_move(int wNum, int wX, int wY) {
sp->move.to.x = wX - sact.origin.x;
sp->move.to.y = wY - sact.origin.y;
if (sp->move.time == 0) {
sp->move.time = -1;
if (!sp->move.time && !sp->move.speed)
sp->move.speed = 100;
}
sp->cur = sp->loc;
@@ -382,17 +380,18 @@ int sp_set_movetime(int wNum, int wTime) {
sp_assert_no(wNum);
sact.sp[wNum]->move.time = wTime * 10;
sact.sp[wNum]->move.speed = 0;
return OK;
}
// スプライト移動速度の設定
int sp_set_movespeed(int wNum, int wTime) {
int sp_set_movespeed(int wNum, int wSpeed) {
sp_assert_no(wNum);
if (wTime == 0) wTime = 1;
if (wSpeed == 0) wSpeed = 1;
sact.sp[wNum]->move.speed = wTime ;
sact.sp[wNum]->move.time = -1;
sact.sp[wNum]->move.speed = wSpeed;
sact.sp[wNum]->move.time = 0;
return OK;
}
+9 -5
View File
@@ -64,7 +64,8 @@ static void move_drain(sprite_t *sp) {
sact.teventremovelist = slist_append(sact.teventremovelist, sp);
sp->move.moving = FALSE;
sp->move.time = 0; // 移動時間の初期化
if (sp->move.speed > 0)
sp->move.time = 0;
}
// SP_MOVE の timer event callback
@@ -114,15 +115,18 @@ static int move_cb(sprite_t *sp, agsevent_t *e) {
void spev_move_setup(void* data, void* userdata) {
sprite_t *sp = (sprite_t *)data;
// 非表示のものは移動しない(いいのかな)
if (!sp->show) return;
// Hidden sprite just moves to its final location.
if (!sp->show) {
sp->cur = sp->loc = sp->move.to;
return;
}
// move 開始時刻の記録
sp->move.starttime = sact.movestarttime;
sp->move.moving = TRUE;
// MOVE_SPEED で設定した場合は、移動量を考慮して移動時間を決定
if (sp->move.time == -1) {
if (sp->move.speed > 0) {
// speed から timeへ
int dx = sp->move.to.x - sp->loc.x;
int dy = sp->move.to.y - sp->loc.y;
@@ -155,7 +159,7 @@ void spev_move_waitend(sprite_t *sp, int dx, int dy, int time) {
sp->move.to.x = dx;
sp->move.to.y = dy;
sp->move.speed = time;
sp->move.time = -1;
sp->move.time = 0;
sact.movelist = slist_append(sact.movelist, sp);
sact.movestarttime = get_high_counter(SYSTEMCOUNTER_MSEC);