Actionscript 3.0 добавление и удаление потомков - PullRequest
0 голосов
/ 15 марта 2012

Итак, в основном, у меня есть мувиклип под названием «Кувшин», и когда яйцо щелкают и перетаскивают в «Кувшин», я хочу, чтобы оно исчезло, а затем снова добавилось в то место, где оно было запущено.Кроме того, я хочу, чтобы переменная была добавлена ​​к значению 1.

Я уже некоторое время пытаюсь поиграться с этим и не могу понять, так как, когда я удаляю child, он получает ошибки.Вот код:

var eggClickOffset:Point = null;
var egg:Egg = new Egg();
egg.x = 290;
egg.y = 330;
addChild(egg);
var eggAmount:TextField = new TextField();
eggAmount.defaultTextFormat = textFormat;
eggAmount.x = 250;
eggAmount.y = 60;
eggAmount.height = 18;
eggAmount.width = 100;
eggAmount.border = true;
eggAmount.text = "Incorrect Amount";
eggAmount.background = true;
eggAmount.backgroundColor = 0xff0000;
stage.focus = eggAmount;
addChild(eggAmount);
var eggs:int;
eggs = 0;

//Egg Event listeners:
egg.addEventListener(Event.ENTER_FRAME, eggAmountCounter);
egg.addEventListener(MouseEvent.MOUSE_DOWN, startEggDrag);
egg.addEventListener(MouseEvent.MOUSE_UP, stopEggDrag);
egg.addEventListener(Event.ENTER_FRAME, dragEgg);
egg.addEventListener(Event.ENTER_FRAME, checkEggCollision);

//starting egg drag:
function startEggDrag(event:MouseEvent):void
{
    eggClickOffset = new Point(event.localX,event.localY);
}

//Stopping the egg drag:
function stopEggDrag(event:MouseEvent):void
{
    eggClickOffset = null;
}

//Egg Dragging:
function dragEgg(event:Event):void
{
    if (eggClickOffset != null)
    {// must be dragging
        egg.x = mouseX - eggClickOffset.x;
        egg.y = mouseY - eggClickOffset.y;
    }
}

//When egg hits jug:
function checkEggCollision(event:Event):void
{
    if (jug.hitTestObject(egg))
    {
            eggs + 1;
            egg.removeEventListener(MouseEvent.MOUSE_DOWN, startEggDrag);
            egg.removeEventListener(Event.ENTER_FRAME, dragEgg);
            removeChild(egg);
            addChild(egg);
            egg.x = 300;
            egg.y = 300;
    }
}

//How many eggs:
function eggAmountCounter(event:Event):void {
    if(eggs == 3){
        eggAmount.text = "Corrent Amount";
    }
}

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Таким образом, добавление и удаление объектов из контейнеров на самом деле довольно дорого с точки зрения того, что инструментарий должен сделать, чтобы перерисовать себя.И обычно есть такие проблемы, с которыми вы сталкиваетесь, когда это не работает так, как рекламируется.Поэтому я советую вам никогда не добавлять / удалять компоненты, если вы хотите контролировать видимость.Просто отметьте их visible = false / true и при желании не забудьте использовать includeInLayout = true / false.Поскольку у вас есть видимые видеоклипы = true / false, этого должно быть достаточно.

Если вы просто хотите, чтобы яйцо начало возвращаться в исходное положение, просто измените его положение x, y.Я бы создал простой метод, который принимает яйцо и устанавливает все свойства для начального состояния.В вашем методе stopEggDrag просто вызовите эту функцию, передав яйцо, которое было наркотиком, на экране.Виола, она возвращается туда, где она была.

Хитрость в том, что вам не нужно решать проблему удаления, если вы никогда не удаляете объект.

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

Извините, у меня нет ошибки на removeChild, но я имею в виду, что больше не могу переместить яйцо, потому что:

egg.removeEventListener(MouseEvent.MOUSE_DOWN, startEggDrag);

Кстати, я уверен, что вам не нужно 3x Event.ENTER_FRAMEcase.

Могу ли я предложить вам другой подход?Может быть, вы можете попробовать что-то вроде этого:

var eggStartPos:Point;
egg.addEventListener(MouseEvent.MOUSE_DOWN, startEggDrag);
egg.addEventListener(MouseEvent.MOUSE_UP, stopEggDrag);

//starting egg drag:
function startEggDrag(event:MouseEvent):void
{
    eggStartPos = new Point(egg.x, egg.y);
    egg.addEventListener(Event.ENTER_FRAME, handle_enterFrame);
}

//Stopping the egg drag:
function stopEggDrag(event:MouseEvent):void
{
    egg.removeEventListener(Event.ENTER_FRAME, handle_enterFrame);
    eggStartPos = null;
}

//Handle egg moving and hittest on enter frame
function handle_enterFrame(event:Event):void
{
    egg.x = mouseX;
    egg.y = mouseY;

    if( collisionWithJug(egg) )
    {
        egg.removeEventListener(Event.ENTER_FRAME, handle_enterFrame);
        collisionOccur();
    }
}

function collisionWithJug(target:DisplayObject):Boolean
{
    if (jug.hitTestObject(target))
        return true;
    else
        return false;
}

//Got collision
function collisionOccur():void
{
    eggs += 1;
    egg.x = eggStartPos.x;
    egg.y = eggStartPos.y;

    eggAmountCounter();
}


//How many eggs:
function eggAmountCounter():void
{
    if(eggs == 3)
    {
        eggAmount.text = "Corrent Amount";
    }
}
...