我刚开始为一堂课制作一个非常简单的视频游戏,我有一个随机的得分点产生者。这个功能运行正常,没有任何问题,但是当我发布游戏并使用Flashy Player播放时,它会显示错误消息
错误#2025:提供的DisplayObject必须是调用方的子级。
我刚刚解雇它,因为除了警报提示之外该程序有效,但我需要删除它。
function spawnscore()
{
i = 0
while (i == 0)
{
var pointy = Math.random()*640
var pointx = Math.random()*747
var pointcirc:warning = new warning();
addChild(pointcirc);
pointappearmusic.play();
setTimeout(removepoint, 1500);
pointcirc.addEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
function scoreclicked()
{
pointsound10.play();
removeChild(pointcirc);
score += 10;
removeEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
}
function removepoint()
{
// I'm pretty sure this is the problem
removeChild(pointcirc);
}
pointcirc.x = pointx;
pointcirc.y = pointy;
break;
}
return;
}
我很确定我的问题出在removepoint函数中,但我无法弄清楚要做什么。
编辑:突出显示错误
答案 0 :(得分:1)
该错误意味着当它实际上不是该容器的子容器时,您试图从容器中删除DisplayObject
,因此看起来正在发生的是scoreclicked()
运行并删除pointcirc
},然后removepoint
尝试再次将其删除。
您只需要检查pointcirc
中是否已删除removepoint()
。有很多不同的方法可以做到这一点:您可以设置pointRemoved
变量,或者在删除后设置pointcirc = null
并检查它。您也可以使用DisplayObjectContainer.contains()
直接查看,或者查看是否存在pointcirc.parent
。
答案 1 :(得分:0)
由于错误无害,您可以使用try / catch忽略它:
try
{
removeChild(pointcirc);
}
catch(e:Error){}
我应该警告你,如果这个while
实际上是循环而不仅仅是break
,那么你可能不会得到你期望的行为。
pointcirc
中的removepoint
仅指pointcirc
返回spawnscore
时的最后一个值。这将是最后一个循环之后的值,这意味着每次调用removepoint
时,它都会尝试删除最后一个pointcirc
。
您可以通过将循环中的代码放入闭包中来避免此问题:
function spawnscore()
{
i = 0
while (i == 0)
{
var pointy = Math.random()*640
var pointx = Math.random()*747
(function(pointcirc:warning)
{
var pointcirc:warning = new warning();
addChild(pointcirc);
pointappearmusic.play();
var timeoutId:int = setTimeout(removepoint, 1500);
pointcirc.addEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
function scoreclicked()
{
pointsound10.play();
removeChild(pointcirc);
score += 10;
removeEventListener(MouseEvent.MOUSE_OVER, scoreclicked);
}
function removepoint()
{
clearTimeout(timeoutId);
removeChild(pointcirc);
}
})(pointcirc);
pointcirc.x = pointx;
pointcirc.y = pointy;
break;
}
return;
}
请参阅http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/