| Alarm и его применение в столкновении | 
|  | 
| 
| Reker | Дата: Понедельник, 17 Июля 2017, 02:32 | Сообщение # 1 |  |   почетный гость Сейчас нет на сайте | Доброго времени суток. У меня есть проблема которую я не в состоянии решить уже давно. Так как я новичок и осваиваюсь в игростроении у меня возникла проблема. Я не могу сделать урон по промежуткам времени. Допустим в одну секунду hp-=10;. Расписываю я это так alarm [0] = room_speed;
 if hp <=0
 {
 room_restart()
 }
 в Alarm[0]
 hp-=10;
 Но как я понимаю таймер постоянно обновляется, так как я нахожусь непосредственно в объекте соприкосновения.
 К сожалению мой скудный умишка не может придумать ничего большего, кроме как написать без таймера меньшее значение hp-=0.5; . В гугле я искал и находил некоторые вещи, но не смог сделать всё правильно. Надеюсь поможете
 |  |  |  |  | 
| 
| ASH2 | Дата: Понедельник, 17 Июля 2017, 10:45 | Сообщение # 2 |  |   участник Сейчас нет на сайте | Немного не по теме, так как не пользуюсь Алярмами, но я б просто сделал бы в Step'e что-то типа 
 
 Код nTimer+=fps/room_speedif (nTimer>room_speed)
 {
 hp-=10;
 nTimer=0;
 }
 Карсон и Питееерс!!!
 
 
 Сообщение отредактировал ASH2 - Понедельник, 17 Июля 2017, 10:45 |  |  |  |  | 
| 
| Vuvk | Дата: Понедельник, 17 Июля 2017, 10:54 | Сообщение # 3 |  | заслуженный участник Сейчас нет на сайте | Мое знакомство с GM закончилось на 8 версии, но... При входе в столкновение проверять какую-то переменную:
 
 Код if (!canPlayerDamage)
 {
 alarm [0] = room_speed;
 canPlayerDamage = true;
 }
 
А при выходе из столкновения:
 
 Код canPlayerDamage = false;
 alarm[0] = -1;
 
ASH2, предпочтительней использовать будильники, сокращая количество вычислений в шаге. /* могу наврать, но по логике вещей оно так */
 
 
 Сообщение отредактировал Vuvk - Понедельник, 17 Июля 2017, 10:55 |  |  |  |  | 
| 
| Reker | Дата: Понедельник, 17 Июля 2017, 11:03 | Сообщение # 4 |  |   почетный гость Сейчас нет на сайте | Цитата ASH2 (  )  nTimer
 Что такое nTimer? У меня его нет. Или это переменная?
 |  |  |  |  | 
| 
| Vuvk | Дата: Понедельник, 17 Июля 2017, 11:09 | Сообщение # 5 |  | заслуженный участник Сейчас нет на сайте | Reker, это переменная-счетчик. Так он имитирует будильник. 
 Добавлено (17 июля 2017, 11:09)
 ---------------------------------------------
 И кстати тогда хотя бы так сделать:
 в Create
 
 Код nTimer = 0;
 delta = fps/room_speed;  // для сокращения количества постоянных расчетов
 
в Step
 
 Код nTimer += delta;
 if (nTimer >= room_speed)
 {
 hp -= 10;
 nTimer -= room_speed;  // для равномерного хода
 }
 
 
 Сообщение отредактировал Vuvk - Понедельник, 17 Июля 2017, 11:11 |  |  |  |  | 
| 
| ASH2 | Дата: Понедельник, 17 Июля 2017, 11:09 | Сообщение # 6 |  |   участник Сейчас нет на сайте | Vuvk, может быть, просто мне не очень эти будильники нравятся, привык всё кодом писать. И да, точно сказать не могу, но уменьшение количества вычислений в шаге сомнительно, так как он сам-то как-то должен свои будильники обсчитывать... (тут же ещё как бонус тут отстройка от небольшого проседания ФПС  ) 
 Reker, да, простая переменная счётчик, которую в Create ты инициализируешь нулём
 
 Vuvk, в Create delta = fps/room_speed; не пойдёт. fps постоянно меняющееся динамическое значение.
 
 Карсон и Питееерс!!!
 
 
 Сообщение отредактировал ASH2 - Понедельник, 17 Июля 2017, 11:11 |  |  |  |  | 
| 
| Vuvk | Дата: Понедельник, 17 Июля 2017, 11:11 | Сообщение # 7 |  | заслуженный участник Сейчас нет на сайте | Цитата ASH2 (  )  уменьшение количества вычислений в шаге сомнительно, так как он сам-то как-то должен свои будильники обсчитывать...Это уже внутренняя реализация гамака, которая однозначно быстрее будет работать скриптов, которые ты пишешь.
 
 Цитата ASH2 (  )  в Create delta = fps/room_speed; не пойдётну ОК. Но будильники всё равно кошерней
 
 
 Сообщение отредактировал Vuvk - Понедельник, 17 Июля 2017, 11:13 |  |  |  |  | 
| 
| ASH2 | Дата: Понедельник, 17 Июля 2017, 11:15 | Сообщение # 8 |  |   участник Сейчас нет на сайте | Vuvk, может быть, не тестировал, мне просто кажется, что так получается гибче, в смысле, на этот счётчик можно ещё какие-нибудь мигания привязать например или ещё что-то.. Но тут, согласен, индивидуально 
 Карсон и Питееерс!!!
 |  |  |  |  | 
| 
| Reker | Дата: Понедельник, 17 Июля 2017, 11:15 | Сообщение # 9 |  |   почетный гость Сейчас нет на сайте | Цитата Vuvk (  )  (!canPlayerDamageкакую именно переменную поставить? Если я ставлю hp то они сразу отнимаются, а если создаю новую переменную с названием dmd = 10 то ничего
 |  |  |  |  | 
| 
| Vuvk | Дата: Понедельник, 17 Июля 2017, 11:24 | Сообщение # 10 |  | заслуженный участник Сейчас нет на сайте | Чего куда поставить? У тебя в будильнике это должно остаться: 
 Цитата Reker (  )  в Alarm[0]
 hp-=10;
 
в Create
 canPlayerDamage = false;
 |  |  |  |  | 
| 
| Reker | Дата: Понедельник, 17 Июля 2017, 11:31 | Сообщение # 11 |  |   почетный гость Сейчас нет на сайте | всё сделал. Но никакого эффекта. При входе в объект переменная hp не убывает. Наверное я туплю в create
 hp =100;
 canPlayerDamage = false;
 
 в collision
 
 if (!canPlayerDamage)
 {
 alarm [0] = room_speed;
 canPlayerDamage = true;
 }
 canPlayerDamage = false;
 alarm[0] = -1;
 
 в Alarm[0]
 hp-=10;
 
 Я сделал так, но ничего
 
 
 Цитата Vuvk (  )  в Alarm[0]hp-=10;
 
 в Create
 canPlayerDamage = false;
 |  |  |  |  | 
| 
| Vuvk | Дата: Понедельник, 17 Июля 2017, 11:40 | Сообщение # 12 |  | заслуженный участник Сейчас нет на сайте | Сейчас поглядел что там в гамаке, а там нет разделения на collision_enter и collision_exit, так что если ты это запихнул в collision (при чем всё сразу) 
 Цитата Reker (  )  if (!canPlayerDamage){
 alarm [0] = room_speed;
 canPlayerDamage = true;
 }
 canPlayerDamage = false;
 alarm[0] = -1;
оно не будет работать, ахах.
 попробуй убрать туда же в таймер
 
 Код hp-=10;
 canPlayerDamage = false;
 alarm[0] = -1;
 
 
 |  |  |  |  | 
| 
| Reker | Дата: Понедельник, 17 Июля 2017, 11:42 | Сообщение # 13 |  |   почетный гость Сейчас нет на сайте | Vuvk, Спасибо большое. Получилось
 |  |  |  |  |