0

我想运行一个动作并同时继续处理游戏逻辑,但是当过程进行时动作被中断。我尝试使用线程,但无法使其工作。当不需要处理游戏逻辑时,精灵会按照我的预期移动,但是当需要在动作期间进行一些操作时,动作会在操作期间被中断。操作结束后,动作继续进行。我究竟做错了什么?

我按如下方式调用选择器 - 选择器启动操作。

[NSThread detachNewThreadSelector:@selector(moveSprite:)
                         toTarget:self
                       withObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                                   sprite, @"sprite",
                                                   [NSValue valueWithCGPoint:pos], @"pos",
                                                   nil]];


-(void) moveSprite: (NSDictionary*) parameters {
    CCSprite *sprite = [parameters objectForKey:@"sprite"];
    CGPoint pos = [[parameters objectForKey:@"pos"] CGPointValue];
    id actionMove = [CCMoveTo actionWithDuration:0.4f position:pos];
    id actionMoveDone = [CCCallFuncND actionWithTarget:self selector:@selector(removeSprite:data:) data:(__bridge void*)sprite];
    [sprite runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
}

动作结束后,我通过以下方法删除精灵。

-(void) removeSprite: (id)sender data:(void*)data {
    CCSprite *sprite = (__bridge CCSprite*)data;
    [self removeChild:sprite cleanup:YES];
}
4

2 回答 2

0

首先,在单独的线程中创建操作是没有意义的。动作被添加到节点,并且节点及其动作在主线程上更新。

您还应该知道,只有当设备具有两个或更多 CPU 内核时,线程才会对您有所帮助在单核设备(iPhone 4 或更早版本、iPod Touch 4 或更早版本、iPad 1)上运行执行繁重操作的单独线程如果不停止主线程,仍会减慢速度。

如果您的游戏逻辑过于繁重以至于它实际上会停止屏幕更新,那么您需要优化您正在做的任何事情。您可以将计算分布在多个帧中,配置文件以查看是否可以优化,或者您是否使用蛮力方法研究更聪明、不那么直接但更快的算法。

于 2012-10-10T08:41:10.383 回答
0

Cocos2d在主线程上运行,你的繁重操作也在主线程上运行,所以你遇到的情况很正常。

您应该使操作更轻松,或者使用线程,因此您的 CCActions 代码不是您应该寻找的,因为您知道它可以在没有代价高昂的操作的情况下正常工作

于 2012-10-10T05:27:42.940 回答