AS3 - ошибка - поставляемый объект DisplayObject должен быть дочерним - PullRequest
0 голосов
/ 22 июня 2011

Я использую следующий код для отображения рекламы во флеш-игре.Это прекрасно работает, за исключением одной маленькой проблемы.Если функция startButton вызывается до показа объявления, я получаю сообщение об ошибке:

ArgumentError: Ошибка # 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающему.на flash.display :: DisplayObjectContainer / removeChild () в VirusDefender / clickStart () [VirusDefender :: frame1: 17]

Нет ошибок, когда реклама находится на сцене.Я попытался обернуть removeChild в попытку, но это не сработало.

Может, кто-нибудь подскажет, как предотвратить вызов строки removeChild, если объявление еще не было показано.Иногда показ объявления занимает до 3 секунд, поэтому люди могут нажать, прежде чем оно появится на сцене.

stop();

//Start Button
startScreen.startButton.addEventListener(MouseEvent.CLICK,clickStart);
function clickStart(event:MouseEvent) 
{
sndFire=new fire_sound();
sndFireChannel=sndFire.play();
removeChild(l);
gotoAndStop("play");
}

// Help Button
startScreen.helpButton.addEventListener(MouseEvent.CLICK,clickHelp);
function clickHelp(event:MouseEvent) 
{
sndFire=new fire_sound();
sndFireChannel=sndFire.play();
removeChild(l);
gotoAndStop("help");
}


// SMAATO Advertising Code for Start Page
var request:URLRequest = new URLRequest("http://soma.smaato.com/oapi/reqAd.jsp");
var variables:URLVariables = new URLVariables();
variables.adspace = "0";
variables.pub = "0";
variables.devip = "127.0.0.1";
variables.format = "IMG";
variables.adcount = "1";
variables.response = "XML";
request.data = variables;
var loader:URLLoader = new URLLoader();

var l:Loader = new Loader();

loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(request);


function onComplete(e:Event):void
{
var data:XML = new XML(loader.data as String);
var status:String = data.*::status.toString();
if(status == "success")
{
var ad:XMLList = data.*::ads.*::ad;
var link:String = ad.*::link.toString();

l.load(new URLRequest(link));
addChild(l);
l.x = 135;
l.y = 265;
var clickurl:String = ad.*::action.@target.toString();
l.addEventListener(MouseEvent.CLICK, onAdClick);
}
function onAdClick(e:MouseEvent):void
{
    var request:URLRequest = new URLRequest(clickurl);
    navigateToURL(request);
}
}

Спасибо!Рич

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Оберните строку в:

if (l != null && contains(l)) {
    removeChild(l);
}

Это проверит, если l не является нулем и дочерним, и только затем удалит его.

0 голосов
/ 22 июня 2011

В качестве альтернативы, так как Loader является DisplayObject, вы можете просто добавить его на сцену, прежде чем что-либо еще (не нужно завершать загрузку, прежде чем вы сможете добавить его на сцену), и удалить его при нажатии start, таким образом пусть он задержится или появится позже, если вы на самом деле хотите, чтобы его оставили в печати. ​​

...