0

所以基本上我有一个名为Jug的MovieClip,当点击鸡蛋并拖动到Jug时,我希望它消失,然后在首次启动的位置重新添加它自己。此外,我想要一个变量加1的值。Actionscript 3.0添加和移除儿童

我已经尝试了一段时间摆弄这个一段时间,我无法弄清楚,因为当我删除孩子它会得到错误。这里是代码:

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

因此,从容器中添加和删除东西实际上相当昂贵的工具包必须做的重绘本身。而且通常会遇到类似这样的问题,它只是无法像广告一样工作。所以,当我们想要控制可视性时,我的建议绝不会添加/删除组件。只需将它们标记为visible = false/true,并可选择记住使用includeInLayout = true/false。由于您有影片剪辑visible = true/false应该足够好。

如果您只是想让鸡蛋回到原来的位置,只需简单地直接修改它的x,y位置即可。我会创建一个简单的方法,它接受一个蛋并为所有初始状态设置所有属性。在你的stopEggDrag方法中,只需调用该函数传递正在药物屏幕上的蛋。中提琴它弹回到原来的位置。

这里的诀窍是,如果您永远不删除对象,则不必解决删除问题。

1

对不起,我没有对removeChild之错误,但我暗示,因为不能再动蛋:

egg.removeEventListener(MouseEvent.MOUSE_DOWN, startEggDrag); 

顺便说一句我敢肯定,你不需要3X Event.ENTER_FRAME在这种情况下, 。

我可以建议你采用不同的方法吗?也许你可以尝试更类似的东西:

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"; 
    } 
}