Game Maker - создание игр | HellRoom Games
Март 24, 2025, 03:35:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Пауза и время. Для новичков.  (Прочитано 28083 раз)
0 Пользователей и 1 Гость смотрят эту тему.
life Jumb
GM Pro user
*

Репутация: 251
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« : Апрель 07, 2016, 11:36:19 »

Многие новички часто ступоряться на реализации, даже самых простых вещей. В гмс нету "вшитого" механизма частичной остановки игровых процессов. И многие игроделы, для реализации самой простой игровой паузы, прибегают к таким танцам с бубнами, от которых порой напрочь отбивает желание продолжать разработку игры.

В лучшем случае реализация паузы выглядит так:
Код: (Step шарика)
if(global.pause=1){speed=8}else{speed=0}


Эту запись можно немного упростить:
Код: (Step шарика)
speed=8*global.pause //если пауза = 0 то и скорость будет 0
ИЛИ
Код: (Step шарика)
speed=8*(1-global.pause) //на тот случай если у вас при global.pause=1 игра должна паузиться
ИЛИ
Код: (Step шарика)
speed=8*(global.interface=3) //global.interface=3 это когда у нас рисуется игровой худ и игра не должна быть в паузе
В зависимости от того как построена ваша игра.


Здесь можно сразу немного оптимизировать лишние расчеты, перенеся расчеты в BEGIN STEP контроллера:
Код: (BEGIN STEP Контроллера)
global.t=global.pause

/* два других варианта
global.t=1-global.pause
global.t=(global.interface=3)

И уже умножать скорость всех процессов на global.t:
Код: (Step шарика)
speed=8*global.t



Как наверное некоторые уже могли догадаться global.t, не обязательно должен быть равен 1 или 0:
Код: (BEGIN STEP Контроллера)
global.t=global.pause*global.timescale

/* два других варианта
global.t=(1-global.pause)*global.timescale
global.t=(global.interface=3)*global.timescale
global.timescale скорость течения времени в нашей игре. (если global.timescale=0.5 то время будет например в 2 раза замедлено, если global.timescale=2 то в 2 разу ускорено)
Теперь можете смело пилить фишки со слоумо, присваивая global.timescale нужные вам значения.



И последнее:
Код: (BEGIN STEP Контроллера)
global.t=global.pause*global.timescale*(delta_time/16666)

/* два других варианта
global.t=(1-global.pause)*global.timescale*(delta_time/16666)
global.t=(global.interface=3)*global.timescale*(delta_time/16666)
16666 это нормальная величина дельта_тайма при 60 фпс
То есть скорость игры будет форситься если фпс будет меньше 60. Что значительно поможет с лагами.
Или наоборот, скорость игры будет пропорционально замедляться если фпс будет больше.
(Например вы можете дать возможность игроку снять ограничение на фпс в настройках, и позволить ему наслаждаться самой плавной картинкой что тянет его железо)

 

Записан

 
MyDreamForever
GM Pro user
*

Репутация: 288
Offline Offline

Пол: Мужской
Награды:
Третье место на HellRoom Jam #7 [I Love You!]500 сообщений!За постоянность! [10 дней на форуме]За лояльность! [+150 репутации]Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]...
API: Game Maker 8.0 Pro
Сообщений: 701


StarCraft <3


« Ответ #1 : Апрель 10, 2016, 20:34:03 »

Интересная инфа 

А что делать с алармами?
Записан
DmitryDS
Потому что я такой-сякой
GM Pro user
*

Репутация: 159
Offline Offline

Награды:
За лояльность! [+150 репутации]1000 сообщений!За постоянность! [100 дней на форуме]
API: GameMaker Studio Master
Сообщений: 1061



WWW
« Ответ #2 : Апрель 10, 2016, 20:42:47 »

Можно в Step прибавлять единичку всем не-нулевым алярмам, если пауза включена. Ну, самый простой вариант, который приходит в голову.
 оффтоп
« Последнее редактирование: Апрель 10, 2016, 20:54:53 от DmitryDS » Записан

Я никогда никого не пытаюсь оскорбить или обидеть, хотя порой веду себя вызывающе. Не обижайтесь, я не со зла
Fur
Абы-какой
GM Pro user
*

Репутация: 463
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]Третье место на HellRoom Jam #9 [Flucoldache]За лояльность! [+300 репутации]Настоящий игродел!Боже мой, посмотрите на эту медальку! Первое место на HellRoom Jam #6
API: Game Maker 8.0 Lite
Деятельность: Бурная.
Сообщений: 3673


Лисяток тебе.


« Ответ #3 : Апрель 10, 2016, 20:43:35 »

Ладно. А где, эм, применяемые на практике способы с instance_deactivate_all?
Ты ведь не собираешься в большом проекте к каждой переменной приписывать вот это?

А что делать с алармами?
Написать аналог аларму. Намного удобнее.

И да. tsya.ru
Записан

В одной отдельно взятой фразе не должно быть больше миллиона муравьёв, пусть даже она — научного труда о муравьях.

Hyperflex
life Jumb
GM Pro user
*

Репутация: 251
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« Ответ #4 : Апрель 11, 2016, 14:07:31 »

Ладно. А где, эм, применяемые на практике способы с instance_deactivate_all?
Ты ведь не собираешься в большом проекте к каждой переменной приписывать вот это?

К каждому времязависимому процессу, ага умножать на коэффициент global.t.
Другими словами именно так и рекомендую делать.
Скажу даже более того, рекомендую у каждого объекта иметь локальную t=global.t*get_local_time(x,y)*set_add
get_local_time скрипт, возвращающий чему равен коэффициент множителя времени в точке пространства.
set_add=для дополнительного контроля. Например что-бы когда враг покидал зону действия хроносферы, эффект замедления кончался постепенно. Или для каких нибудь замедляющих заклинаний.
Записан

 
Goo
ну типа
GM Pro user
*

Репутация: 163
Offline Offline

Пол: Мужской
Награды:
3 место в HellRoom Jam XВторое место на HellRoom Jam #9 [Антибиотик]
API: GameMaker Studio 2
Деятельность: программист
Сообщений: 1345



« Ответ #5 : Апрель 11, 2016, 14:40:29 »

Я тут предложение "кину", а делать или нет решишь сам,

учитывая, лень и несообразительность некоторых индивидуумов(которые даже поиском не в состоянии воспользоваться)
думаю, не лишним будет сделать(и добавить в шапку) пару GMZшников,
"наглядно иллюстрирующих"пример использования описанного способа!

Конечно это не избавит от возможного " читал статью, качал пример, но ниче не понятна",
но все же... лишним не будет!

ну конечно можно еще описать что такое времязависимые процессы, и чем они отличаются от
временно-независимых, чтобы не пихали это везде где не попадя...


хотя напоминаю, делать или нет, сам решишь!!!
« Последнее редактирование: Апрель 11, 2016, 14:46:03 от ZaRubick » Записан

Fur
Абы-какой
GM Pro user
*

Репутация: 463
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]Третье место на HellRoom Jam #9 [Flucoldache]За лояльность! [+300 репутации]Настоящий игродел!Боже мой, посмотрите на эту медальку! Первое место на HellRoom Jam #6
API: Game Maker 8.0 Lite
Деятельность: Бурная.
Сообщений: 3673


Лисяток тебе.


« Ответ #6 : Апрель 11, 2016, 16:06:23 »

А какое отношение хроносфера имеет к паузе? .-.
Записан

В одной отдельно взятой фразе не должно быть больше миллиона муравьёв, пусть даже она — научного труда о муравьях.

Hyperflex
Goo
ну типа
GM Pro user
*

Репутация: 163
Offline Offline

Пол: Мужской
Награды:
3 место в HellRoom Jam XВторое место на HellRoom Jam #9 [Антибиотик]
API: GameMaker Studio 2
Деятельность: программист
Сообщений: 1345



« Ответ #7 : Апрель 11, 2016, 16:23:35 »

Цитировать
А какое отношение хроносфера имеет к паузе? .-.

думаю он все таки это отдельно рассматривал,
сначало про паузу,
а уже потом все остальное.

хотя хз..

Добавлено: Апрель 11, 2016, 16:28:03
а в конце просто все объединил,
типа если пауза, то и синхронизировать ничего не надо..
т.к. при global.pause == 0 все (ниже) нуль
global.t=global.pause*global.timescale*(delta_time/16666)
Записан

luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #8 : Апрель 11, 2016, 18:07:29 »

Значит меня не покидает ощущение, что Джамб пудрит нам мозги своим таймскейлом.
Замечаний у меня два.
Первое условное - ускорения в такой системе должны иметь квадратичный коэффициент.
Второе важное - при смене таймскейла скорость нужно перерасчитать. То есть видите в самом верху статьи образец кода с заметкой про лучший случай. Так вот если мы представим, что скорость там имеет какое-то важное значение и не просто устанавливается некой константной переменной, а была получена в результате полёта, влияния разных сил и всего такого, то после окончания паузы восстановить её может быть проблемой.

В свидетельство себе привожу пример с простейшей гравитацией и этим вариантом таймскейла.
Колёсиком управляется таймскейл, левая кнопка мыши - запустить шар с неким импульсом.

* chrono.gmk (9.67 Кб - загружено 555 раз.)
Записан
life Jumb
GM Pro user
*

Репутация: 251
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« Ответ #9 : Апрель 11, 2016, 18:52:12 »

Ща гляну пример. Но уже сразу скажу, что квадратных формул быть не должно. Это свидетельство того, что не там или не то умножается на коэффициент таймскейла.

Добавлено: Апрель 11, 2016, 19:00:09
Я так и не понял в примере как должен двигаться шарик, слишком не наглядно. Но вот основной принцип.

Код: (create)
sp=10
dir=45

Код: (step)
x+=lengthdir_x(sp*global.t,dir)
y+=lengthdir_y(sp*global.t,dir)

sp-=0.5*global.t //замедляющийся шарик
sp-= (sp*0.1) *global.t //экспоненциально замедляющийся шарик
никаких квадратов в формулах быть не должно

Добавлено: Апрель 11, 2016, 19:01:51
А какое отношение хроносфера имеет к паузе? .-.
Да никакого, в статье об этом нет. Только о паузе и времени.

Добавлено: Апрель 11, 2016, 19:06:14
Цитировать
А какое отношение хроносфера имеет к паузе? .-.

думаю он все таки это отдельно рассматривал,
сначало про паузу,
а уже потом все остальное.

хотя хз..

Добавлено: Апрель 11, 2016, 16:28:03
а в конце просто все объединил,
типа если пауза, то и синхронизировать ничего не надо..
т.к. при global.pause == 0 все (ниже) нуль
global.t=global.pause*global.timescale*(delta_time/16666)
При паузе просто по формуле при любом раскладе получиться ноль. Все времязависимые процессы остановяться.
"времязависимые процессы" - то что по мнению разраба (тобишь тебя) должно зависеть от времени. Как правило все кроме гуи, и в некоторых случаях эффектов.
« Последнее редактирование: Апрель 11, 2016, 19:06:14 от life Jumb » Записан

 
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #10 : Апрель 11, 2016, 20:58:54 »

Эге, но тогда ты не используешь родной speed. Ты пишешь свою переменную sp и двигаешь объект самостоятельно. Это меняет всё.
Записан
life Jumb
GM Pro user
*

Репутация: 251
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« Ответ #11 : Апрель 11, 2016, 22:05:55 »

да пожалуйста:
Код: (create)
sp=10
dir=45

Код: (step)
speed=sp*global.t
direction=dir

sp-=0.5*global.t //замедляющийся шарик
sp-= (sp*0.1) *global.t //экспоненциально замедляющийся шарик

это просто привычка двигать самому
Записан

 
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #12 : Апрель 11, 2016, 22:32:25 »

Ну и всё равно ты используешь переменную sp, которая и есть реальная скорость безотносительно времени. Это важный момент и его бы в шапке описать.

Касательно пример, есть импульс, есть сила с которой шарик притягивает к центру. Если нажать левую клавишу мыши в любом месте, шарик полетит в противоположную сторону, а затем его притянет к центру.
Записан
life Jumb
GM Pro user
*

Репутация: 251
Offline Offline

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« Ответ #13 : Апрель 11, 2016, 23:08:27 »

Ну и всё равно ты используешь переменную sp, которая и есть реальная скорость безотносительно времени. Это важный момент и его бы в шапке описать.
Там "sp" константой представлен (8)

Касательно пример, есть импульс, есть сила с которой шарик притягивает к центру. Если нажать левую клавишу мыши в любом месте, шарик полетит в противоположную сторону, а затем его притянет к центру.

Код:
x+=impuls_x*global.t
y+=impuls_y*global.t

impuls_x+=force_lol*global.t
impuls_y+=force_lol2*global.t
Записан

 
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #14 : Апрель 12, 2016, 08:48:49 »

Ну если sp представлен константой, то с записью
Код:
sp-=0.5*global.t //замедляющийся шарик
sp-= (sp*0.1) *global.t //экспоненциально замедляющийся шарик
чего-то не того.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 1.204 секунд. Запросов: 31.