0

我正在使用 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 的类。

有什么解决方法吗?

4

2 回答 2

1

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

代替

Card *object = [allObjects objectAtIndex:i];

Card *object = (Card *)[allObjects objectAtIndex:i];
于 2013-02-27T15:50:11.283 回答
0

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

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

铸造不应该有任何区别。批处理或非批处理精灵也不应该有任何区别。

如果确实如此,那么确实发生了一些非常奇怪的事情。毕竟无论有没有施法,卡片对象都是一样的。如果它实际上没有运行 runAction 方法,您将收到“无法识别的选择器发送到实例”错误。但事实并非如此。

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

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

于 2013-02-27T19:14:27.517 回答