打印

[AS3] Sprite无法移除子对象?错误显示,提供的 DisplayObject 必须是调用者的子级?

var particleNum:uint=10;;
var particleClass:Class=Water;//water是一个类
var particles:Array=[];
var container:Sprite=new Sprite();
var timer:Timer=new Timer(400);

function updateParticles(evt:Event):void
{
       for(var i=0;i<particles.length;i++)
       {
              var particle=particles[i];
              particle.update();//water类的方法,变透明
              if(particle.alpha<=0)//当particle透明时候,就移除掉,但是错误
                {
                    container.removeChild(particle);
                }              
       }
}
function makeParticles(evt:Event):void
{
       if(particles.length<particleNum)
       {
              var particle:*=new particleClass();              
              particles.push(particle);
              container.addChild(particle);
              particle.growX=1.04;
              particle.growY=1.04;
              particle.fade=.96;
       }
}

addChild(container);
timer.start();
timer.addEventListener(TimerEvent.TIMER,makeParticles);
addEventListener(Event.ENTER_FRAME,updateParticles);

运行时候出现错误:
ArgumentError: Error #2025: 提供的 DisplayObject 必须是调用者的子级。
at flash.display:isplayObjectContainer/removeChild()
at waterParticle_fla::MainTimeline/updateParticles()
这个错误是不是说container.removeChild(particle)这里出错?在生成particle的时候就已经container.addChild了,为什么会有这个错误?

谢谢各位达人
particle.update();//这个方法是怎么写的?


              if(particle.alpha<=0)//当particle透明时候,就移除掉,但是错误
                {
                    container.removeChild(particle); //这里移除一个particle就应该从数组中删除它!否则在 enterFrame事件中不断地遍历,其中有些particle已经不在显示列表中,就出错了。!估计问题就在这里。
                }
http://www.flash023.cn 终极讨厌
可以再removeChild之前来判断一下要删除的对象是否在container的显示列表中
复制内容到剪贴板
代码:
if(container.contains(particle))container.removeChild(particle);
Water类:
package
{
       import flash.display.*;
       
       public class Water extends MovieClip
       {
              public var growX:Number;
              public var growY:Number;
              public var fade:Number;
              public function Water():void
              {
                     growX=1;
                     growY=1;
                     fade=1;
              }
              public function update():void
              {
                     this.scaleX*=growX;
                     this.scaleY*=growY;
                     this.alpha*=fade;
              }
       }
}
呵呵,最近下个粒子系统学习下
我用debug的时候,发现container里面没有看到particle
楼上的我也尝试下吧

楼主说的数组删除我现在也试下,昨天晚上断网了

谢谢!

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
function updateParticles(evt:Event):void
{
       if(particles.length>=particleNum&&timer.hasEventListener(TimerEvent.TIMER))
    {
              timer.removeEventListener(TimerEvent.TIMER,makeParticles);
       }
       for(var i=0;i<particles.length;i++)
       {
              var particle=particles[i];
              particle.update();
              if(particle.alpha<=0)
              {
                         var tempParticle=particles.splice(i,1).pop();
                         container.removeChild(tempParticle);
                         tempParticle=null;
              }
       }
}
改成这样可以了,版主说对了,是数组当中还存有对象的引用,所以container已经移除了对象以后,再次进行循环时候,之前remove的particle还存在数组里,所以在if(particle.alpha<=0)之后,会再次对container进行removeChild,这个时候当然已经没有child了,所以有错误

谢谢大家

TOP