
Матрица преобразований для гуманитариев
Сегодня передо мной стала задача сделать интересную задачу в рамках работы над игрой Fishao(игра в стадии разработки) — поворот лодки с персонажем внутри с использованием имеющейся графики. Персонаж может ходить по лодке и находится в любом месте — в центре, у левого борта и т.п., и, соответственно, при повороте лодки персонаж должен остаться в той же части («на том же месте») относительно лодки:

Да, для этого понадобится использовать матрицу преобразований. Но как её получить? Оказывается есть безумно простой метод. Первым делом нужно создать шаблонный MovieClip в Flash IDE:
1. Создаем шаблонный спрайт (можно даже простой прямоугольник — большой роли это не играет). Я дал имя этому экземпляру «map».
2. Преобразуем, подгоняя его для каждого варианта поворот лодки:

Далее, все что нам нужно — это считать матрицу преобразований этого спрайта! Вот и весь фокус:
В демонстрации я выбрал «случайную» точку — у носа лодки, и при повороте видно, что это относительное положение сохраняется. Вот как это в результате работает:

Да, для этого понадобится использовать матрицу преобразований. Но как её получить? Оказывается есть безумно простой метод. Первым делом нужно создать шаблонный MovieClip в Flash IDE:
1. Создаем шаблонный спрайт (можно даже простой прямоугольник — большой роли это не играет). Я дал имя этому экземпляру «map».
2. Преобразуем, подгоняя его для каждого варианта поворот лодки:

Далее, все что нам нужно — это считать матрицу преобразований этого спрайта! Вот и весь фокус:
var map:DisplayObject = _boatAsset.getChildByName("map");
var transformMatrix:Matrix = map.transform.matrix;
var transformedPoint:Point = transformMatrix.transformPoint(_targetPoint);
В демонстрации я выбрал «случайную» точку — у носа лодки, и при повороте видно, что это относительное положение сохраняется. Вот как это в результате работает:
- +6
- Regul
Комментарии (8)
Задача совершенно не понятна. Чтобы поставить персонажа в центр лодки надо передать координаты центра лодки для каждого кадра, а матрица ему зачем? ) Может зачем-то и нужна, но не видя персонажа нет понимания зачем.
Можно предположить что конкретному количеству положений лодки соответствует такое же количество кадров нескольких персонажей. Если это действительно так то просто в центре лодки ставится плейсхолдер к которому мы крепим нужного персонажа (или же получаем его координаты для нужного кадра и крепим отдельно в эти координаты, вариантов море) и переключаем его вид на тот же кадр что и у лодки, чтобы он повернулся в ту же сторону.
Итого:
1. непонятно зачем вообще здесь нужна матрица, если все делается намного проще и в плане кода и в плане работы в редакторе.
2. непонятно почему в демонстрационном клипе в центре лодки не видно персонажа, более того, даже центр не указан.
2. В демонстрации я выбрал «случайную» точку — у носа лодки, и при повороте видно, что это относительное положение сохраняется