HitTest работает некорректно при использовании Graphics.lineTo/curveTo

Итак, у меня есть муви-клип под названием hookLine, добавленный на сцену из моего класса mainEngine. Этот пустой мувиклип связан с моим fisherman мувиклипом и изгибается к моему playerHook мувиклипу. Он добавлен и подключен к сцене следующим образом:

В моем функциональном цикле mainEngine:

playerHookLine();

Затем Функция:

private function playerHookLine():void 
    {

        //Add hook line to fisherman and playerhook
        hookLine.graphics.clear();
        hookLine.graphics.lineStyle(1);
        hookLine.graphics.moveTo(fisherman.x, fisherman.y);
        hookLine.graphics.curveTo(playerHook.x, playerHook.y, mouseX, mouseY);

    }

Теперь проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь проверить hookLine с помощью Move Clip под названием currentShark, hitTest работает, и я получаю трассировку, но это совсем не ТОЧНО, когда я изгибаю свою линию крюка в стороны, и currentShark выходит на сцену. он автоматически попадает в тесты и дает мне трассировку. Так что, по сути, акуле даже не нужно соприкасаться с настоящей линейной графикой. Когда акула добавляется на сцену, она просто регистрируется.

Кто-нибудь знает, почему это так?

Вот как выглядит функция hitTest:

private function checkPlayerHitShark():void 
    {
        //Loop through all sharks
        for (var i:int = 0; i < aSharkArray.length; i++)
        {
            //Get current Shark in i loop
            var currentShark:mcShark = aSharkArray[i];

            //Check if shark is hittest with Hook
            if (currentShark.hitTestObject(playerHook) || currentShark.hitTestObject(hookLine))
            {
                trace("Hook Hit Shark");
                trace("hit LINE");
                removePlayerLive();

                //Destroy player 
                playerHook.destroyPlayerHook();
                hookLine.destroyHookLine();

                //Remove shark from array
                aSharkArray.splice(i, 1);

                //Add new Hook to stage
                stage.addChild(playerHook);
                stage.addChild(hookLine);
            }


        }

    }

person Nathan    schedule 21.02.2014    source источник


Ответы (1)


Более чем вероятно, что ограничивающие рамки вашей акулы и лески сталкиваются. Когда ваша изогнутая леска перемещается влево или вправо, ваша ограничительная рамка будет такой же, как ширина и высота самой лески. Откройте свой проект и опубликуйте его как SWF, затем откройте SWF в проигрывателе Flash и нажмите Control+E или нажмите «Просмотр» в верхней части окна и выберите «Показать области перерисовки». Вы должны увидеть ограничивающие рамки красного цвета, когда они перерисовываются на сцену.

То, что вам нужно, — это обнаружение попаданий на уровне пикселей на растровых изображениях вашей акулы и лески. BitmapData имеет метод hitTest, для которого потребуется несколько параметров.

Вы найдете отличную помощь по обнаружению попаданий на уровне пикселей в статье Майка Чемберса по ссылке здесь: http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata.-hittest-for-collision-detection/

Документацию для BitmapData.hitTest можно найти здесь: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html

Просто найдите список общедоступных методов.

person E10    schedule 21.02.2014
comment
Я хотел сказать, опубликуйте свою программу в виде файла .SWF и откройте его в проигрывателе Flash. Сам плеер будет иметь меню вверху, и вы увидите кнопку «Просмотр», в этом меню есть «Показать перерисованные области». Я тоже отредактирую свой пост. - person E10; 21.02.2014
comment
Спасибо мужик за всю информацию. Я очень ценю это. Кроме того, вы были правы, линия имеет огромный прямоугольник, куда бы я ее ни перемещал. - person Nathan; 21.02.2014
comment
Ок, я понял. Я пойду дальше и прочитаю те статьи, которые вы мне прислали прямо сейчас. Так нельзя ли сжать этот регион до линии крючка? - person Nathan; 21.02.2014
comment
Это правильно. Если ваше изображение акулы имеет только пиксели там, где находится акула, и у него нет границы или фона для пикселей акулы, вы также сможете уменьшить область попадания до пикселей акулы. - person E10; 21.02.2014