as3 рисовать мышью и стирать линии при достижении hitTestObject

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

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

var myshape:Shape;


myshape = new Shape();
myshape.graphics.lineStyle(12, 0xC807DE);
var alreadyDrawn:Shape;
alreadyDrawn = new Shape();

stage.addEventListener(MouseEvent.MOUSE_DOWN, activateDraw);
function activateDraw(event:MouseEvent):void
{
    myshape.graphics.moveTo(mouseX,mouseY);
    addChild(myshape);

    stage.addEventListener(MouseEvent.MOUSE_MOVE, lineDraw);
    function lineDraw(myevent:MouseEvent):void
    {
        stage.addEventListener(MouseEvent.MOUSE_UP, stopDraw);
        function stopDraw(endevent:MouseEvent):void
        {
            alreadyDrawn = myshape;
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, lineDraw);

        }


        myshape.graphics.lineTo(mouseX,mouseY);
        myevent.updateAfterEvent();
        checkIt();
    }


}

function checkIt()
{
    if (alreadyDrawn.hitTestObject(Ball) == true)
    {
        trace("Hit The Balls");
        myshape.graphics.clear();
        myshape.graphics.lineStyle(12, 0xC807DE);


    }

}

person Papa De Beau    schedule 22.01.2014    source источник


Ответы (2)


На самом деле у вас есть ОДНА форма вместо двух, потому что, как только вы сделаете alreadyDrawn=myshape, вы потеряете любой объект, который вы туда прикрепили. Вместо этого вы должны сделать alreadyDrawn.graphics.copyFrom(myshape.graphics);, это скопирует все штрихи из аргумента в объект без потери другого экземпляра.

Далее вроде бы тоже нужно прекратить отрисовку, если вы обнаружили попадание в alreadyDrawn, для этого вызовите stopDraw(null); из checkIt().

И далее, вы не убираете со сцены всех слушателей, добавляя все больше и больше. Смотрите, если вы рисуете несколько линий в быстрой последовательности (нажмите-перетащите-отпустите), прослушиватель stopDraw будет добавлен несколько раз и не будет удален ни разу. Для этого используйте removeEventListener(MouseEvent.MOUSE_UP, stopDraw); внутри функции stopDraw и переместите строку добавления в activateDraw, потому что при перетаскивании мыши происходит несколько событий «перемещение мыши», и каждый раз, когда вы обрабатываете событие, добавляется другой прослушиватель.

И, наконец, ПОЖАЛУЙСТА, не вставляйте функции без необходимости!

Фиксированный код должен быть таким:

var myshape:Shape;
myshape = new Shape();
myshape.graphics.lineStyle(12, 0xC807DE);
var alreadyDrawn:Shape;
alreadyDrawn = new Shape();

stage.addEventListener(MouseEvent.MOUSE_DOWN, activateDraw);
function activateDraw(event:MouseEvent):void
{
    myshape.graphics.moveTo(mouseX,mouseY);
    addChild(myshape);

    stage.addEventListener(MouseEvent.MOUSE_MOVE, lineDraw);
    stage.addEventListener(MouseEvent.MOUSE_UP, stopDraw);
}

function lineDraw(event:MouseEvent):void
{
    myshape.graphics.lineTo(mouseX,mouseY);
    event.updateAfterEvent();
    checkIt();
}
function stopDraw(event:MouseEvent):void
{
    alreadyDrawn.graphics.copyFrom(myshape.graphics);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, lineDraw);
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopDraw);
}

function checkIt()
{
    if (alreadyDrawn.hitTestObject(Ball) == true)
    {
        trace("Hit The Balls");
        myshape.graphics.clear();
        myshape.graphics.lineStyle(12, 0xC807DE);
        alreadyDrawn.graphics.clear(); // clear this too
        stopDraw(null); // stop active draw, if any
    }
}

copyFrom() справочник по руководству

person Vesper    schedule 22.01.2014
comment
Вау, спасибо за отличный код. Я получил эту ошибку: Сцена 1, Слой «Слой 1», Кадр 1, Строка 25 1061: Вызов возможно неопределенного метода copyFrom через ссылку со статическим типом flash.display:Shape. - person Papa De Beau; 22.01.2014
comment
К сожалению, copyFrom() является методом класса Graphics и принимает другой объект Graphics в качестве источника. Исправлено. - person Vesper; 22.01.2014
comment
Еще раз спасибо за весь код. У меня все еще есть проблемы. Короче говоря, я хочу создать игру для рисования для детей. Они нажимают кнопку, чтобы начать (создают новую форму), затем рисуют, если они ударяют по объекту, он начинается заново и стирает линии и все нарисованные объекты. Или они могут сделать то же самое, снова нажав «Старт». Но мой код очень глючный, даже с внесенными вами изменениями. Я знаю, что это близко. Это игра-лабиринт. поэтому, когда они ударяются о стену, они возвращаются к началу. - person Papa De Beau; 22.01.2014
comment
Вы должны предоставить более подробную информацию об этих проблемах. Возможно, вам следует перейти в библиотеку PixelPerfectCollisionDetection (найти ее), потому что у hitTestObject и так много проблем. - person Vesper; 23.01.2014

Интересный вопрос~

Я думаю, проблема может быть в том, что вы забыли moveTo после clear.

Вот мое исправление:

Пройдите mouseX, mouseY до checkIt.

checkIt( mouseX, mouseY );

function checkIt( mouseX:Number, mouseY:Number ):void
{
    if (alreadyDrawn.hitTestObject(Ball))//you don't need == true here
    {
        trace("Hit The Balls");
        myshape.graphics.clear();
        myshape.graphics.lineStyle(12, 0xC807DE);
        myshape.graphics.moveTo(mouseX,mouseY);
    }
}
person Tim    schedule 22.01.2014