Используйте bitmapData.hitTest для двух bitmapData с центрированной точкой регистрации - PullRequest
0 голосов
/ 05 марта 2012

Я потратил на это весь день, пришло время попросить вас о помощи:)

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

На моей сцене я зафиксировал элементы, которые при добавлении на сцену помещаются в массив, называемый "zoneUsed".Все displayObject в моем проекте имеют точку регистрации в центре.

Моя цель состоит в том, чтобы щелкнуть по сцене и проверить, могу ли я создать круг в щелчковых координатах.Мой план состоял в том, чтобы создать Sprite для нового объекта, выполнить цикл для массива zoneUsed и проверить, достаточно ли нового спрайта для жизни.

Вот мой код:

 private function checkSpaceForNewMarker (markerToCheck:Sprite):Boolean {
        var isPossible:Boolean = true;
        var bmdataToCheck:BitmapData = new BitmapData (markerToCheck.width, markerToCheck.height, true, 0);
        var m:Matrix = new Matrix ();
        m.tx = markerToCheck.width/2;
        m.ty = markerToCheck.height/2;
        bmdataToCheck.draw (markerToCheck, m);

        for (var i:int = 0; i<zoneUsed.length; i++) {
            trace ("*** CHECKING ****");
            var bmddataOnTheTable:BitmapData = new BitmapData (zoneUsed[i].width, zoneUsed[i].height, true, 0);

            var tableMatrix:Matrix = new Matrix ();
            tableMatrix.tx = zoneUsed[i].width/2;
            tableMatrix.ty = zoneUsed[i].height/2;
            bmddataOnTheTable.draw(zoneUsed[i], tableMatrix);


            if (bmdataToCheck.hitTest(new Point(markerToCheck.x, markerToCheck.y), 255, bmddataOnTheTable, new Point (zoneUsed[i].x, zoneUsed[i].y), 255)) {
                trace ("COLLISION");
                                    isPossible = false;
            } else {
                trace ("NO COLLISION");
                                    isPossible = true;
            }
        }


        return isPossible;
    }

.... Но сейчас результаты странные.В зависимости от зон мои следы работают или нет.Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Проблема в том, что вы рисуете 1/4 (четверть) части каждого объекта. BitmapData не похож на Shape, Sprite, MovieClip и обрезает все пиксели, когда границы рисования выходят за границы прямоугольника (0,0, bitmapdata.width, bitmapdata.height). Просто удалите эти строки:

 m.tx = markerToCheck.width/2;
 m.ty = markerToCheck.height/2;

, а также

 tableMatrix.tx = zoneUsed[i].width/2;
 tableMatrix.ty = zoneUsed[i].height/2;

Вам не нужны эти переводы.

Также ваш код может быть причиной утечки памяти. Вы создаете растровые данные, но не утилизируете их. Сборщик мусора не освободит выделенную вами память. Вы должны освободить память явно. Звоните bitmapdata.dispose() каждый раз, когда вам это не нужно bitmapdata.

0 голосов
/ 06 марта 2012

Я не уверен, что происхождение растрового изображения имеет какое-либо отношение к самому тесту.Сама природа теста, по-видимому, подразумевает, что тестирование основано на значении RGBA двух поставляемых растровых изображений.В любом случае, вместо того, чтобы выделять собственную реализацию, я просто отсылаю вас к учебнику Майка Чамберса (евангелист платформы Adobe).http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

Также для ознакомления с дополнительными учебниками по флеш-памяти www.gotoandlearn.com .

...