DizzyAge по-русски http://dizzyage.flybb.ru/ |
|
Изменение скорости ходьбы Диззи в попиксельном движке. http://dizzyage.flybb.ru/topic224.html |
Страница 1 из 1 |
Автор: | Verm-V [ 07 апр 2017, 09:01 ] |
Заголовок сообщения: | Изменение скорости ходьбы Диззи в попиксельном движке. |
Придумал способ замедлять/ускорять скорость ходьбы Диззи в плавном движке Titus'a с попиксельным перемещением (тот который в Ночи в Музее использовался). Вот небольшая технодемка: https://yadi.sk/d/LKzUdnZL3Gjaoy И анимированная картинка. Клавишами 1 и 2 изменяется скорость ходьбы. Скорость показывается в верхнем левом углу. При значении "08" скорость соответствует нормальной скорости оригинального движка. Дополнительно можно нажать F2 и в правом верхнем углу можно будет увидеть дополнительную информацию по переменным. Смысл способа в том, что в свойствах игрока дополнительно добавляются виртуальные координаты X и Y. В примере выше на один реальный пиксель приходится 8 виртуальных. И при различных перемещениях Диззи все манипуляции производятся только с вирутуальными координатами. А при выводе происходит их пересчет в реальные. Так можно менять скорость в довольно широких пределах. Множитель виртуальных пикселей можно так же сделать не 8, а подобрать другой. Более подробно в следующем сообщении. ----------------------- |
Автор: | Verm-V [ 07 апр 2017, 09:03 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Регулировка скорости ходьбы Диззи Актуально для плавного попиксельного движка за авторством Titus'a. ---------------------- В def.gs добавляются строки: Код: // регулировка скорости Диззи Для координаты Y я не использовал, но добавил сразу на будущее, чтобы было.#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 ---------------------- В handlers.gs добавляются строки: в func HandlerGameStart() добавляем (в секции // player cfg) Код: PlayerSet(P_VIRT_COORD,8); Это начальная инициализация. Множитель виртуальных координат P_VIRT_COORD можно сделать другим. Тогда для того, чтобы перемещения происходили один к одному, скорости тоже должны быть равны этому множителю.PlayerSet(P_VIRT_SPEED_X,8); PlayerSet(P_VIRT_SPEED_Y,8); ---------------------- в func HandlerGameAfterUpdate() добавляем (в начале) Код: //проверка расхождения виртуальных координат с реальными, если расхождение больше P_VIRT_COORD Это проверка на рассогласование реальных координат с виртуальными. Нужна для того, чтобы при каких либо незапланированных манипуляциях с реальными координатами (например при отладке при перемещении Диззи по Ctrl/Shift+стрелки) Диззи появлялся там где нужно, а иначе будут перескоки.//то виртуальные координаты делают равными реальными 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); ---------------------- в 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, 09:04 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Дополнительно. Для возможности изменения скорости на ходу (для отладки) можно сделать так: В 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 (зарезервировано на будущее) |
Автор: | Titus [ 07 апр 2017, 13:14 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Verm-V писал(а): Актуально для попиксельного движка (из Ночи в Музее) (Не)скромно упомяну, что попиксельный движок - это мой движок) |
Автор: | Verm-V [ 07 апр 2017, 14:38 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Да я и не посягал... Счас поправим титры. Кстати я придумал, как туда можно нормальный WATER_PLAY воткнуть, сегодня ночью, если на работе будет время, попробую запилить. |
Автор: | trz [ 08 апр 2017, 02:56 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Verm-V, посягни! Иначе он никогда не сделает "водные процедуры". |
Автор: | Verm-V [ 08 апр 2017, 05:56 ] |
Заголовок сообщения: | Re: Изменение скорости ходьбы Диззи в попиксельном движке. |
Тащемта итог такой. Запилил я этот WaterPlay. Диззи плавает, прыгает, тонет и т.д. Все плавненько и хорошо. Но вылезла одна проблема с анимацией. Когда Диззи плывет в сторону анимация прокручивается постоянно, хотя должна останавливаться после каждого гребка. Связано это похоже с тем, что значение P_POW в этом движке отличается от оригинального и придется подбирать граничные значения методом тыка. Но это уже завтра. |
Страница 1 из 1 | Часовой пояс: UTC + 4 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |