DizzyAge по-русски

Русскоязычный форум для любителей игр на движке DizzyAge
Текущее время: 24 апр 2024, 11:34

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 07 апр 2017, 09:01 
Не в сети

Зарегистрирован: 29 янв 2016, 22:41
Сообщения: 700
Придумал способ замедлять/ускорять скорость ходьбы Диззи в плавном движке Titus'a с попиксельным перемещением (тот который в Ночи в Музее использовался).
Вот небольшая технодемка:
https://yadi.sk/d/LKzUdnZL3Gjaoy
И анимированная картинка.
Изображение
Клавишами 1 и 2 изменяется скорость ходьбы. Скорость показывается в верхнем левом углу. При значении "08" скорость соответствует нормальной скорости оригинального движка.
Дополнительно можно нажать F2 и в правом верхнем углу можно будет увидеть дополнительную информацию по переменным.

Смысл способа в том, что в свойствах игрока дополнительно добавляются виртуальные координаты X и Y. В примере выше на один реальный пиксель приходится 8 виртуальных. И при различных перемещениях Диззи все манипуляции производятся только с вирутуальными координатами. А при выводе происходит их пересчет в реальные. Так можно менять скорость в довольно широких пределах. Множитель виртуальных пикселей можно так же сделать не 8, а подобрать другой.
Более подробно в следующем сообщении.
-----------------------


Последний раз редактировалось Verm-V 07 апр 2017, 14:39, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2017, 09:03 
Не в сети

Зарегистрирован: 29 янв 2016, 22:41
Сообщения: 700
Регулировка скорости ходьбы Диззи

Актуально для плавного попиксельного движка за авторством 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));
Это, для правильного респауна после смерти.
----------------------


Последний раз редактировалось Verm-V 07 апр 2017, 14:41, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2017, 09:04 
Не в сети

Зарегистрирован: 29 янв 2016, 22:41
Сообщения: 700
Дополнительно.
Для возможности изменения скорости на ходу (для отладки) можно сделать так:

В def.gs добавить строчку:

Код:
#def G_KEY_CHEAT   87   // проверка нажаты ли отладочные клавиши


В handlers.gs в func HandlerDebug() добавляем

Код:
   //виртуальные и реальные координаты игрока
   speed_x = PlayerGet(P_VIRT_SPEED_X);
   speed_y = PlayerGet(P_VIRT_SPEED_Y);

   if(!KeyboardStatus(0x02)&&!KeyboardStatus(0x03)&&!KeyboardStatus(0x04)&&!KeyboardStatus(0x05)) GameSet(G_KEY_CHEAT,0);

   if(KeyboardStatus(0x02)==1 && !GameGet(G_KEY_CHEAT))
      {
         GameSet(G_KEY_CHEAT,1);
         speed_x=speed_x-1;
         if(speed_x<1) speed_x=1;
         PlayerSet(P_VIRT_SPEED_X,speed_x);
      }
   if(KeyboardStatus(0x03)==1 && !GameGet(G_KEY_CHEAT))
      {
         GameSet(G_KEY_CHEAT,1);
         speed_x=speed_x+1;
         if (speed_x>16) speed_x=16;
         PlayerSet(P_VIRT_SPEED_X,speed_x);
      }
   if(KeyboardStatus(0x04)==1 && !GameGet(G_KEY_CHEAT))
      {
         GameSet(G_KEY_CHEAT,1);
         speed_y=speed_y-1;
         if(speed_y<1) speed_y=1;
         PlayerSet(P_VIRT_SPEED_Y,speed_y);
      }
   if(KeyboardStatus(0x05)==1 && !GameGet(G_KEY_CHEAT))
      {
         GameSet(G_KEY_CHEAT,1);
         speed_y=speed_y+1;
         if (speed_y>16) speed_y=16;
         PlayerSet(P_VIRT_SPEED_Y,speed_y);
      }

   DebugData(2,"P_VIRT_COORD   : "+(str "%4i")(PlayerGet(P_VIRT_COORD)));

   DebugData(4,"P_VIRT_X       : "+(str "%4i")(PlayerGet(P_VIRT_X)));
   DebugData(5,"P_REAL_X       : "+(str "%4i")(PlayerGet(P_X)));

   DebugData(7,"P_VIRT_Y       : "+(str "%4i")(PlayerGet(P_VIRT_Y)));
   DebugData(8,"P_REAL_Y       : "+(str "%4i")(PlayerGet(P_Y)));

   DebugData(10,"P_VIRT_SPEED_X : "+(str "%4i")(PlayerGet(P_VIRT_SPEED_X)));
   DebugData(11,"P_VIRT_SPEED_Y : "+(str "%4i")(PlayerGet(P_VIRT_SPEED_Y)));

Теперь скорость по X можно менять клавишами 1 и 2. А в правом верхнем углу будут выводится значения всех координат и скоростей.

По Y - клавишами 3 и 4 (зарезервировано на будущее)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2017, 13:14 
Не в сети
Site Admin

Зарегистрирован: 15 окт 2012, 00:51
Сообщения: 4349
Verm-V писал(а):
Актуально для попиксельного движка (из Ночи в Музее)


(Не)скромно упомяну, что попиксельный движок - это мой движок)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2017, 14:38 
Не в сети

Зарегистрирован: 29 янв 2016, 22:41
Сообщения: 700
Да я и не посягал... Счас поправим титры. :)
Кстати я придумал, как туда можно нормальный WATER_PLAY воткнуть, сегодня ночью, если на работе будет время, попробую запилить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 апр 2017, 02:56 
Не в сети

Зарегистрирован: 17 окт 2012, 18:18
Сообщения: 3967
Verm-V, посягни! Иначе он никогда не сделает "водные процедуры".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 апр 2017, 05:56 
Не в сети

Зарегистрирован: 29 янв 2016, 22:41
Сообщения: 700
Тащемта итог такой. Запилил я этот WaterPlay. Диззи плавает, прыгает, тонет и т.д. Все плавненько и хорошо. Но вылезла одна проблема с анимацией. Когда Диззи плывет в сторону анимация прокручивается постоянно, хотя должна останавливаться после каждого гребка. Связано это похоже с тем, что значение P_POW в этом движке отличается от оригинального и придется подбирать граничные значения методом тыка. Но это уже завтра.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by Forumenko © 2006–2014
Русская поддержка phpBB