Почему хитбокс моего спрайта не вращается? Как это исправить? - PullRequest
2 голосов
/ 20 февраля 2011

У меня квадратный спрайт.Я поворачиваю его на 45 градусов.Теперь я хочу проверить, сталкивается ли он с другим объектом, но хитбокс не наклонился, поэтому он регистрирует попадание, даже когда объекты не соприкасаются.

Хотя это не правильный путьположить его;квадратный вид становится ромбом (одна из его точек указывает вниз), в то время как хитбокс остается квадратом (как если бы это был куб, лежащий на столе).

var square:Sprite = new Squaresprite(); // a simple sprite formed like a square
square.rotation = 45;
Stage.addChild(square);
square.hitTestObject(someOtherSprite); // can return true even if the sprites don't visibly seem to be touching

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

Есть ли простое решение для этого, которое не требует, чтобы я перерисовывал свой Sprite в повернутой позиции?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Почему бы не упростить его и просто использовать уже проверенный и продуманный класс Collision Detection?Примерно так: http://evolve.reintroducing.com/2008/10/29/as3/as3-collision-detection-kit/

В основном все сводится к тому, что Flash думает, что ваш hitTest или hitTestPoint находится в ограничительной рамке мувиклипа / спрайта, независимо от поворота.Истинное обнаружение столкновений выходит за рамки этого (с такими классами).

0 голосов
/ 21 февраля 2011

hitTestObject работает с ограничивающими прямоугольниками объекта (вы можете получить их с помощью getBounds).Однако вы можете использовать hitTestPoint и установить для 3-го параметра значение true (shapeFlag), чтобы указать Flash использовать фактическую форму объекта DisplayObject (включая преобразования), но, как вы можете догадаться, он проверяет их только на соответствиеодна точка.

Если вам нужно проверить только квадраты, вы можете сделать это для каждого угла каждого квадрата.Для двух блоков потребуется всего 8 тестов (что не займет много времени процессора), но при слишком большом количестве блоков вы можете захотеть отфильтровать возможные попадания с помощью hitTestObject или других методов (сетки и т. Д.).

Для более сложных фигур вам понадобятся гораздо более сложные вычисления и / или методы, и в этом случае я бы определенно согласился с ответом jpea;)

0 голосов
/ 20 февраля 2011

Похоже, что в тесте на попадание используется ограничивающая ось ограничивающего прямоугольника объекта, который будет таким, как вы описали.Это сравнительно быстрый тест, поскольку математика относительно проста - значения x и y лежат в целевом диапазоне.

Вам нужно будет сделать свой код более "интеллектуальным".

Используйте ограничивающую рамку в качестве первого приближения тест да / нет.Если ограничивающий прямоугольник не взаимодействует с целью, то вы можете быть уверены, что объект не будет, поэтому вы можете сразу же отказаться от этой цели.Если ограничивающий прямоугольник действительно взаимодействует, вам необходимо выполнить несколько более сложных тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...