Cocos2d iphone runAction不适用于来自CCSpriteBatchNode的精灵

Cocos2d iphone runAction不适用于来自CCSpriteBatchNode的精灵,cocos2d-iphone,Cocos2d Iphone,我正在使用Cocos2d 2.1rc0 我有一个项目,它在我不使用CCSpriteBatchNode时工作得很好。然后我决定使用批处理节点来减少绘制调用,于是问题就开始了 很多东西都不好用。reorderChild就是其中之一。另一个是runAction,没有runAction Cocos是没有用的 这是一个不使用batchNodes也不使用它的方法的示例 // move/rotate all objects for (int i=0; i<[allObjects count]; i++

我正在使用Cocos2d 2.1rc0

我有一个项目,它在我不使用CCSpriteBatchNode时工作得很好。然后我决定使用批处理节点来减少绘制调用,于是问题就开始了

很多东西都不好用。reorderChild就是其中之一。另一个是runAction,没有runAction Cocos是没有用的

这是一个不使用batchNodes也不使用它的方法的示例

// move/rotate all objects

for (int i=0; i<[allObjects count]; i++) {

        Card *object = [allObjects objectAtIndex:i];
        [object stopAllActions];

        CGPoint center = object.position;
        center.x = center.x + 100;
        center.y = center.y - 200;

        CCMoveTo *moveAction = [CCMoveTo actionWithDuration:0.3f position:ccp(center.x, center.y)];
        CCRotateTo *rotateAction = [CCRotateTo actionWithDuration:0.3 angle:0.0f];

        CCSpawn *action = [CCSpawn actions:moveAction, rotateAction, nil];

        [object runAction:[CCSequence actions: action,
                             [CCDelayTime actionWithDuration:0.1f],
                             nil]];
}
//移动/旋转所有对象

对于(inti=0;i而言,解决方案是将类强制转换为从数组中提取的对象

而不是

Card *object = [allObjects objectAtIndex:i];
这个


在一个干净的项目中反复检查这不是某种奇怪的副作用之后,我不得不说你的项目有些可疑。但是很难说是什么

我所做的:创建一个精灵批,添加一个精灵,并将其存储在一个数组中。在一个预定的方法中,我从数组中接收精灵(而不是施法),并运行上面发布的操作序列。它工作正常,正如预期的那样

浇铸不应产生任何影响。分批或非分批雪碧也不应产生任何影响

如果是这样的话,就会发生一些非常奇怪的事情。毕竟,无论是否强制转换,卡片对象都是相同的。如果它没有实际运行runAction方法,您将收到一个“无法识别的选择器发送到实例”错误。但事实并非如此

在重新启动设备、机器、在Xcode中清理项目并重新生成后,请在不强制转换的情况下重试。还可以在调试和发布配置中进行测试。在执行上述操作之一之后,我遇到了最奇怪的问题,当然还有上述所有操作。如果这不能解决问题,您可以确定这是代码的问题(内存泄漏是我一直最喜欢的)或项目设置(即不常见的编译器优化有时会产生副作用)


如果runAction方法确实没有运行该操作,请进入runAction方法-我确信它会将该操作添加到操作管理器中。尝试使用强制转换和不使用强制转换,以查看是否确实使用了不同的代码路径。我对此表示怀疑。

object.isRunning是否为真?奇怪的是,但是调用此方法时没有运行任何操作。为什么是她的神秘。无论如何,我添加了一行[对象停止动作](参见我的问题)没有任何更改。isRunning是一个基本的CCNode属性,在OneNet和onExit之间为YES。hmmm…目前没有更多想法,将使用我的一个批处理节点进行快速测试,以查看我是否可以复制您的问题。感谢您的帮助,但我发现了问题。从数组中提取类时,您必须将该类强制转换为对象。。这个想法来源于:看我的答案。你能发布卡片类的代码吗?如果太多,删除所有方法,除了重写的超类(CCSprite)方法和初始值设定项。哈哈哈…哦,好吧,我会记住这一点。我已经为自己确认了动作在几秒钟前正在运行。无论如何,谢谢。出于一些奇怪的原因,这在没有施法之前是有效的,但现在在施法之后才有效。非常奇怪。这真的很奇怪。你能通过单步走和int来检查吗o运行动作代码如果你不施放会发生什么?我已经用一个ccMoveTo替换了运行动作,但什么都没有发生。精灵继续在相同的位置上运行。如果我用普通精灵运行,它会起作用。如果你使用运行动作方法会发生什么?我尝试了所有这些都没有成功。我在代码中使用了ARC,作为Cocos2D还不是ARC。你试过使用批处理节点的reorderChild功能吗?对我来说不起作用。我不知道问题是什么,但强制转换解决了问题。我同意这很奇怪,因为在这种情况下强制转换在理论上不会有任何效果。你试过运行分析器吗?也许这会提供一个线索。你是如何将ARC设置为静态库的rary还是-fno-Objc-arc?您是否在某个时间点更新了cocos2d代码(因此有一些没有该标志的新cocos2d源文件)?还没有尝试过reordchild,但所有这些都告诉我这只是底层代码的冰山一角(讨厌的)这个问题可能在其他地方也会出现。-fno objc arc flag。我从一个干净的Cocos2D项目(文件,新项目,Cocos2D)开始这个项目。所有Cocos2D源文件都有编译器标志。没有漏洞。应用程序运行得很好。请尝试ReordrChild,看看它是否适合您。在批处理精灵本身的背景上尝试批处理精灵。两个不同的批处理,还是相同的?两个不同的批处理。我认为您的这个问题可能是关键。
Card *object = (Card *)[allObjects objectAtIndex:i];