2013-05-07 68 views
0

我构建了一个基本的avoider游戏。当我在iOS中运行游戏时,我遇到了setInterval或setTimeout的问题(我尝试了这两种方法)。奇怪的是,它作为一个.swf或.apk工作正常,但不是在iOS中。我发现问题与setTimeout/setInterval有关。iOS中的setInterval/setTimeout问题

我有一个文档类控制真实显示的内容一样,教程,1级屏幕,水平屏幕,等它是这样的:

public function DocumentClass() 
{ 
    menuScreen = new MenuScreen(); 
    menuScreen.addEventListener(NavigationEvent.START, onRequestStart); 
    menuScreen.addEventListener(NavigationEvent.CREDI, onRequestCredits); 
    addChild(menuScreen);     
} 
public function onRequestStart(navigationEvent:NavigationEvent):void 
{ 
    tut = new Tutorial(); 
    tut.addEventListener(NavigationEvent.NEXT, onRequestNext); 
    addChild(tut); 
    menuScreen.removeEventListener(NavigationEvent.START, onRequestStart); 
    menuScreen.removeEventListener(NavigationEvent.CREDI, onRequestCredits); 
    removeChild(menuScreen); 
    menuScreen = null; 
} 

它去总是这样,去掉最后屏幕和听众,并弹出新的屏幕,为不同的级别或信息屏幕。

在我发现该错误的类中,我使用了一个Timer,主要用于交互目的和敌方世代。 类似这样的:

public function onTick(timerEvent:TimerEvent):void 
{ 
    if (Math.random() < 0.02){ 
     enemySpot(); 
    } 
} 

public function enemySpot() 
{ 
    var enemySpot = new EnemySpot(posX[incDec], posY[incDec]) 
    spots.push(enemySpot); 
    addChild(enemySpot); 
    enemyBorn = setTimeout(enemyGenerator, 1000); 
} 

public function enemyGenerator() 
{ 
    enemy = new Enemy(posX[incDec], posY[incDec]) 
    army.push(enemy); 
    addChild(enemy); 
    removeEnemy = setTimeout(enemyRemoval, 6000); 
    incDec = incDec + 1; 
    clearTimeout(enemyBorn); 
} 

public function enemyRemoval() 
{ 
    for each (var elem:Bola in army) 
    { 
     removeChild(elem); 
     elem = null; 
     army.reverse(); 
     army.pop(); 
     army.reverse(); 
     clearTimeout(removeEnemy); 
     break 
    } 
} 

它可以正常工作,直到玩家击中敌人。

if (avatarHasBeenHit) 
{ 
    avatar.alpha = 0; 
    avatar.stopDrag(); 
    if (bol2) 
    { 
     aDeath = new avatarDeath();//just an animation, of the avatar dyeing 
     addChild(aDeath); 
     aDeath.x = avatar.x; 
     aDeath.y = avatar.y; 
     uniTimer1 = getTimer(); 
     bol2 = false; 
    } 
    goNext = setInterval(leaveScreen,1500); 
} 
public function leaveScreen() 
{ 
    gameTimer.stop(); 
    dispatchEvent(new AvatarEvent(AvatarEvent.DEAD)); 
    clearInterval(goNext); 
} 

一旦玩家击中的敌人,游戏停止产生的下一个水平,这是在不同的类文件的敌人。它是这样的: 阿凡达击中敌人 - > dispatch AvatarEvent.DEAD; DocumentClass移除关卡画面的孩子,并将孩子与下一个关卡画面进行部署,这些关卡具有与前一关卡相同的结构,不知何故setTimeout获胜,因此没有新的敌人。但它在swf和apk文件上工作正常!任何想法是什么造成这个问题? 在此先感谢

+0

我从来没有在iOS上使用setTimeout,所以我不能确认它是否是一个错误或限制的软件,但如果你真的卡住了,你可以使用'Timer'代替,我已经使用Timer类之前的iOS。 – BadFeelingAboutThis 2013-05-07 16:40:55

+0

我有使用setTimeout它工作正常,简单但有效 – joshua 2013-05-08 13:17:19

+0

可能混合Timer和setTimeout/setInterval导致iOS中的某种错误。我可以真正得出结论,因为这是我第一次尝试iOS。无论如何,我通过只使用Timer + getTimer()来解决这个问题,避免了任何间隔/超时。感谢您的提示 – pipoca 2013-05-10 18:12:57

回答

0

我想这跟你有什么关系,叫clearTimeout()。请考虑当setTimeout()完成并调用相关函数时,由它返回的句柄不再有效。因此,可能在使用clearTimeout(enemyBorn)时,实际上您正在清除removeEnemy的超时时间(与其他clearTimeout相同)。

+0

我也尝试没有clearTimeout,事情是,该代码工作正常在瑞士法郎,并在Android中,但不是在iOS中。我通过删除间隔/超时来解决这个问题,并且只使用Timer和getTimer()。不知何故,使用计时器和间隔时间搞乱了我的应用程序。谢谢你的帮助! – pipoca 2013-05-10 18:09:39