Движение машин: жучки, ключи и многое другое — различия между версиями
Steps (обсуждение | вклад) (→Как открыть замок ключом) |
Steps (обсуждение | вклад) (→Как открыть замок ключом) |
||
Строка 128: | Строка 128: | ||
[[файл:lesson_5_kareta1.png]] | [[файл:lesson_5_kareta1.png]] | ||
− | + | == Как открыть замок ключом == | |
В адвентюрных играх часто используется прием применения предметов. | В адвентюрных играх часто используется прием применения предметов. | ||
При этом один предмет мышкой перетаскивается на другой, в результате | При этом один предмет мышкой перетаскивается на другой, в результате | ||
чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.) | чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.) | ||
+ | |||
+ | === Постановка задачи === | ||
Рассмотрим простой пример подобного взаимодействия объектов. | Рассмотрим простой пример подобного взаимодействия объектов. | ||
Строка 151: | Строка 153: | ||
* из-под саквояжа начинает вверх бежать жук; | * из-под саквояжа начинает вверх бежать жук; | ||
* когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж. | * когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж. | ||
+ | |||
+ | === Ключ === | ||
Запрограммируем сначала машину для ключа: | Запрограммируем сначала машину для ключа: | ||
Строка 161: | Строка 165: | ||
* '''open''' - открываем саквояж и уменьшаемся до 0 | * '''open''' - открываем саквояж и уменьшаемся до 0 | ||
* '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране | * '''back''' - восстанавливаем размер и возвращаемся в исходное положение на экране | ||
+ | |||
+ | Второе состояние состояние '''open''' не должно вызвать особых затруднений. | ||
+ | В команде '''set''' меняется состояние объекта '''bag''' (саквояж) на open. | ||
+ | В этот момент саквояж должен изобразить своё открытие. | ||
+ | В команде процессов '''scale''' происходит происходит уменьшение масштаба рисования | ||
+ | ключа (его размера) до ''целевых значений'' tx, ty которые выбраны близкими к нулю | ||
+ | за время t=500 миллисекунд, после чего ключ переходит в третье состояние back. | ||
+ | |||
+ | В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1 | ||
+ | по ширине и высоте. | ||
+ | Кроме этого появилась новая команда '''init'''. Это команда инициализации | ||
+ | или переустановки свойств данной машины. В нашем случае, мы меняем её координаты | ||
+ | на значения x=0 и y=250 пикселей. Как и команда '''set''', команда '''init''' выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции. | ||
+ | Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250, | ||
+ | чтобы туда в дальнейшем он и возвращался. | ||
+ | |||
+ | Разберемся теперь с системой координат на сцене. | ||
+ | |||
+ | === Координаты на сцене === | ||
[[файл:lesson_5_key2.png|600px]] | [[файл:lesson_5_key2.png|600px]] | ||
+ | |||
+ | === Саквояж и жук === | ||
== Упражнения == | == Упражнения == |
Версия 14:29, 16 января 2013
Урок 4 << | Оглавление | >> Урок 6 |
---|
Цель: изучить процессы движения и способы взаимодействия машин.
Задачи:
- реализовать разными методами "ход конем";
- организовать циклическое движение по квадрату;
- рассмотреть различные способы движения по окружности;
- научиться согласовывать поступательное и вращательное движение;
- рассмотреть способ применения одного предмета на другой.
Содержание
Процессы и движение
До сих пор мы ограничивались только одной командой процессов - wait (ожидание). В этом уроке мы рассмотрим другие процессы. Существуют следующие команды движения (изменения объекта):
- move - движение по прямой
- rot - вращение
- scale - изменение размера
- alpha - изменение прозрачности
- phys - движение в силовом поле.
В каждой команде достаточно много параметров. Например, можно сдвинуться (move) по горизонтали на dx пикселей за время t. Вместо времени можно указать скорость v в пикселях в секунду. Можно двигаться в определенную целевую точку с координатами (tx, ty) и т.д.
Ход конем
Рассмотрим простой пример в котором объект движется сначала вверх на 100 пикселей, а затем вправо на 200. В качестве такого объекта будем использовать ladybug (божья коровка или для краткости жучок), картинку которой можно найти в редакторе ресурсов в папке этого урока. Как обычно, перетаскиваем её на сцену, переименовываем и превращаем в машину состояний. Организуем сначала движние нашего жучка при помощи трёх состояний:
Первое, стартовое состояние является запускающим. Если кликнуть на жучка, то он начнет своё движение. Когда перемещение по вертикали заканчивается (состояние up), жучок переходит в третье состояние (right), в котором движется вправо. Закончив движение, он возвращается в стартовое состояние и ждет очередного клика.
Координатная ось Y (вертикальная) на сцене направлена вниз, а ось X (горизонтальная) -- вправо. Поэтому, чтобы жучок начал двигаться вверх, его смещение должно быть отрицательным. В нашем случае это dy=-100. Эти 100 пикселей объект должен пройти за одну секунду (t=1000). В конце выполнения команды move происходит переход в следующее состояние, имя которого задается в поле "go".
При движении вправо, происходит смещение на 200 пикселей. Чтобы скорость движения вверх и вправо была постоянной, необходимо соответственно увеличить время движения (t=2000).
Точно такое же движение можно организовать в рамках одного, а не двух состояний. Поместите на сцену еще одного жучка, дайте ему другое имя и задайте следующую машину состояний:
Команды move в состоянии way выполняются последовательно. Сначала отрабатывает нулевой move, а затем первый.
Протестируйте получившийся результат. Оба жучка должны двигаться одинаковым образом. Не забывайте при тестировании включать отладочную информацию о текущих состояниях.
Последовательно и параллельно
И так, в рамках данного состояния все команды процессов с одинаковым названием выполняются последовательно. При этом команды с разными именами выполняются параллельно.
Пусть в состянии есть несколько команд move и несколько команд rot (вращения):
- move0 move1 rot0 move2 rot1 rot2
Независимо от их чередования, они выстраиваются в параллельные списки процессов:
- move0 rot0
- move1 rot1
- move2 rot2
Эти списки начинают одновременно выполняться сверху вниз: отрабатывают команды move и одновременно с ними комананды rot.
Заставим нашего жучка при совершении хода конем поворачиваться на 360 градусов. Для этого поместим третью машину со следующими состояниями:
Запустите проект во вьювере. Одновременно с выполнением двух команд move будет выполняться одна команда rot. Время выполнения rot равно суммарному времени двух команд move (3000=1000+2000). В результате, к концу движения, жучок поворачивается на 360 градусов.
Переход в следующее состояние go в данном случае можно было бы поставить не в команду rot, а в последнюю команду move. Однако приведенное решение лучше, так как гарантирует, что переход произойдет только, когда жучок полностью развернется. Хотя суммарное время move совпадает с временем rot, реальное компьютерное время выполнения этих команд может немного отличаться. В результате, если выйти из состояния по окончанию движения, можно получить не до конца развернувшегося жучка.
Циклическое движение
С командами движения, также как и с командой ожидания, можно использовать циклы. Например, заставим (уже четвертого) жучка при клики два раз оббегать стороны квадрата. Это можно сделать при помощи следующей машины:
Четыре команды move выполняются одна за одной. Затем вьювер натыкается на параметр loop=1 и еще раз выполняет это движение с самого начала. Последняя команда move служит для перехода в стартовое состояние ожидания клика.
Заметим, что нельзя было для перехода использовать wait. Она, как и остальные команды процессов, запустилась бы параллельно с командами и сработала бы сразу. В результате ни какого движения не получилось бы!
Если параметр loop=-1, то движение будет бесконечным. Этого же можно было добиться, поставив вместо loop=-1 параметр go с переходом в это же состояние (перезапустить состояние).
Кроме команды зацикливания данного процесса, можно из одних команд запускать другие (начинать процессы другого типа). Например, пусть жучок движется вправо в течении 1 секунды и вращается 2 секунды. Команда move закончится раньше команды rot. Пусть затем, закончив полный оборот (на уже остановившемся объекте), он начинает снова двигаться вправо. Реализуется это так:
Вращение вокруг пивота
Взаимодействие машин
Как ездят кареты
Как открыть замок ключом
В адвентюрных играх часто используется прием применения предметов. При этом один предмет мышкой перетаскивается на другой, в результате чего происходят некоторые изменения (открывается дверь, зажигается огонь и т.п.)
Постановка задачи
Рассмотрим простой пример подобного взаимодействия объектов. Создайте новый экран и сцену на нём, так как предыдущий экран должен быть уже забит различными насекомыми. Перетащите на сцену из редактора ресурсов очередного жука, саквояж и ключ. Лучше их перетаскивать именно в таком порядке. Если порядок получился другой, мышкой в дереве проекта упорядочите эти объекты, так чтобы последовательность рисования была: жук, затем саквояж, затем ключ. Расположите эти объекты примерно в центре сцены и сделайте их машинами состояний.
Наша задача состоит в организации взаимодействия ключа, саквояжа и жука при котором, работают такие правила:
- если схватить ключ мышкой, он будет таскаться по сцене в определенных границах;
- если отпустить ключ над саквояжем, саквояж должен "растаять", уменьшив свою прозрачность, а ключ уменьшиться в размерах, сжавшись в точку;
- из-под саквояжа начинает вверх бежать жук;
- когда жук заканчивает движение, саквояж появляется на своем месте, ключ также появляется на исходном месте, увеличившись из точки до начального размера, а жук исчезает, спрятавшись под саквояж.
Ключ
Запрограммируем сначала машину для ключа:
Три состояния соответствуют трём режимам функционирования ключа:
- drag - в этом, стартовом состоянии мы таскаем ключ по экрану
- open - открываем саквояж и уменьшаемся до 0
- back - восстанавливаем размер и возвращаемся в исходное положение на экране
Второе состояние состояние open не должно вызвать особых затруднений. В команде set меняется состояние объекта bag (саквояж) на open. В этот момент саквояж должен изобразить своё открытие. В команде процессов scale происходит происходит уменьшение масштаба рисования ключа (его размера) до целевых значений tx, ty которые выбраны близкими к нулю за время t=500 миллисекунд, после чего ключ переходит в третье состояние back.
В состоянии back он снова меняет свой масштаб, но уже к исходному значению 1 по ширине и высоте. Кроме этого появилась новая команда init. Это команда инициализации или переустановки свойств данной машины. В нашем случае, мы меняем её координаты на значения x=0 и y=250 пикселей. Как и команда set, команда init выполняется сразу при входе в состояние, поэтому ключ начнет увеличиваться уже с исходной позиции. Желательно, на сцене ему сразу задать в свойствах положение x=0, y=250, чтобы туда в дальнейшем он и возвращался.
Разберемся теперь с системой координат на сцене.
Координаты на сцене
Саквояж и жук
Упражнения
- при открытии саквояжа сделайте так, чтобы за время 1 секунда саквояж уменьшился от первоначальных размеров до 0, а затем увеличился до 1 (первоначальных размеров);
- организуйте, чтобы при перетаскивании ключа в область саквояжа, жук развернулся на 180 градусов и двигался вниз, обратно под саквояж.
Урок 4 << | Оглавление | >> Урок 6 |
---|