您的位置:首页 > 移动开发 > Cocos引擎

[cocos2d]关于CCSprite的若干问题与误区

2013-08-28 17:53 246 查看
文章 [cocos2d] 利用texture atlases生成动画 中介绍了如何生成动画并绑定在CCSprite实例上。

使用该代码遇到了几个问题,值得mark下

问题1、多实例

问题描述:

新建一个PlayerSprite类继承CCSprite,若在PlayerSprite类中使用文中代码生成会出现问题。

//生成sprite(动画将绑定在sprite上)
CCSprite *sprite = [CCSprite spriteWithSpriteFrame:[frameCache spriteFrameByName:@"1.png"]];


问题出现在于这句。
因为PlayerSprite已经是CCSprite类,当PlayerSprite实例化时,此行代码会再把CCSprite实例化,之后的动画会绑定在新的sprite上。

解决方法:

1、在PlayerSprite类中删除此句代码,并将之后的所有的sprite改成 self 即可。(注意最后还有一句addChild要删除)



@implementation CCSprite

//....

-(id)initWithFile:(NSString*)filename{
//.....省略

CCTexture2D *texture  = [[CCTextureCache sharedCache] addImage:filename];

if ( texture ){
CGRect rect = CGRectZero;
rect.size = texture.contentSize;
return [self initWithTexture:texture rect:rect];
}

[self release];
return nil;

}

//.....
@end


CCSprite Source Code

解决方法:

同问题1,使用spriteWithXXX实例化即可

PlayerSprite *sprite = [PlayerSprite spriteWithSpriteFrame:[frameCache spriteFrameByName:@"1.png"]];
[self addChild:sprite z:0 tag:1];


经验:

由此可以看出CCSprite与CCLayer,CCScene的继承类实例过程有不同的地方,

CCSprite的继承类用spriteWithXXX实例化的话,不会调用继承类的init方法,而只会调用CCSprite的init方法。

而对于CCLlayer与CCScene的继承类,因为是用XXLayer *layer = [XXLayer node]此类方式实例化,而 node实则上是[[[self alloc] init] autorelease]的缩写,会调用继承类的init方法。

问题3、贴图复用/获得已缓存的贴图

PlayerSprite *sprite = [PlayerSprite spriteWithSpriteFrame:[frameCache spriteFrameByName:@"1.png"]];


可能有人会发现在问题1、2中sprite使用的贴图是frameCache中获得的,那么有没方法获得已经缓存好的贴图而不是每次都要重新加载呢?

Learn iPhone and iPad Cocos2D Game Development一书中作者在第七章中介绍到一个比较好的方法

( Scrolling With Joy -> Advanced Parallax Scrolling -> Re-creating the Background in Code)

待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: