AS3 删除孩子不起作用和/或给出错误



我想做的,基本上是在影片剪辑到达舞台之外时将其删除。但是删除子代码给了我错误(第 62 行)。帮助!顺便说一句,我是闪光灯的新手。小费,或者其他什么,非常感谢!

import flash.events.Event;
import flash.display.MovieClip;
import flash.display.DisplayObject;
var tray:Array = new Array(Legal2_1,Legal2_2,Legal2_3,Legal2_4,Legal2_5,Legal2_6,Legal2_7,Legal2_8,Legal2_9,Legal2_10,Legal2_11,Legal2_12,Legal2_13,Legal2_14,Legal2_15,Illegal2_1,Illegal2_2,Illegal2_3,Illegal2_4,Illegal2_5,Illegal2_6,Illegal2_7,Illegal2_8,Illegal2_9,Illegal2_10,Illegal2_11,Illegal2_12,Illegal2_13,Illegal2_14,Illegal2_15);
var traypos:int;
var goodpos:int;
var badpos:int;
traypos = (stage.stageWidth / 2)-100;
goodpos = ((stage.stageWidth / 3) -100);
badpos = (((stage.stageWidth/3) *2) -100);
Score.text = score.toString();
Combo.text = combo.toString();
var timerT:Timer = new Timer(1000,120);
timerT.addEventListener(TimerEvent.TIMER, traytimerhandler);
timerT.start();
var secondsT:Number = 1;
function traytimerhandler(event:TimerEvent)
{
    //trace("Seconds elapsed: " + seconds);
    SpawnTray();
    secondsT++;
}
function SpawnTray():void
{
    var trayspawn:int;
    trayspawn = int(Math.random() * tray.length);
    //var trayn:MovieClip = new tray[trayspawn]();
    var trayn:MovieClip = new tray[trayspawn];
    trayn.trayTypeIndex = trayspawn;
    addChild(trayn);
    trayn.x = traypos;
    trayn.y = -20;
    trayn.addEventListener(Event.ENTER_FRAME, MoveTray);    
    trayn.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);   
}
function MoveTray(event:Event):void
{   
var trayn:DisplayObject = event.target as DisplayObject;
trayn.y +=  5;
/*if (trayn.y >= stage.stageHeight + 50)
{
    trayn.removeEventListener(Event.ENTER_FRAME, MoveTray);
    trayn.removeEventListener(Event.ENTER_FRAME, MoveTwo);
    trayn.removeEventListener(MouseEvent.MOUSE_DOWN, startDragging);    
    //removeChild(trayn);
    //tray.parent.removeChild(trayn);
}   */
if (trayn.y >= stage.stageHeight + 50)
{
    this.removeChild(trayn); //ERROR
}
}
function startDragging(e:MouseEvent):void
{
    e.target.removeEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    e.target.removeEventListener(Event.ENTER_FRAME, MoveTray);
    // surprise! This object will not be moved via MOUSE_DOWN,;
    // because it's already being moved 
    e.target.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
    e.target.startDrag();
}
// drag;
function stopDragging(e:MouseEvent):void
{
    e.target.stopDrag();
    e.target.addEventListener( Event.ENTER_FRAME, MoveTray);
    e.target.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    e.target.removeEventListener(MouseEvent.MOUSE_UP,stopDragging);
    return;// emergency exit. We don't need to do more
}

这意味着您的addChild(trayn);不起作用。

如果SpawnTray(null);需要传递事件,为什么要调用它?

要么像这样SpawnTray() SpawnTray(event:Event)

function SpawnTray():void
{
    //I have not added your all lines here for clarity (you add it here)
    var trayn:MovieClip = tray[trayspawn]; //See this modified line

}

并像这样修改traytimerhandler

function function traytimerhandler(event:TimerEvent)
{
    //trace("Seconds elapsed: " + seconds);
    SpawnTray(); // modified
    secondsT++;
}

这一行应该有效:

   trayn.parent.removeChild(trayn); 

但是,正如我在评论中指出的那样,您似乎不了解导致混乱的方法到底发生了什么。

这是一种糟糕的方法,您需要做的是退后一步,重新思考为什么要/需要将参数传递给返回的处理程序函数。

如果是 MovieClip,一种方法是您可以在创建时添加一个属性来存储给定值 - 即:

trayn.trayTypeIndex = trayspawn;

现在,无论您在哪里使用该实例(如果它被转换为影片剪辑),您都可以访问该属性。

您的处理程序中的示例可能是这样的:

var trayn:MovieClip = event.target as MovieClip;
if (trayn.trayTypeIndex <= 14)
{
   // do something
}

相关内容

最新更新