Actionscript 3 пикселя идеальное столкновение.Как?(учебные цели) - PullRequest
1 голос
/ 07 июля 2010

Я знаю, что есть люди, создающие классы для этого (то есть http://coreyoneil.com/portfolio/index.php?project=5). Но я хочу научиться делать это сам, чтобы я мог создавать все, что мне нужно, так, как мне нужно.

Я читал о BitMap и BitMapData. Я должен быть в состоянии вытащить мувиклипы на битовую карту, чтобы потом можно было циклически перемещать пиксели в поисках коллизий. Тем не менее, это странно и запутанно иметь дело со смещениями ... И это похоже на то, что MyBitMap.rect всегда имеет x = 0 и y = 0 ... и я не могу найти исходное положение вещей ...

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

... Мне нужно кое-что прояснить, как это сделать. Пожалуйста, любая помощь будет оценена ..

Ответы [ 4 ]

1 голос
/ 08 июля 2010

Классическим справочником по точному обнаружению столкновений во флэш-памяти является статья Гранта Скиннера .Это AS2, но логика для AS3 такая же (есть порты, если вы немного погуглите).

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

О значениях BitmapData x и yпонять, что это может сбить с толку;однако то, как это работает, имеет смысл для меня.BitmapData - это то, что подразумевает название: данные пикселей.Это не экранный объект и не может быть в списке отображения;поэтому иметь x или y, отличное от 0, на самом деле не имеет смысла, если вы подумаете об этом.Самый простой способ справиться с этим - это, вероятно, сохранить смещение (x,y) исходного объекта (экранного объекта, из которого вы нарисовали) и перевести его в глобальное координатное пространство, чтобы вы могли сравнивать любые объекты, независимо от их положения вотображать список (используя что-то вроде var globalPoint:Point = source.parent.localToGlobal(new Point(source.x,source.y)).

1 голос
/ 09 июля 2010

Ранее я использовал класс детектирования идеальных столкновений Троя Гилберта (адаптированный от Андре Мишель, Гранта Скиннера и Бульвар), который работает очень хорошо (обрабатывает вращение, разных родителей и т. Д.):

http://troygilbert.com/2007/06/pixel-perfect-collision-detection-in-actionscript3/
http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

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

http://www.coreyoneil.com/portfolio/index.php?project=5

1 голос
/ 07 июля 2010

Если вы используете объекты BitmapData с прозрачностью, вы можете использовать BitmapData.hitTest (firstPoint: Point, firstAlphaThreshold: uint, secondObject: Object, secondBitmapDataPoint: Point = null, secondAlphaThreshold: uint = 1): Boolean .

Вы должны будете перейти от глобальных координат к локальным координатам BitmapData, которые потребуют немного математики, если они будут повернуты. Это легко сделать (посмотрите аффинное преобразование для получения дополнительной информации на вики):

var coordTransform:Matrix = new Matrix();

coordTransform.rotate(rotationRadians);
coordTransform.translate(x, y);

coordTransform.transformPoint(/* your point */);
0 голосов
/ 16 июля 2010

Мне все-таки удалось это сделать, и я уже написал свой класс для обнаружения столкновений, угла / столкновений и других дополнений.

Возможно, наиболее запутанным процессом является правильное выравнивание растровых изображений для сравнения.Когда при рисовании () мувиклипа в BitmapData, если мы добавимChild () соответствующий Bitmap, мы увидим, что его часть не видна.кажется, что он нарисован только от центра вправо и вниз, оставляя верхнюю и левую части в стороне от того, чтобы быть нарисованным.Решение заключается в предоставлении матрицы преобразования во втором аргументе метода draw, который выравнивает растровое изображение и заставляет его рисовать все.

Это пример функции в моем классе для создания растрового изображения для сравнения:

    static public function createAlignedBitmap(mc: MovieClip, mc_rect: Rectangle): BitmapData{
                var mc_offset: Matrix;
                var mc_bmd: BitmapData;

                mc_offset = mc.transform.matrix;
                mc_offset.tx = mc.x - mc_rect.x;
                mc_offset.ty = mc.y - mc_rect.y;
                mc_bmd = new BitmapData(mc_rect.width, mc_rect.height, true, 0);
                mc_bmd.draw(mc, mc_offset);

                return mc_bmd;
}

чтобы использовать его, если вы находитесь на временной шкале, вы делаете:

className.createAlignedBitmap(myMovieClip, myMovieClip.getBounds(this))

Обратите внимание на использование getBounds, которое возвращает прямоугольник, в который встроен мувиклип.Это позволяет вычислять матрицу смещения.

Этот метод очень похож на метод, показанный здесь http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

Кстати, если вам интересно, проверьте мой другойвопрос, который я опубликую через несколько минут.

...