我尝试过以下代码中的变体,即从stage
切换到this.stage
甚至root.stage
,但没有运气。
我得到的完整错误是:
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/setChildIndex()
at flash.display::Stage/setChildIndex()
at Banner/next_image_loaded()
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.utils.*;
import gs.*;
import gs.easing.*;
public class Banner extends MovieClip
{
var xml_url:URLRequest;
var xml_loader:URLLoader;
var img_loader:Loader;
var img_data:Array;
var img:Bitmap;
var new_img:Bitmap;
var strapline:strap;
var banner:bottom_banner;
var button:tech_button;
var current_image:Number = -1;
var done:Boolean = false;
public function Banner()
{
this.xml_url = new URLRequest("Banner.xml");
this.xml_loader = new URLLoader(this.xml_url);
this.xml_loader.addEventListener(Event.COMPLETE, this.xml_loaded);
this.xml_loader.addEventListener(IOErrorEvent.IO_ERROR, this.err);
return;
}// end function
private function xml_loaded(event:Event)
{
this.img_data = new Array();
var _loc_2:* = new XML(event.target.data);
var _loc_3:* = 0;
while (_loc_3 < _loc_2.image.length())
{
this.img_data.push(_loc_2.image[_loc_3]);
_loc_3 = _loc_3 + 1;
}
this.img_data = this.randomise_array(this.img_data);
this.next_content();
return;
}// end function
private function randomise_array(param1:Array) : Array
{
var _loc_2:* = new Array();
while (param1.length > 0)
{
_loc_2.push(param1.splice(Math.floor(Math.random() * param1.length), 1));
}
return _loc_2;
}// end function
private function next_content()
{
if (this.current_image == (this.img_data.length - 1))
{
this.current_image = 0;
}
else
{
var _loc_2:* = this.current_image + 1;
this.current_image = _loc_2;
}
this.img_loader = new Loader();
this.img_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.next_image_loaded);
this.img_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.err);
this.img_loader.load(new URLRequest(this.img_data[this.current_image]));
return;
}// end function
private function next_image_loaded(event:Event)
{
var _loc_2:Number = 0;
this.new_img = event.target.content;
stage.addChild(this.new_img);
if (this.strapline)
{
stage.setChildIndex(this.strapline, (stage.numChildren - 1));
}
if (this.banner)
{
stage.setChildIndex(this.banner, (stage.numChildren - 1));
}
if (this.button)
{
stage.setChildIndex(this.button, (stage.numChildren - 1));
}
if (this.current_image == 0 && this.done != true)
{
this.button = new tech_button();
this.button.x = 28;
this.button.y = 257;
//stage.addChild(this.button);
var _loc_3:Boolean = true;
this.button.buttonMode = true;
this.button.useHandCursor = _loc_3;
this.button.addEventListener(MouseEvent.CLICK, this.goToTechPage);
TweenLite.from(this.button, 0.5, {alpha:0, delay:1.5});
this.banner = new bottom_banner();
this.banner.x = 0;
this.banner.y = stage.stageHeight - 40;
stage.addChild(this.banner);
this.strapline = new strap();
this.strapline.x = 232;
this.strapline.y = 195;
stage.addChild(this.strapline);
TweenLite.from(this.strapline, 1, {x:stage.stageWidth, ease:Expo.easeOut, delay:0.75, onComplete:this.fade_strap});
this.done = true;
}
else
{
_loc_2 = 0.75;
}
TweenLite.from(this.new_img, 1, {autoAlpha:0, ease:Expo.easeOut, onComplete:this.swap_clips, delay:_loc_2});
return;
}// end function
private function goToTechPage(event:MouseEvent) : void
{
navigateToURL(new URLRequest("report.htm"), "_self");
return;
}// end function
private function fade_strap()
{
TweenLite.to(this.strapline.bg_mc, 1.5, {alpha:0.85});
return;
}// end function
private function remove_strap()
{
this.strapline.parent.removeChild(this.strapline);
this.strapline = null;
return;
}// end function
private function swap_clips()
{
if (this.img)
{
stage.removeChild(this.img);
}
this.img = this.new_img;
this.new_img = null;
setTimeout(this.next_content, 6500);
return;
}// end function
private function err(event:IOErrorEvent)
{
if (this.img_data)
{
this.next_content();
}
return;
}// end function
}
答案 0 :(得分:3)
//stage.addChild(this.button);
似乎'按钮'没有添加到舞台上(在next_image_loaded()方法中),因此
if (this.button)
{
stage.setChildIndex(this.button, (stage.numChildren - 1));
}
抛出错误,虽然'按钮'可能存在(!= null),但它没有被添加到舞台
尝试if语句如下:
if(button != null && button.stage != null)
编辑:正如Vesper已经指出的那样
答案 1 :(得分:1)
这是很多人必须阅读的代码,您可以在代码中的关键点使用trace("trace 1")
缩小发生错误的位置(每次更改数字)。当您执行代码时,输出窗口将显示您的跟踪,即:
trace 1
trace 2
trace 3
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller
这告诉您在第三次跟踪后的某个时间发生了错误。你得到的错误告诉你它发生在next_image_loaded
函数中,所以尝试在那里运行一些跟踪并用结果更新你的帖子。