我很惊讶我不知道该怎么做,但事实证明我真的不知道。简单地说,我试图制作一个横向滚动的射击游戏,一个基本的游戏,在其中,我有50颗星在屏幕上通过" for"循环游戏开始。有一个功能可以做到这一点,并且听众就在开头。问题是,当你输掉比赛并返回主菜单时,会产生50多颗星星,这不是我想要的。所以,我试图制作一个" if"在开始时进行语句检查,以便游戏检查是否存在星形对象/符号的实例/影片剪辑,然后确定是否应该使用监听器调出产生星形的函数。那么,我该怎么做?我查看了一些其他检查,他们没有帮助,因为所提供的代码在那里有很大不同,所以我只是得到错误。
让我知道是否需要更好的解释,或者您是否希望看到一些代码。请注意,整个游戏已经有很多代码,所以只提供所有代码可能没有用。
答案 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
现在,回到代码,这次我们可以检查孩子是否是 Stars
的实例
for (var i:int=0; i<starsRoot.numChildren; i++) {
var child = starsRoot.getChildAt[i];
if (child is Stars) {
// test passed, star exist
break;
}
}