runAction不适用于来自CCSpriteBatchNode的精灵

时间:2013-02-27 15:21:20

标签: cocos2d-iphone

我正在使用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]];
}

没有任何反应。

我试图消除CCSpanw并直接使用runAction进行移动而没有任何效果。如果我使用普通的精灵,它就可以了。

该数组中的对象派生自基于CCSprite的类。

有解决方法吗?

2 个答案:

答案 0 :(得分:1)

解决方案是将类强制转换为从数组中提取的对象...

而不是

Card *object = [allObjects objectAtIndex:i];

Card *object = (Card *)[allObjects objectAtIndex:i];

答案 1 :(得分:0)

在一个干净的项目中仔细检查,这不是某种奇怪的副作用,我不得不说你的项目有些可疑。但是很难说清楚。

我做了什么:创建一个sprite-batch,为它添加一个sprite,也将它存储在一个数组中。在预定的方法中,我从数组中接收精灵(不是强制转换)并运行上面发布的动作序列。它按预期正常工作。

投射不应该有任何区别。批量或非批量精灵也不应该有任何区别。

如果确实如此,那真的很奇怪。所有的卡片对象都是相同的,有或没有铸造。如果它实际上没有运行runAction方法,那么您将收到“无法识别的选择器发送到实例”错误。但事实并非如此。

重新启动设备,机器,在Xcode中清理项目并重建后再试一次。还要在调试和发布配置中进行测试。在完成上述任何一项之后,我遇到了最奇怪的问题,而且绝对是上述所有问题。如果这不能解决问题,你可以确定它是代码的问题(内存泄漏是我最喜欢的)或项目设置(即不常见的编译器优化有时会产生副作用)。

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