我正在研究Strougo / Wenderlich教程(太空维京项目)。第4章我遇到了麻烦。
在RadarDish.m中:
-(void)initAnimations
{
[self setTransmittingAnim: [self loadPlistForAnimationWithName:@"transmittingAnim" andClassName:NSStringFromClass([self class])]];
}
-(void)changeState:(CharacterStates)newState {
[self stopAllActions];
id action = nil;
[self setCharacterState:newState];
switch (newState) {
.
.
case kStateIdle:
action = [CCAnimate actionWithAnimation:transmittingAnim
restoreOriginalFrame:NO];
break; }
if (action != nil) {
[self runAction:action];
}
}
-(id)init
{
self=[super init];
if (self!=nil) {
.
.
[self initAnimations];
.
.
}
return self;
}
与教程中的代码完全相同。失败:
*** Assertion failure in -[CCAnimate initWithAnimation:], /Users/macowner/Documents/examples/SpaceViking/SpaceViking/libs/cocos2d/CCActionInterval.
使用带断点的调试器,我注意到transmitAnim的值= nil。
所以,如果我放线
[self setTransmittingAnim:
[self loadPlistForAnimationWithName:@"transmittingAnim" andClassName:NSStringFromClass([self class])]];
进入的情况
-(void)changeState
然后动画正常工作。
为什么来自[self initAnimations]
的{{1}}未被调用?
我正在使用cocos2d v.2模板
非常感谢提前。
答案 0 :(得分:2)
我遇到了问题,因为我一直在使用cocos 2d v.2.0构建项目,而教程是基于cocos 2d模板v.1.xx如果你要按照“学习Cocos2D”这本书,我强烈建议你加载cocos2d-iphone版本1.0.1。这是链接download cocos2d 1.x.x branch
如果您仍想使用最新的cocos2d模板,我可以给您一些建议:
您将需要修改大量弃用和更改,因此请使用this link了解如何修复这些弃用和更改。
现在关于解决我在这里提到的问题的几句话。在每个GameObjects,EnemyObjects和PowerUps中,我添加了一个覆盖initWithFrameName
的方法。
-(id) initWithSpriteFrameName:(NSString*)frameName{
if ((self=[super init])) {
if ((self = [super initWithSpriteFrameName:frameName])) {
CCLOG(@"### RadarDish initialized");
[self initAnimations]; // 1
characterHealth = 100.0f; // 2
gameObjectType = kEnemyTypeRadarDish; // 3
[self changeState:kStateSpawning]; // 4
}
}
return self;
}
这允许GameObject和GameCharacter init方法在CCSprite的initWithSpriteFrameName
方法运行之前运行。
Viking GameObject必须有一个稍微不同的解决方案,因为它是用initWithSpriteFrame
而不是initWithSpriteFrameName
初始化的。但是,覆盖实现与上面的RadarDish示例基本相同。