检查对象实例是否存在

时间:2016-12-06 16:55:15

标签: actionscript-3 flash

我很惊讶我不知道该怎么做,但事实证明我真的不知道。简单地说,我试图制作一个横向滚动的射击游戏,一个基本的游戏,在其中,我有50颗星在屏幕上通过" for"循环游戏开始。有一个功能可以做到这一点,并且听众就在开头。问题是,当你输掉比赛并返回主菜单时,会产生50多颗星星,这不是我想要的。所以,我试图制作一个" if"在开始时进行语句检查,以便游戏检查是否存在星形对象/符号的实例/影片剪辑,然后确定是否应该使用监听器调出产生星形的函数。那么,我该怎么做?我查看了一些其他检查,他们没有帮助,因为所提供的代码在那里有很大不同,所以我只是得到错误。

让我知道是否需要更好的解释,或者您是否希望看到一些代码。请注意,整个游戏已经有很多代码,所以只提供所有代码可能没有用。

3 个答案:

答案 0 :(得分:1)

我建议你重新考虑一下你的做法。你关注的是明星是否已被实例化。这没关系,但不是最基本的思考方式。

我会这样做

private function setup():void{
    loadLevel(1);
    addListeners();
    loadMusic();
    // etc...
    // call all functions that are needed to just get the app up and running
}

private function loadLevel(lev:int):void{
    addStars();
    // call all functions that are needed each time a new level is loaded
}

private function restartLevel():void{
    // logic for restarting level,
    // but this *won't* include adding star
    // because they are already added
}

还有其他方法可以做到这一点,但这对我来说比你的方法更有意义。我总是把我的游戏功能分解成更小的逻辑,这样它们就可以更容易地重复使用。你的主要功能应该(恕我直言)主要(如果不是唯一的话)只调用其他功能。然后这些功能完成了工作。通过这种方式,您可以通过组合所有适用的较小函数来创建类似resetLevel的函数,同时排除有关添加星的部分。

答案 1 :(得分:1)

以下是我为解决问题所采取的措施......以下是我以前所做的事情:

 function startGame():void
 {
  starsSpawn();
  //other code here
 }

这就是我改为:

 starsSpawn();

 function startGame():void
 {
  //other code here
 }

答案 2 :(得分:0)

当你说存在时,所以有一个容器,我把这个容器命名为(包含星星,星星被添加到它中)为starsRoot,绝对是DisplayObject (右?)

现在,要检查DisplayObject的整个孩子,我们必须这样做:

for (var i:int=0; i<starsRoot.numChildren; i++) {
    var child = starsRoot.getChildAt[i];
}
那么,如何检查那个孩子是否真的是明星!? 正如您所说

  

是否有明星的实例/影片剪辑

因此,您的星星类型是MovieClip,并且它们没有任何标识符(名称),因此如何找到它们并从其他现有的动画片段中清除它们。我的建议:

为库中的星星定义链接名称,即类名称,并且应以大写字母开头,例如 Stars

enter image description here

现在,回到代码,这次我们可以检查孩子是否是 Stars 的实例

for (var i:int=0; i<starsRoot.numChildren; i++) {
    var child = starsRoot.getChildAt[i];
    if (child is Stars) {
        // test passed, star exist
        break;
    }
}