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

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

Репутация: 219
Online Online

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


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
Ветеран форума
*****

Репутация: 219
Online Online

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


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.

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

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