在学习魔塔游戏时,有一步是通过 CCAnimation 实例获取 CCSpriteFrame,会出现类型转换问题。
我们在创建一个 animation 的时候,通常遵循以下步骤:
- create 一个 CCArray 对象 A。
- 通过 A->addObject() 添加 CCSpriteFrame 对象。
- 通过 CCAnimation::createWithSpriteFrames(A, 0.2f) 创建一个 CCAnimation 对象 B。
可以通过 B->getFrames() 获得一个 CCArray* 的指针 A',然后通过 A'->ObjectAtIndex(0) 获得第一个 CCObject* 类型的对象,称之为 C。从表面上看,A'和 A 应该是同一个数组,所以 C 应该可以通过强制类型转换 dynamic_cast 转换为 CCSpriteFrame* 类型。但是实际上如果这么写,程序就会出错。在 Visual Studio 中,它会自动跳转到 CCObject::retain() 函数的 CCAssert 语句。
正确的解决方法如下:
CCAnimationFrame* pAnimationFrame = dynamic_cast<CCAnimationFrame*>(B->getFrames()->ObjectAtIndex(0));
CCSpriteFrame* pSpriteFrame = pAnimationFrame->getSpriteFrame();

