-
Notifications
You must be signed in to change notification settings - Fork 0
Events Flow (ru)
Events Flow - языковое расширение, которое разработано для создания конечных автоматов, описания "пути" приложения и автоматического подписания на события. Удобен для описания карты событий в играх и сложных интерфейсах.
##Аннотация
Events Flow аннотация будет доступна после импорта языка eventsFlow в контекстном меню метода "Intentions"(alt+enter) (Add Flow Annotation)
###[Flow]
Events Flow аннотация метода, которая указывает на то, что поток исполнения будет остановлен, пока не произойдёт событие(я).
[Flow]
public function eventsFlowTest() : void {
}###[Flow( result= result1[, result2 … resultN] )]
Расширенный синтаксис с указанием возможных результатов (подробности смотрите ниже);
[Flow(result=sucess,fail)]
public function eventsFlowTest() : void {
}##Работа с событиями
###catch dispatcher[.event]
Эта конструкция служит для того, чтобы остановить поток выполнения до того момента, пока не произойдет событие. После окончания произойдет автоматическая отписка от события. Возвращает тип события (event type).
Стоит обратить внимание что конструкция catch имеет ограничения: она может быть использована в цикле while…, но не может использоваться внутри цикла for….
[Flow]
public function eventsFlowTest() : void {
catch stage.event<KeyboardEvent.KEY_DOWN>;
trace "key down";
}###catch dispatcher[.keystroke< modifier, symbol >]
Данная конструкция позволяет отслеживать комбинации нажатых клавиш. Принимает два параметра: модификатор и символ. Доступные модификаторы: ctrl, alt, shift, ctrl+alt+shift, ctrl+alt, ctrl+shift, alt+shift.
[Flow]
public function eventsFlowTest() : void {
catch stage.keystroke<ctrl+shift, A>; // отлавливает нажатие комбинации клавиш Ctrl+Shift+A
trace "key down";
}###catch dispatcher.event..where(condition ( Event ) )
Синтаксис простого запроса для уточнения условий события.
[Flow]
public function eventsFlowTest() : void {
catch stage.event<KeyboardEvent.KEY_DOWN>.where{e => e.ctrlKey} // отслеживает нажание ctrl
}###event type
Специальный тип, предназначенный для описания подписки на событие, который возвращает выражение catch.
[Flow]
public function flow() : void {
// way 1
var e : event<KeyboardEvent.KEY_DOWN> = catch stage.event<KeyboardEvent.KEY_DOWN>;
if (e.ctrlKey) {
trace "e: " + e; // выводит информацию если нажата клавиша ctrl
}
// way 2 (НЕ рекомендуется, смотрите более компактный синтаксис ниже)
or {
var e1 : event<KeyboardEvent.KEY_DOWN> = catch stage.event<KeyboardEvent.KEY_DOWN>;
var e2 : event<MouseEvent.CLICK> = catch stage.event<MouseEvent.CLICK>;
}
if (e1 != null) {
// key down
}
if (e2 != null) {
// mouse click
}
// way 3 (рекомендуется)
or {
catch stage.event<KeyboardEvent.KEY_DOWN>{
trace event;
}
catch stage.event<MouseEvent.CLICK>{
trace event;
}
}
}##Условные переходы
###exit [ result ]
Останавливает выполнение потока и возвращает результат, если это возможно (смотрите расширенную Flow аннотацию). Может использоваться вместе с концепцией последовательности (подробнее ниже).
[Flow(result=success, fail)]
public function eventsFlowTest() : void {
exit success; // возвращает один из возможных вариантов
}###jump label
Условный переход к одному из обозначенных состояний. Ведет себя аналогично "goto".
jump start; // переход к состоянию start###state label
Обозначение состояния.
state start; // устанавливает метку состояния start##Составные слушатели событий
###and { … }
Выполняется, если все события произошли.
and {
catch stage.event<MouseEvent.MOUSE_UP>;
catch stage.event<KeyboardEvent.KEY_UP>;
}
trace "мышь и клавиша были нажаты";###not { … }
Выполняется, если ни одно из событий не произошло. Используется только в блоке composite(смотрите ниже).
not {
catch stage.event<MouseEvent.MOUSE_DOWN>;
catch stage.event<KeyboardEvent.KEY_DOWN>;
}
trace "мышь и клавиша не были нажаты";###or { … }
Выполняется, если одно из событий произошло.
or {
catch stage.event.<MouseEvent.CLICK> {
// TODO: some code here
}
catch stage.event.<MouseEvent.CLICK> {
// TODO: some code here
}
}###composite { … }
Обертка для группировки условных блоков составных событий.
composite {
and {
catch stage.event<MouseEvent.MOUSE_DOWN>;
catch stage.event<KeyboardEvent.KEY_DOWN>;
}
not {
catch stage.event<MouseEvent.MOUSE_UP>;
catch stage.event<KeyboardEvent.KEY_UP>;
}
}
trace "мышь и клавиша зажаты";##Time Concepts
###timeout time
Останавливает выполнение потока на указанное количество миллисекунд.
timeout 10000; // pause for 10 sec.###do … expire( time ) …
Устанавливает лимит на выполнение события или составного события.
do {
// ожидаем события
catch answerButton.event<MouseEvent.CLICK>
} expire (60000) {
// если истекло время, то сдаемся и выходим
exit giveup;
}##Chain Concepts
###result reference result<class.flowMethod>
Ссылка на результат flow метода, которая содержит все возможные значения из flow аннотации.
[Flow]
public function flow1() : void {
var result : result<+.flow2> = chain flow2();
switch (result) {
case result<+.flow2>.success :
// выводит "success" на success in flow2()
break;
}
}
/**
* метод имеет два возможных результата
*/
[Flow(result=success, fail)]
public function flow2() : void {
// some action here
} ###result type
Специальный тип для хранения результата flow метода.
[Flow]
public function simpleFlowMethod() : void {
var v : result<+.methodWithResult> = chain methodWithResult(); // получаем результат methodWithResult()
}
[Flow(result=success, fail)]
public function methodWithResult() : void {
exit success;
}###chain flowMethod
Операция, которая связывает несколько flow методов в "цепь" (т.е. ждет результат другого flow метода).
В примере операция cahin используется для получения результата метода flow2(). Стоит обратить внимание на то, что в методе flow1() используется переменная специального типа, которая была описана выше.
[Flow]
public function flow1() : void {
var result : result<Main.flow2> = chain flow2(); //ожидает success или fail
switch (result) {
case result<+.flow2>.success :
trace "success" // trace "success" on success in flow2()
break;
case result<+.flow2>.fail :
trace "fail"; // trace "fail" on fail in flow2()
break;
}
}
/**
* метод имеет два возможных результата
* success, когда клавиша нажата; fail, когда нажата мышь.
*/
[Flow(result=success, fail)]
public function flow2() : void {
or {
catch stage.event<KeyboardEvent.KEY_DOWN>{
exit success; // это значение будет получено в методе flow1()
}
catch stage.event<MouseEvent.MOUSE_DOWN>{
exit fail; // это значение будет получено в методе flow1()
}
}
}