1

カスタム 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」でクラッシュします。

しかし、これにもかかわらず、通常どおりにスーパーを初期化してから、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;
} 

最初の例がクラッシュし、2 番目の例がクラッシュしない理由と、それらの違いは何ですか?

回答ありがとうございます。

4

2 に答える 2

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]

于 2011-09-04T10:05:54.947 に答える
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"]

誰かを助けたい!

于 2012-02-14T08:09:58.280 に答える