【问题标题】:Objective-c -> iphone design: delayed actionObjective-c -> iphone设计:延迟动作
【发布时间】:2011-04-16 06:59:45
【问题描述】:

很抱歉打扰,但我有点麻烦,我想知道这里是否有人可以帮我一把。

我目前正在设计一款游戏,其中敌人出现在屏幕左侧(超出边界)并向右移动。我使用了许多代码(这是使用 Sparrow 框架),并且当你击败它们时,敌人的数量几乎会增加。即 lvl 1-> 1 个敌人,lvl 2-> 2 个敌人,lvl3-> 3 个敌人,等等...

我在制造敌人方面遇到了一些麻烦。我让它们出现在 5 个设置路径中的 1 个上(NSMutableArray 中的路径号),由随机数生成器选择,但是它们经常出现在同一路径上,1 在另一个之上。

为了制造敌人,我运行了多种方法: addEnemy -> 生成敌人(动画),然后从左到右移动。 onTouchEnemy -> 如果我碰到敌人,他们就会死。激活 drawEnemies drawEnemies -> 调用 addEnemy 的次数等于你的 lvl。编码为:

for(int i = 0; i < level; i++){
  [self performSelector:@selector(addEnemy) withObject:nil afterDelay:3.0];
}

有没有一种编程方法可以在激活产生敌人方法之间有延迟?我试过这个 afterDelay,但由于某种原因,程序只是忽略了 3 秒的延迟,并且只在 1 中产生了敌人。这很烦人,因为我希望它们以更有序的方式出现。

感谢任何愿意帮助我的人。 Sjkato。

【问题讨论】:

    标签: iphone objective-c methods sparrow-framework


    【解决方案1】:

    performSelector:withObject:afterDelay: 似乎因为代码执行方式而忽略了它的延迟。那个 for 循环几乎会立即迭代,排队 3 次调用 addEnemy 方法。 3 秒后,addEnemy 方法几乎同时执行。

    要获得更好的结果,您应该查看NSTimer。您可以设置 3 秒的间隔并让它重复(您可以在产生所需数量的敌人后使计时器无效)。

    类似:

    // creates and returns a new timer
    // the timer is retained by the run loop for as long as it is valid
    // invalidating the timer will cause the runloop to release it.
    myTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                     target:self
                                   selector:@selector(addEnemy)
                                   userInfo:nil
                                    repeats:YES];
    

    这将导致 addEnemy 方法每 3 秒触发一次。你应该记下你已经制造了多少敌人,在制造完最后一个敌人后,停止计时器,以免它再次开火。

    if (numberOfDesiredEnemies == numberOfEnemiesProduced)
    {
        [myTimer invalidate], timer = nil;
    }
    

    【讨论】:

    • 非常感谢您的回复。既然我的怀疑得到了证实,我想我对延迟代码的理解会更好一些。我会尝试这段代码,然后尝试一个变种,看看我是否可以增加一些趣味:)
    【解决方案2】:

    您的意思是要在末尾加上一个额外的“*i”吗?像这样:

    for(int i = 0; i < level; i++){
        [self performSelector:@selector(addEnemy) withObject:nil afterDelay:3.0 * i];
    }
    

    【讨论】:

    • 呃,抱歉,你在代码末尾添加了 '*i' 有点让我失望了……你的意思是这会导致程序在不同的时间延迟,而不仅仅是3 秒后触发所有 addEnemy 命令?
    • 是的,这正是我的意思。你说他们都是同时出现的。我以为你可能试图错开每个敌人。在您的代码中,它们都会出现在第 3 秒。注意 performSelector:withObject:afterDelay: 立即返回。它不会暂停 3 秒。因此,您的代码正在排队一堆 addEnemy 调用,这些调用将在 3 秒后同时被调用。如果您想要的话,“* i”会将它们错开,相隔 3 秒。该方法运行良好,无需切换到 NSTimer。
    • 非常感谢!我没有意识到你可以做到这一点并使命令起作用。我在尝试使 Jasarien 的建议起作用时遇到了一些问题,但我不确定我需要更改多少代码才能使其起作用。这要简单得多...非常感谢!
    • 太棒了!很高兴它奏效了。顺便说一句,在stackoverflow上单击向上箭头或您认为有帮助的回复上的复选框是正常的:) 此页面上有几个可能符合条件。这样,您将来更有可能得到问题的解答。
    【解决方案3】:

    尝试浏览 NSTimer 类。
    有一些方法可以使用预定义的延迟和循环条件来执行选择器。

    【讨论】:

    • 感谢您的提示!我将测试 Jasarien 建议的代码,然后仔细研究 NSTimer 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多