【问题标题】:Flash only removing objects not created through codeFlash 仅删除不是通过代码创建的对象
【发布时间】:2013-05-27 22:14:46
【问题描述】:

我正在尝试用 Flash 制作一个简单的游戏。到目前为止,我已经使用addChild(objName); 在舞台上添加了一堆对象。但是,现在我正在尝试完全删除这些对象。我不想循环遍历每个对象的名称,我确信必须有一种更有效的方法来选择每个对象(可能通过舞台上的索引)和removeChildAt(index); 它。但是,当我尝试这样做时,Flash 只会删除我在舞台上手动放置的对象。它不会删除通过代码放置的那些。我做了一些搜索,并尝试了多种方法,所有这些方法都产生了相同的结果。大多数人都同意的是这个:

while (numChildren > 0) 
{
   removeChildAt(0);
}

你能帮我弄清楚为什么这没有删除任何被编码到舞台上的东西吗?

提前致谢:D

编辑:这是我的框架代码:

第 1 帧(随机生成并显示点):

import flash.events.MouseEvent;
import fl.motion.easing.Linear;

var dotList = new Array(); var level:int = 3; var invisoDotList = new Array();
var loop:int;
var line:Line = new Line();
line.x = 274;
line.y = 187;
addChild(line);
for(loop = 0; loop < level; loop++)
{
    var dot:Dot = new Dot();
    var invisoDot:InvisoDot = new InvisoDot();
    var tester:Boolean = true;
    var xval:int = Math.floor(Math.random()*(1+520))+14;
    var looper:int = 0;
    while(looper < dotList.length)
    {
        if(Math.abs(xval - dotList[looper].x) > 30)//minimum spacing
        {
            looper++;
        }
        else
        {
            looper = 0;
            xval = Math.floor(Math.random()*(1+520))+14;
        }
    }
    dot.x = xval;
    dot.y = 187;
    invisoDot.x = xval;
    invisoDot.y = 187;
    invisoDot.alpha = 0;
    dotList[loop] = dot;
    invisoDotList[loop] = invisoDot;
    addChild(invisoDot);
    addChild(dot);
}
//trace(dotList); test to ensure that dots are added to the array
var nb1:NextButton = new NextButton();
nb1.x = 0;
nb1.y = 0;
nb1.alpha = 0;
addChild(nb1);
nb1.addEventListener(MouseEvent.CLICK, hideDots);

function hideDots(e:MouseEvent)
{
    for(var loop:int = 0; loop < dotList.length; loop++)
    {
        dotList[loop].alpha = 0;//make dots disappear
    }
    line.alpha = 0;
    nextFrame();
}
stop();

第 2 帧(显示更多说明并包含稍后将使用的几个方法):

import flash.events.MouseEvent;
removeChild(nb1);
var nb2:NextButton = new NextButton();
nb2.x = 0;
nb2.y = 0;
nb2.alpha = 0;
addChild(nb2);
nb2.addEventListener(MouseEvent.CLICK, next);

function next(e:MouseEvent)
{
    nextFrame();
}
function clearStage()
{
    while (numChildren > 0) 
    {
        trace("before" + numChildren);
        removeChildAt(0);
        trace("after" + numChildren);
    }
}
stop();

第 3 帧(使点在被点击时消失并保持准确计数):

import flash.events.MouseEvent;
import flash.utils.Timer;
line.alpha = 1;
removeChild(nb2);
//setChildIndex(line,0);
var clicks:int = -1;
var passed:int = 0;
var fromLine:Boolean = false;
//trace(dotList.length);
stage.addEventListener(MouseEvent.CLICK, clickCount);
for(var loopvar:int = 0; loopvar < dotList.length; loopvar++)
{
    //trace("loop");
    dot = dotList[loopvar];
    invisoDot = invisoDotList[loopvar];
    dot.addEventListener(MouseEvent.CLICK, onClick);
    invisoDot.addEventListener(MouseEvent.CLICK, onClick);
    //trace("event");
}
//trace(dotList.length);
function onClick(e:MouseEvent)
{
    //e.currentTarget.alpha = .5;
    for(var hitcheck:int = 0; hitcheck < dotList.length; hitcheck++)
    {
        if(dotList[hitcheck].x == e.currentTarget.x)
        {
            dotList[hitcheck].alpha = 1;
        }
    }
    //trace("check");
}
var numChanged:int = 0;
function clickCount(e:MouseEvent)
{
    clicks++;
    //trace(clicks);
    numChanged = 0;
    for(var index:int = 0; index < dotList.length; index++)//check whether the user has gotten all the dots
    {
        if(dotList[index].alpha == 1)
        {
            numChanged++;
        }
    }
    if(numChanged == level)//if the user has gotten all the dots
    {
        /*trace("next screen for sucess");
        trace(clicks);*/
        line.visible = false;
        for(loop = 0; loop < dotList.length; loop++)
        {
            dotList[loop].alpha = 0;//make dots disappear
        }
        if((clicks - level) == 1)
        {
            passed = 2
        }
        else if((clicks - level) == 0)
        {
            passed = 1;
        }
        passed = 1;
        fromLine = true;
        nextFrame();
    }
    else if((clicks - numChanged) >= 2)//this ends the session as soon as 2 mistakes are made
    {
        /*trace("next screen for failed number of clicks");
        trace(clicks);*/
        line.visible = false;
        for(loop = 0; loop < dotList.length; loop++)
        {
            dotList[loop].alpha = 0;//make dots disappear
        }
        passed = 3;
        fromLine = true;
        nextFrame();
    }
    /*else if((clicks - level) >= 2)//if the user has made too many mistakes. This ends the session after the maximum number of tries have been used
    {
        trace("next screen too many clicks");
        trace(clicks);
    }*/

}
//trace("end");
stop();

第 4 帧(生成结果表。旁注:有一个错误,“好的”永远不是结果,因为在第 3 帧中,passed 的值从不等于 2。但不知道为什么):

import flash.text.TextFormat;
import flash.text.TextField;

var failFormat:TextFormat = new TextFormat();
failFormat.color = 0xFF0000;
failFormat.font = "Arial";
failFormat.size = 18;
var passFormat:TextFormat = new TextFormat();
passFormat.color = 0x00FF00;
passFormat.font = "Arial";
passFormat.size = 18;
var okayFormat:TextFormat = new TextFormat();
okayFormat.color = 0x808000;
okayFormat.font = "Arial";
okayFormat.size = 18;
var normalFormat:TextFormat = new TextFormat();
normalFormat.color = 0x000000;
normalFormat.font = "Arial";
normalFormat.size = 18;

var lineResults = new Array();
var squareResults = new Array();
trace(passed);
if(fromLine == true)
{
    if(passed == 1)
    {
        lineResults[lineResults.length] = "Pass";
    }
    else if(passed == 2)
    {
        lineResults[lineResults.length] = "Okay";
    }
    else if(passed == 3)
    {
        lineResults[lineResults.length] = "Fail";
    }

}
fromLine = false;
lineResults = lineResults.reverse();
squareResults = squareResults.reverse();
var loopLength:int = (lineResults.length >= squareResults.length) ? lineResults.length : squareResults.length;
var loopStart:int = 0;
if(loopLength > 11)
{
    loopStart = loopLength - 12
}
var cb:CellBlock = new CellBlock();
cb.x = 283.05;
cb.y = 20.35;
addChild(cb);
var col1Head:TextField = new TextField();
col1Head.defaultTextFormat = normalFormat;
col1Head.text = "# of Dots";
col1Head.x = 114.95
col1Head.y = 8.3;
addChild(col1Head);
var col2Head:TextField = new TextField();
col2Head.defaultTextFormat = normalFormat;
col2Head.text = "Line";
col2Head.x = 259.95
col2Head.y = 8.3;
addChild(col2Head);
var col3Head:TextField = new TextField();
col3Head.defaultTextFormat = normalFormat;
col3Head.text = "Square";
col3Head.x = 381.95
col3Head.y = 8.3;
addChild(col3Head);

for(loop = loopStart; loop < loopLength; loop++)
{
    var block:CellBlock = new CellBlock();
    block.x = 283.05;
    block.y = 20.35 + (loop - loopStart + 1)*33;
    addChild(block);
    var col2:TextField = new TextField();
    var col3:TextField = new TextField();
    var col1:TextField = new TextField();
    /*col2.defaultTextFormat = passFormat;
    col3.defaultTextFormat = okayFormat;*/
    col1.defaultTextFormat = normalFormat;
    switch(lineResults[loop])
    {
        case "Pass":
        col2.defaultTextFormat = passFormat;
        break;
        case "Okay":
        col2.defaultTextFormat = okayFormat;
        break;
        case "Fail":
        col2.defaultTextFormat = failFormat;
        break;
    }
    switch(squareResults[loop])
    {
        case "Pass":
        col3.defaultTextFormat = passFormat;
        break;
        case "Okay":
        col3.defaultTextFormat = okayFormat;
        break;
        case "Fail":
        col3.defaultTextFormat = failFormat;
        break;
    }
    //col2.text = "Pass";
    col2.text = lineResults[loop];
    col2.x = 260.95;
    col2.y = block.y - 12;
    addChild(col2);
    //col3.text = "Okay";
    try
    {
        col3.text = squareResults[loop];
    }
    catch(e:Error)
    {

    }
    col3.x = 386.95;
    col3.y = block.y - 12;
    addChild(col3);
    col1.text = String(loop + 1);
    col1.x = 133.95;
    col1.y = block.y - 12;
    addChild(col1);
}
var nb4:NextButton = new NextButton();
nb4.x = 0;
nb4.y = 0;
nb4.alpha = 0;
addChild(nb4);
nb4.addEventListener(MouseEvent.CLICK, clearStage);
stop();

第 5 帧(下一帧是一个测试,以确保所有内容都被删除,但它不会):

removeChild(nb4);
stop();

【问题讨论】:

  • 上面的代码是对的。您动态添加对象的容器可能不是您尝试从中删除对象的容器。尝试在while 循环之前/之后追踪numChildren 的值以确认。
  • 我会试试看会发生什么。谢谢:)
  • 我试过while (numChildren &gt; 0) { trace("before" + numChildren); removeChildAt(0); trace("after" + numChildren); } 似乎连跟踪都没有执行。我什至没有得到“after0”或“before0”或类似的东西。我得到的唯一输出是:ArgumentError: Error #1063: Argument count mismatch on Game_fla::MainTimeline/clearStage(). Expected 0, got 1.clearStage() 是这段代码所在的方法。
  • 我刚想起一件事。当我创建一些对象时,我在 for 循环中创建了它们,使用的变量在每次循环迭代时都会重新声明。因此,从技术上讲,它们没有变量名。他们只是留在舞台上。这和他们为什么拒绝消失有关系吗?
  • 仍在尝试找出上述参数错误的原因。但是关于您关于重新声明的变量的其他问题:没关系。变量名称被重用,但对象作为子对象添加到某些容器对象,如舞台、MovieClipSprite。因此,只要您上面的 while 循环在适当的容器上运行,您就可以删除它们。也许您应该显示添加对象的代码,这可能有助于阐明如何删除它们。

标签: actionscript-3 flash


【解决方案1】:

这个错误:

ArgumentError:错误 #1063:Game_fla::MainTimeline/clearStage() 上的参数计数不匹配。预期为 0,得到 1。clearStage()

发生是因为您的clearStage() 方法已添加为按钮的单击事件处理程序。如果您的clearStage() 函数将用作事件处理程序,则它需要接受“事件”参数。所以你应该像这样定义函数:

function clearStage(event:Event)
{
    while (numChildren > 0) 
    {
        trace("before" + numChildren);
        removeChildAt(0);
        trace("after" + numChildren);
    }
}

附带说明,这意味着如果您还想手动调用clearStage(),即使用它而不将其添加为事件处理程序,则您需要包含此event 参数...但是你可以只传入一个 null,因为你的代码不需要实际使用 event 参数:

clearStage(null);

我不确定我是否发现其他任何问题。我将首先将该事件参数添加到您的 clearStage() 函数中,如上所示。

我还应该补充一点,我主要在 Flex 或纯 AS3 中工作,并且在 Flash CS6 和时间轴编程方面不是超级熟练 :)

【讨论】:

    【解决方案2】:

    根据记忆,我认为当您移除一个孩子时,Flash 不会重新订购。如果您删除索引 0 处的子项,则其他所有子项的编号仍为 1 到 x。 childAt(0) 现在只是空。请记住这一点。

    【讨论】:

    • 我想到了这一点并尝试了一个for 循环,我从最高索引向后工作,但它产生了相同的结果:(
    • 这不是真的。当您向DisplayObjectContainer 添加/删除子项时,索引始终会更新。因此,如果一个对象有 3 个子对象,并且我删除了 0 处的子对象,则索引 1 处的项目现在位于索引 0。
    • 你说老as2引擎
    • @Cherniv,哇!我不知道 AS2,谢谢你的澄清......这是 Stack Overflow 很棒的众多原因之一。我每天都在学习新东西:)
    • @SunilD。你说得对,我忘了把这个放在开头:(at)JediKnightBoB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2016-11-17
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多