0

我刚开始学习cocos2d-iphone 2.x。

当尝试制作 CCSprite 的动画时,会出现错误。

我的代码如下:

CCTexture2D *texture=[[CCTextureCache sharedTextureCache] addImage:@"dragon.png"];

CCSpriteBatchNode *spriteSheet=[CCSpriteBatchNode batchNodeWithTexture:texture];
[self addChild:spriteSheet];

NSMutableArray *animFrames=[[NSMutableArray alloc]init];
for (int i=1; i<8; i++) {
    [animFrames addObject:[CCSprite spriteWithTexture:spriteSheet.texture rect:CGRectMake(i*75, 0, 75, 70)]];
}

CCAnimation *flyAnim=[CCAnimation animationWithSpriteFrames:animFrames delay:0.1f];

CGSize winSize=[CCDirector sharedDirector].winSize;

CCSpriteFrame *frame3=[CCSpriteFrame frameWithTexture:texture rectInPixels:CGRectMake(0, 0, 75, 70) rotated:NO offset:CGPointZero originalSize:CGSizeMake(75, 70)];
self.dragon=[CCSprite spriteWithSpriteFrame:frame3];
_dragon.position=ccp(winSize.width/2,winSize.height/2);
self.flyAction=[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:flyAnim]];
[_dragon runAction:_flyAction];
[spriteSheet addChild:_dragon];

有什么不对的吗?

4

1 回答 1

3

在您的循环中,该行:

[animFrames addObject:[CCSprite spriteWithTexture:spriteSheet.texture rect:CGRectMake(i*75, 0, 75, 70)]];

您应该添加 CCSpriteFrame 对象而不是 CCSprite。当动作运行时,动作管理器认为这些是 spriteFrame 对象并向它们发送该类的消息。

通常在 .plist 文件中声明精灵帧,比如说“dragon.plist”。可以使用 zwoptex、texturePacker 或类似工具创建 plist(vi 可以正常工作)。然后你可以这样做:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"dragon.plist"];
NSMutableArray *frames = [NSMutableArray arrayWithCapacity:numberOfFrames];
for (NSUInteger i = 1; i <= 8; i++) {
    NSString *frName = [NSString stringWithFormat:@"dragon%i.png",i];
    CCSpriteFrame *frr = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frName];
    if (frr) {
        [frames addObject:frr];
    } else {
        MPLOGERROR(@"*** No frame named [%@], bailing out.", frName);
        return nil;
    }
    [frames addObject:frr];
}
于 2012-11-23T11:29:42.737 回答