我有自定义CCSprite子类的cocos2d项目:
MyCustomSprite.h:
#import "cocos2d.h"
@interface MyCustomSprite : CCSprite
@end
MyCustomSprite.m:
#import "MyCustomSprite.h"
@implementation MyCustomSprite
- (id)init
{
self = [super initWithFile:@"index.png"];
return self;
}
@end
由于某些奇怪的原因,此代码将因“EXC_BAD_ACCESS”而崩溃。
但是,尽管如此,如果我初始化为self,然后从CCSprite的initWithFile和initWithTexture编写代码,它将正常工作:
self = [super init];
if (self) {
// Code from CCSprite.m - initWithFile
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage: @"index.png"];
CGRect rect = CGRectZero;
rect.size = texture.contentSize;
// Code from CCSprite.m - iniWithTexture
[self setTexture:texture];
[self setTextureRect:rect];
return self;
}
第一个例子崩溃的原因是什么,第二个例子没有,它们之间的区别是什么?
感谢您的回答!
答案 0 :(得分:1)
好的,原因是CCSprite设计不好。如果我们查看CCSprite.h,我们可以找到:
-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect
{
NSAssert(texture!=nil, @"Invalid texture for sprite");
// IMPORTANT: [self init] and not [super init];
if( (self = [self init]) )
}
这就是原因。而不是[super init]
此方法调用[self init]
,并创建递归([self init]-[super InitWithFile:]-[self initWithTexture]-[self init]-...)
。
因此,解决此问题的最简单方法是 - 只需将init方法重命名为其他方法(例如“initialize”)并调用它而不是init:[[MyCustomSprite
alloc] initialize]
。
答案 1 :(得分:0)
另一种可能有用的方法就是用这个替换你的代码:
- (id)init
{
self = [super init];
if (self != nil)
{
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"my_image_name.png"];
CGRect rect = CGRectZero;
if (texture != nil)
{
rect.size = texture.contentSize;
}
[self setDisplayFrame:[CCSpriteFrame frameWithTexture:texture rect:rect]];
}
return self;
}
更简单的方法是,如果您使用的是CCSpriteFrameCache,则只需设置显示框
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@“my_image_name.png”]
希望能帮助别人!