Регулировка скорости ходьбы Диззи
Актуально для плавного попиксельного движка за авторством Titus'a.
----------------------
В
def.gs добавляются строки:
Код:
// регулировка скорости Диззи
#def P_VIRT_COORD 77 //множитель виртуальных координат
#def P_VIRT_X 78 //виртуальная координата X (P_X = gs_floor ( P_VIRT_X / P_VIRT_COORD )
#def P_VIRT_Y 79 //виртуальная координата Y (P_Y = gs_floor ( P_VIRT_Y / P_VIRT_COORD )
#def P_VIRT_SPEED_X 80 //виртуальная скорость по X
#def P_VIRT_SPEED_Y 81 //виртуальная скорость по Y
//для движения по 1 пикселю скорости должны равняться P_VIRTCOORD
Для координаты Y я не использовал, но добавил сразу на будущее, чтобы было.
----------------------
В
handlers.gs добавляются строки:
в
func HandlerGameStart() добавляем
(в секции // player cfg)Код:
PlayerSet(P_VIRT_COORD,8);
PlayerSet(P_VIRT_SPEED_X,8);
PlayerSet(P_VIRT_SPEED_Y,8);
Это начальная инициализация. Множитель виртуальных координат
P_VIRT_COORD можно сделать другим. Тогда для того, чтобы перемещения происходили один к одному, скорости тоже должны быть равны этому множителю.
----------------------
в
func HandlerGameAfterUpdate() добавляем
(в начале)Код:
//проверка расхождения виртуальных координат с реальными, если расхождение больше P_VIRT_COORD
//то виртуальные координаты делают равными реальными
virtx=PlayerGet(P_VIRT_X);
realx=PlayerGet(P_X);
virty=PlayerGet(P_VIRT_Y);
realy=PlayerGet(P_Y);
maxdiff=PlayerGet(P_VIRT_COORD);
if (gs_abs(virtx/maxdiff-realx)>2) PlayerSet(P_VIRT_X,realx*maxdiff);
if (gs_abs(virty/maxdiff-realy)>2) PlayerSet(P_VIRT_Y,realy*maxdiff);
Это проверка на рассогласование реальных координат с виртуальными. Нужна для того, чтобы при каких либо незапланированных манипуляциях с реальными координатами (например при отладке при перемещении Диззи по Ctrl/Shift+стрелки) Диззи появлялся там где нужно, а иначе будут перескоки.
----------------------
в
movement.gs в функциях
func CM_UpdateWalk()
func CM_UpdateJump()
func CM_UpdateFall()заменяем строку:
Код:
PlayerSet(P_X, PlayerGet(P_X) + PlayerGet(P_DIR) * CM_STEPX);
на строчки:
Код:
PlayerSet(P_VIRT_X, PlayerGet(P_VIRT_X) + PlayerGet(P_DIR) * PlayerGet(P_VIRT_SPEED_X));
newcoord=(int)gs_floor((float)((PlayerGet(P_VIRT_X) / PlayerGet(P_VIRT_COORD))));
PlayerSet(P_X,newcoord);
Собственно само перемещение по виртуальным координатам и пересчет их в реальные.
----------------------
в функциях
func CM_CheckWalkX()
func CM_CheckJumpX()
func CM_CheckFallX()добавляем строчку
(в начале)Код:
CM_STEPX=(int)(PlayerGet(P_VIRT_SPEED_X)/PlayerGet(P_VIRT_COORD)) + 1;
Коррекция размеров BoundingBox в зависимости от скорости. Это нужно, чтобы при разных скоростях Диззи не влетал в твердые предметы.
----------------------
в
player.gs заменяем функцию
func PlayerSetPos( x, y ) на следующую
Код:
func PlayerSetPos( x, y )
{
PlayerSet(P_X,x);
PlayerSet(P_VIRT_X,x*PlayerGet(P_VIRT_COORD));
PlayerSet(P_Y,y);
PlayerSet(P_VIRT_Y,y*PlayerGet(P_VIRT_COORD));
}
При установке позиции Диззи по реальным координатам, дополнительно подгоняются виртуальные.
----------------------
и в функции
func PlayerRespawn() вставляем строки
(в конце)Код:
PlayerSet(P_VIRT_X,PlayerGet(P_XSAFE)*PlayerGet(P_VIRT_COORD));
PlayerSet(P_VIRT_Y,PlayerGet(P_YSAFE)*PlayerGet(P_VIRT_COORD));
Это, для правильного респауна после смерти.
----------------------