首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cocos2d: CCSprite initWithFile in CCSprite子类崩溃

Cocos2d: CCSprite initWithFile in CCSprite子类崩溃
EN

Stack Overflow用户
提问于 2011-09-03 22:52:50
回答 2查看 3.9K关注 0票数 1

我有一个带有自定义CCSprite子类的cocos2d项目:

MyCustomSprite.h:

代码语言:javascript
复制
#import "cocos2d.h"
@interface MyCustomSprite : CCSprite
@end

MyCustomSprite.m:

代码语言:javascript
复制
#import "MyCustomSprite.h"
@implementation MyCustomSprite
- (id)init
{
    self = [super initWithFile:@"index.png"];
    return self;
}
@end

由于某种奇怪的原因,这段代码将会崩溃,并带有"EXC_BAD_ACCESS“。

但是尽管如此,如果我将超级初始化为fine,然后从CCSprite的initWithFile和initWithTexture编写代码,它将工作得很好:

代码语言:javascript
复制
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;
} 

第一个例子崩溃的原因是什么,第二个没有崩溃,它们之间的区别是什么?

感谢您的回答!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-04 18:05:55

好吧,原因是糟糕的CCSprite设计。如果我们查看CCSprite.h,我们可以找到:

代码语言:javascript
复制
-(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]) )
}

这就是原因。此方法调用[self init]并创建递归([self init]-[super InitWithFile:]-[self initWithTexture]-[self init]-...),而不是[super init]

所以,解决这个问题的最简单方法就是将初始化方法重命名为其他名称(例如"initialize"),然后调用它而不是init:[[MyCustomSprite alloc] initialize]

票数 1
EN

Stack Overflow用户

发布于 2012-02-14 16:09:58

另一种可行的方法是用下面的代码替换你的代码:

代码语言:javascript
复制
- (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"]

希望能帮助到一些人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7293851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档