Machine

Материал из wiki.appsalutecreator.com
Перейти к: навигация, поиск

Машина состояний (state machine) позволяет описывать сложное поведение игровых объектов. Для машин с типовым набором состояний и поведений вводятся отдельные типы объектов. Например, кнопка, по своей сути, является машиной состояний.

Логика поведения машины разбивается на отдельные узлы (состояния). Машина всегда находится строго в одном состоянии. Переход из одного состояния в другое происходит либо в результате внешнего воздействия на машину, либо в результате окончания некоторых процессов протекающих внутри неё


Введение

Рассмотрим пример простой машины состояний. Пусть объект (лампочка) находится в состоянии "off". При клике на него мышкой, он переходит в состояние "on", в котором находится 3000 ms, через которые возвращается в состояние "off". В каждом состоянии рисуется своя картинка.

Для создания такой машины, в редакторе, в панеле свойств необходимо выбрать тип объекта "machine", после чего нажать на многоточие в последнем свойстве "states". Появится окно редактирования свойств машины:

On off prop.png

Нажав дважды кнопку "Добавить состояние", мы получим два списка со свойствами этих состояний. Зададим им имена, редактируя первое поля "имя". Далее, на имени первого состояния нажимаем правую кнопку мыши, и из списка команд выбираем первую - "draw". Она появится в списке свойств данного состояния. Кликнув на многоточие в поле ввода "draw", получим ещё одно окно со списком возможных параметров этой команды. Помечая галочкой параметр "res", и нажимая кнопку "Ok", мы увидим его в окне свойств состояния. Действуя аналогичным образом, формируем окно описания состояний в следующем виде:

On off.png

То, что у нас получилось, можно изобразить в виде следующего графа машины состояний:

On off st.png

Кружки обозначают состояния (у нас их два). Стрелки - переходы между состояниями. Нижняя стрелка - это переход в результате внешнего воздействия (клика мышкой на машину). В окне редактирования состояний это воздействие описывается командой click с единственным параметром go, обозначающим в какое состояние необходимо перейти. Верхняя стрелка - переход в результате процессов внутри состояния on. В данном случае, процесс один - wait. Начав работать, эта команда ждет время t=3000 миллисекунд (3 секунды), а затем выполняет обратный переход в соответствии с параметром go="off".

В каждом состоянии рисуются различные картинки для отображения машины. Этим заведуют команды draw, в единственный параметр которых res, перетаскивается соответствующая картинка из редактора ресурсов.

Машина состояний всегда начинает функционировать в каком-то определенном состоянии. По умолчанию им является первое состояние в редакторе состояний. Можно его переопределить, задав стартовое состояние в общих свойствах объекта (поле state).

В дальнейшем, чтобы не приводить скриншоты редактора состояний, мы будем описывать их при помощи списка команд и их параметров. Так, машина, созданная выше, будет иметь следующее описание:

st = "off"                           // состояние выключенной лампочки
{
   draw  { res="lamp_off"        }   // рисовать картинку выключенной лампы
   click { go="on"               }   // при клике - идем в состояние "on"
}

st = "on"                            // состояние включенной лампочки
{
   draw  { res="lamp_on"          }  // рисовать картинку включенной лампы
   wait  { t=3000        go="off" }  // через 3 секунды возвращаемся в "off"
}

Фигурные скобки { ... } после имени команд ограничивают список параметров команды. Состояние, начинающееся с записи st="имя состояния", ограничивает фигурными скобками все команды этого состояния. После двух слешей идет пояснение (комментарий).

Общие принципы

Любая машина состояний может быть изображена в виде графа с кружочками и стрелками. Настоятельно рекомендуется рисовать такие графы в процессе проектирования машины, а лишь затем переходить к их описанию в окне редактора состояний. У машины всегда активно строго одно состояние (ниже это изображено на левом рисунке темным кружком):

Файл:Def states.png.png

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

Выше на правом рисунке изображено некоторое состояние. При входе в него, происходит инициализация состояния. Если на объект оказываются внешние воздействия, то он может покинуть состояние. Наконец, внутри состояния могут работать различные процессы. Таким образом, все команды, которые мы задаем, при описании данного состояния, разбиваются на три группы:

  • Инициализации:
    • draw - установка графического ресурса
    • init - инициализация параметров машины (координаты и т.п.)
    • set - установка состояния другого объекта
  • Процессов:
    • wait - задержка по времени
    • move - движение
    • alpha - изменение прозрачности
    • scale - изменение размера
    • rot - вращение вокруг точки пивота
    • phys - движение в силовом поле.
  • Воздействия:
    • click - что делать при клике на машине
    • over - над машиной находится мышь
    • drop - на машине отпущена клавиша мыши
    • drag - машину схватили и тащат
    • throw - машину схватили и кинули
    • apply - сработает при пересечении машины с линией или объектом