【问题标题】:Cocos2d schedule only onceCocos2d 只调度一次
【发布时间】:2011-05-27 19:50:28
【问题描述】:

如何让 cocos2d 的日程选择器只做一次?现在我能做的最好的就是:

[self schedule:@selector(eventHappend:) interval:2];

eventHappend:

- (void)eventHappend: (ccTime) dt
{
    [self unschedule:@selector(eventHappend:)];
    // Do stuff
}

但这似乎是一种解决方法……有没有一种方法可以只安排一次?

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    您可以在节点上运行一系列操作,一个 CCDelay 后跟一个调用您的方法的 CCCallFunc。

    像这样……

    [self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:2], 
                                        [CCCallFunc actionWithTarget:self selector:@selector(eventHappened)],
                                        nil]];
    

    【讨论】:

    • 这太好了,谢谢...为了正确起见,我相信这个类是 CCDelayTime 而不是 CCDelay。
    【解决方案2】:
    - (void) scheduleOnce: (SEL)selector delay: (ccTime)delay 
    

    调度一个只运行一次的选择器,延迟为 0 或更大

    http://www.cocos2d-iphone.org/api-ref/latest-stable/interface_c_c_node.html#afe99d609f17c4c849e4543805ffeceab

    【讨论】:

    • 好答案,这绝对是最简单的。但是,我遇到了一个很大的限制:您不能多次安排同一个选择器。 “呃,”你说,“它叫scheduleOnce”,但我(我认为OP)需要的是scheduleNonRepeating。就我而言,我有一种方法可以在抖动延迟后调度 自身 以将精灵填充到设定容量的层 - 所以要么是因为它是从计划的实例执行,要么是因为延迟太简而言之,它说:CCScheduler#scheduleSelector. Selector already scheduled. Updating interval from: 0.0000 to 0.0000 并且永远不会触发。
    【解决方案3】:

    你也可以使用这个:

    [self unschedule:_cmd];
    

    在您的 eventHappened 函数中 - 它会让您的日程安排运行一次。

    【讨论】:

    • _cmd 是您当前的方法
    【解决方案4】:

    其中大多数对于您需要的东西来说太复杂了(尽管它们非常简单)

    您只需要以下代码行:

    [self performSelector:@selector(eventHappend:) withObject:nil afterDelay:2];
    

    它只会运行你的方法 eventHappend 一次。

    【讨论】:

    • 在文档中找不到这个...这个方法属于哪个类?如果它曾经存在,它可能已被 v2.1 删除。
    • 哦!我明白了,这是NSObject 上的一个方法,属于NSDelayedPerforming 类别...好吧,在cocos2d 游戏的上下文中这可能是一个非常糟糕的主意,因为Foundation 框架的内置计时器不会尊重cocos2d 游戏时钟——例如如果你暂停游戏,选择器仍然会触发!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多