我正在使用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的类。
有解决方法吗?
答案 0 :(得分:1)
解决方案是将类强制转换为从数组中提取的对象...
而不是
Card *object = [allObjects objectAtIndex:i];
此
Card *object = (Card *)[allObjects objectAtIndex:i];
答案 1 :(得分:0)
在一个干净的项目中仔细检查,这不是某种奇怪的副作用,我不得不说你的项目有些可疑。但是很难说清楚。
我做了什么:创建一个sprite-batch,为它添加一个sprite,也将它存储在一个数组中。在预定的方法中,我从数组中接收精灵(不是强制转换)并运行上面发布的动作序列。它按预期正常工作。
投射不应该有任何区别。批量或非批量精灵也不应该有任何区别。
如果确实如此,那真的很奇怪。所有的卡片对象都是相同的,有或没有铸造。如果它实际上没有运行runAction方法,那么您将收到“无法识别的选择器发送到实例”错误。但事实并非如此。
重新启动设备,机器,在Xcode中清理项目并重建后再试一次。还要在调试和发布配置中进行测试。在完成上述任何一项之后,我遇到了最奇怪的问题,而且绝对是上述所有问题。如果这不能解决问题,你可以确定它是代码的问题(内存泄漏是我最喜欢的)或项目设置(即不常见的编译器优化有时会产生副作用)。
如果它确实没有运行动作,请进入runAction方法 - 我确定它会将动作添加到动作管理器中。尝试使用和不使用强制转换来查看是否确实存在不同的代码路径。我对此表示怀疑。