RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1 2 3 4   Вниз
  Печать  
Маленькие хитрости GML
0 Пользователей и 1 Гость смотрят эту тему.
tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

04 Апреля 2011 в 01:07
Контроль успешности загрузки сохраненной игры.
В чем проблема контроля: даже если файл существует, он может оказаться неверного формата и не загрузиться.
Снимаем галочку "F5 сохраняет, F6 грузит".
Создадём объект controller.
Alarm[0]:
show_message('Игра загружена')
Alarm[1]:
show_message('Игра не загружена')
press F5 key:
var fname; fname=get_save_filename('Любые файлы|*.*','');
if fname!=''{
  alarm[0]=1;
  game_save(fname);
  alarm[0]=-1;
}
press F6 key:
var fname; fname=get_open_filename('Любые файлы|*.*','');
if fname!=''{
  alarm[1]=1;
  game_load(fname);
}
Кстати, alarm[0] может также:
  • вызвать d3d_start() или d3d_end(). Тогда в одной и той же игре можно безопасно смешивать режимы 3d и 2d (для разных объектов-контроллеров, понятно): загрузка игры восстановит тот режим, который был в момент сохранения;
  • запускать подходящую фоновую музыку;
  • уменьшать игровой счет score, делая невыгодным частое сохранение игры;
  • etc

Различение загрузки и перезагрузки игры.
Когда игра выполняет Game Restart, часть игровых данных сбрасывается (например, удаляются сохраненные данные всех неактивных, но когда-либо активированных персистентных комнат), но часть данных: модифицированные ресурсы, структуры данных, системы частиц и модели не сбрасываются.
Конечно, можно это всё удалять в событии Game End, а потом в Game Start пересоздать, но это же время.
В Game Maker 6 я использовал функцию window_get_visible() в Game Start: если она возвращает true, то перезагрузка, если false, то загрузка.
К сожалению, в Game Maker 7 и 8 окно показывается даже до фрагментов кода создания объектов начальной комнаты, и ничего тут не сделать.
Приходится использовать менее изящные способы, например:
if sprite_exists(sprite0){
  sprite_delete(sprite0);
  // тут загрузка
}
else{
  // тут перезагрузка
}
Возможно, другие участники посоветуют более изящное решение.
Различение Escape и Close Button в Game Maker 6.
Начиная с Game Maker 7 появилась возможность обрабатывать нажатие клавиши Escape и закрытие окна игры независимо.
Но как быть тем, кто по каким-либо причинам (скорее всего, религиозным) продолжает использовать Game Maker 6?
При нажатии кнопки закрытия окна (или Alt+F4) имитирует клавиатурное сообщение Escape, но клавиша на самом деле не нажимается.
Флаг escape в примере как раз включается, если событие <Escape> было вызвано нажатием клавиши, а не чем-то ещё.
Create:
escape=0;
release <Escape>:
escape=0;
<Escape>:
if !escape{
  escape=keyboard_check_pressed(vk_escape);
  if !escape{
    keyboard_key_release(vk_escape);
    if show_question('Are you sure?')
      game_end();
  }
}

Назначить направление и скорость движения созданному объекту.
При этом желательно, чтобы это произошло до события Create.
Способ 1. Использовать действие Create object with motion.
Способ 2.
with instance_create(x,y,object) motion_set(direction,speed);
Всё здорово, но вот только движение задаётся уже после события Create.
Способ 3.
action_create_object_motion(object,x,y,speed,direction);
Фактически равнозначно способу 1 (собственно, это и есть функция, вызываемая этим действием).
Способ 4. Создать объект-пустышку, без обработчиков событий и т.д., установить ему нужные параметры движения, а затем преобразовать в нужный объект.
var inst;
inst=instance_create(x,y,obj_empty);
with inst{
  motion_set(тут направление, тут скорость);
  instance_change(object,1);
}

Временно перейти в другую комнату, затем вернуться в прежнюю и чтобы там ничего не поменялось.
Сто раз видел, что для этой цели используют глобальную переменную вроде global.room_return и room_goto(global.room_return). А вдруг нам в той комнате понадобится перейти в третью (опять же, с возвратом во вторую), затем в четвёртую и т.д.?
Будучи противником использования глобальных переменных вообще, изобрёл следующую технику:
1) Создаётся специальный объект-шаттл, в событии Create имеется текст:
{
  room_persistent=true;
  room_goto(room_put_here_roomid);
}
Далее, Room Start:
{
  if(room=room_put_here_roomid){
    // инициализируем вторую комнату
    // используя подготовленные параметры
  }
  else{
    // всё, вернулись, мавр больше не нужен
    // главное гостинцы сохранить
    room_persistent=false;
    instance_destroy();
  }
}
Наконец, Room End:
{
  if(room==room_put_here_roomid){
    // тут мы покидаем вторую комнату, можно набрать гостинцев
  }
  else{
    // тут мы может подготовить параметры для комнаты, в которую переходим
    room_return = room;
  }
}
2) Для перехода в комнату 2 используем instance_create(x,y,obj_shuttle), причем, через x и y можно передавать дополнительные параметры.
3) Для возврата используем room_goto(obj_shuttle.room_return);
Думаю, легко догадаться, как расширить схему на вложенные переходы к комнатам.
Использование констант.
Значение константы вычисляется в момент запуска игры, когда еще не спряталось окно загрузки, но до того, как будут обработаны скрипты. Таким образом можно создавать типы и системы частиц, подключать dll, создавать и грузить модели. Жаль, но нельзя вызывать скрипты и менять порядок определения констант, если, конечно, не пользоваться сторонними программами.
P.S. Как выяснилось, системы частиц создавать как раз нежелательно.
Полоска здоровья от красного к зеленому.
Synopsys. Можно нарисовать полоску здоровья от красного к зеленому вызовом вроде:
draw_healthbar(x1,y1,x2,y2,health,c_black,c_red,c_lime,0,1,1);
Проблема в том, что она выглядит совсем не так, как нарисованная стандартным действием. Решение таково — мешать цвета самостоятельно:
//вначале от желтого к зеленому, затем от красного к желтому
var color;
if health>=50
  color=merge_color(c_yellow,c_lime,min((health-50)/50,1));
else
  color=merge_color(c_red,c_yellow,max(health/50,0));
draw_healthbar(x1,y1,x2,y2,health,c_black,color,color,0,1,1);

Последнее редактирование: 17 Ноября 2012 в 15:02 от tolich

 
tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 61 21 Января 2019 в 12:44
var i=5,j=5;
i = ++i+ ++i;
show_debug_message(i);
show_debug_message(++j+ ++j);
И GMS1 и GMS2 выводят два раза 13.

tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 62 07 Марта 2019 в 01:18
Пока студия не обзавелась встроенными конструкторами массивов, можно пользоваться доморощенными.
Немного изменил определения:
#define array
var args=array_create(argument_count),i=0;
repeat argument_count { args[i]=argument[i]; ++i; }
return args;

#define array2
var args=array_create(0),i=0;
repeat argument_count{
  var arg=argument[i];
  var len=array_length_1d(arg);
  if(len>0)
    repeat len{
      --len; args[i,len]=arg[len];
    }
  else
    args[i,0]=arg;
  ++i;
}
return args;
Причина: возвращать undefined вместо массива не комильфо. Но я просто раньше не знал про array_create.
Edit: исправил ошибку в array2, которая приводила к копированию всех параметров в одну строку (был опущен ++i).
Последнее редактирование: 08 Марта 2019 в 02:17 от tolich

tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 63 18 Марта 2019 в 01:22
Известно, что переходы (transition_kind) не работают в GMS.

Что, в самом деле?

Попробуйте запустить этот проект и понажимать 0-9 и A-Z.

Вся разница: вместо transition_kind и transition_steps надо писать transition.kind и transition.steps.

* transition.gmz (1599.96 Кб - загружено 49 раз.)
Прикреплённые файлы
* transition.gmz (1599.96 Кб - загружено 49 раз.)

tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 64 20 Марта 2019 в 10:45
"загружено 0 раз"
1) Непонятно, о чём речь.
2) Все и так это знают.
3) Всем пофиг.

input.txt
Не очень
Активный участник
**

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

Сообщений: 161


stdin

Ответ № 65 20 Марта 2019 в 20:44
3) Всем пофиг.
> this
кто все?! к кому ты обращаешься? мы тут вдвоем сидим!

Сначала подумал, что в студии осталась эта недокументированная фича. А тут такая-то черная магия с сурфейсами...
Очень полезная штука, в частности в деле портирования старых проектов на ГМС.
На самом деле, я транзишонами и в ГМ8 не особо пользовался. Хотя наверно есть смысл, особенно если делать свои.

Кстати, я правильно понимаю, что во время перехода события шага для остальных объектов тоже выполняются? И зачем там нужен room_speed *= 10?
tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 66 21 Марта 2019 в 00:09
>> Хотя наверно есть смысл, особенно если делать свои.
Портировано, кстати, с GM6 исходника. Только там было не через поверхности, а тупо через бэкграунды. Потому что мне нужны было свои переходы. Interlaced я тогда не сделал, вместо них были Create от угла.

>> во время перехода события шага для остальных объектов тоже выполняются?
Они все дезактивированы, так что нет. Но если бы не были, то выполнялись бы.

>> зачем там нужен room_speed *= 10?
Там ещё и room_speed /= 10 есть. =)
Скорость комнаты на время перехода увеличивается, чтобы переход проходил быстрее. Но это не идеально: скорость перехода будет зависеть от скорости исходной комнаты. Со скоростью комнаты 30 переход в 80 шагов длится 2.6(6) секунды — слишком медленно. Со скоростью 300 0.26(6) секунды — слишком быстро.
Можно, например, сохранить скорость комнаты, установить скорость 100 (для шага 10 миллисекунд), а в аларме восстановить. Со скоростью 100 переход в 80 шагов будет длиться 0.8 секунды — наверное, идеальный вариант.

Илья
Ветеран форума
*****

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

Сообщений: 1 572

Ответ № 67 04 Апреля 2019 в 20:18
кто все?! к кому ты обращаешься? мы тут вдвоем сидим!
Так пишите в дискорд жмакерса, а то там тишь да гладь. https://discord.gg/2T3ttt

Портировано, кстати, с GM6 исходника.
Чисто из интереса - ГМ6 нормально работает

tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 68 04 Апреля 2019 в 20:52
Чисто из интереса - ГМ6 нормально работает
На случай, если в конце этого предложения пропущен знак вопроса: на виртуалке Windows XP — нормально. Для Windows 7 — 10 нужно вместо запуска игры экспортировать exe, затем конвертировать утилиткой. Отладка, понятно, вообще не работает.

tolich
to ne lich
Ветеран форума
*****

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

Сообщений: 1 568


moonlite

Ответ № 69 05 Апреля 2019 в 17:02
Да, ещё в редакторе объектов вкладки действий почему-то без заголовков. И в 5.3 без заголовков, а в 5.0 нормально.

Страниц: 1 2 3 4   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2019
Счётчик–@Mail.ru