Матрица преобразований для гуманитариев

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


Да, для этого понадобится использовать матрицу преобразований. Но как её получить? Оказывается есть безумно простой метод. Первым делом нужно создать шаблонный MovieClip в Flash IDE:

1. Создаем шаблонный спрайт (можно даже простой прямоугольник — большой роли это не играет). Я дал имя этому экземпляру «map».

2. Преобразуем, подгоняя его для каждого варианта поворот лодки:

Далее, все что нам нужно — это считать матрицу преобразований этого спрайта! Вот и весь фокус:


var map:DisplayObject = _boatAsset.getChildByName("map");
var transformMatrix:Matrix = map.transform.matrix;
var transformedPoint:Point = transformMatrix.transformPoint(_targetPoint);


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

Ссылка на исходник:
https://github.com/Regul777/transformation_matrix

Оригинал статьи.
  • +6

Комментарии (8)

0
Урлы картинок неверны.

Задача совершенно не понятна. Чтобы поставить персонажа в центр лодки надо передать координаты центра лодки для каждого кадра, а матрица ему зачем? ) Может зачем-то и нужна, но не видя персонажа нет понимания зачем.
Можно предположить что конкретному количеству положений лодки соответствует такое же количество кадров нескольких персонажей. Если это действительно так то просто в центре лодки ставится плейсхолдер к которому мы крепим нужного персонажа (или же получаем его координаты для нужного кадра и крепим отдельно в эти координаты, вариантов море) и переключаем его вид на тот же кадр что и у лодки, чтобы он повернулся в ту же сторону.

Итого:
1. непонятно зачем вообще здесь нужна матрица, если все делается намного проще и в плане кода и в плане работы в редакторе.
2. непонятно почему в демонстрационном клипе в центре лодки не видно персонажа, более того, даже центр не указан.
0
Персонаж может ходить по лодке и находится в любом месте — в центре, у левого борта и т.п. И, соответственно, при повороте лодки персонаж должен остаться в той же части относительно лодки.
0
1. Персонаж может ходить по лодке и находится в любом месте — в центре, у левого борта и т.п. И, соответственно, при повороте лодки персонаж должен остаться в той же части относительно лодки.
2. В демонстрации я выбрал «случайную» точку — у носа лодки, и при повороте видно, что это относительное положение сохраняется
0
урлы поправил
0
ага, теперь понятно. Думаю это стоит упомянуть в статье. И в ролике было бы хорошо это увидеть, а то я этот розовый кружок и драгать пробовал и стрелками перемещать — все без толку
0
Спасибо за замечание — добавил эти уточнения в статью.
0
Спасибо, пригодится!
0
Хороший ход — я вот всегда думал зачем transformPoint а тут практический пример!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.