1

すべて一緒に移動および回転するいくつかの複合スプライトを作成する必要があります。AtlasSpriteManagerの位置と回転を変更できるので、サブクラス化して、次のようなショートカットを作成できるようにしました。

CompoundSprite *cSprite = [CompoundSprite spriteManagerWithFile:@"sprites.png"];
[cSprite makeComplexSprite];

内部的には、このように少し見えます

-(void)makeComplexSprite
{
        AtlasSprite *sp1 = [[AtlasSprite spriteWithRect:CGRectMake(0, 0, 64, 64)       
                             spriteManager:self] retain];
        AtlasSprite *sp2 = [[AtlasSprite spriteWithRect:CGRectMake(0, 0, 64, 64) 
                             spriteManager:self] retain];

    [self addChild:sp1];
    [self addChild:sp2];


    [sp1 setPosition:CGPointMake(0,0)];
    [sp2 setPosition:CGPointMake(64,0)];

}

ただし、アプリケーションを実行すると、次の例外でクラッシュします

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -[AtlasSpriteManager makeComplexSprite]: unrecognized selector sent to 
instance 0x107e1c0

また、「MakeComplexSprite」内のすべてのコードを削除して何もしないようにすると、同じ問題が発生します。

AtlasSpriteManagerはサブクラス化されたくないようです。これは本当ですか?もしそうなら、なぜ、そしてどのように私はそれを回避することができますか?

アップデート:

atlasSpriteManagerを含むNSObjectを作成することで、回避策を見つけました。それでうまくいきますが、可能であればAtlasSpriteManagerをサブクラス化したいと思います。あなたが説明するように、私はこのexacltyを実装しているようです。このようなインスタンスを作成しています

CompoundSprite *cSprite = [CompoundSprite spriteManagerWithFile:@"file.png"]; 
[cSprite makeBox]; 

これは...今考えてみると、返されるのはcSpriteがまだAtlasSpriteManagerであることを意味します。うーん。どうすれば変更できますか?

4

2 に答える 2

2

独自のspriteManagerWithFile:またはcompoundSpriteWithFile:をCompoundSpriteに実装します。これにより、CompoundSpriteのインスタンスが返されます。

編集:

または、次のようなことができます

[[ComplexSprite alloc] makeComplexSprite];

ただし、「spriteManagerWithFile:」の部分も実行する必要があります。好き:

-(id)makeComplexSpriteWithFile:(NSString*)file
{
    if (! (self = [super initWithSpriteManager:..capacity:..]))
       return nil;

    // do your ComplexSprite specific initializing here..

    return self;
}
于 2009-11-16T18:23:29.107 に答える
1

表示されているランタイムエラーは、プログラムがmakeComplexSpriteメッセージをオブジェクトに送信しようとしたが、そのオブジェクトに対してそのようなメソッドが定義されていないことを示しています。

カスタムクラスのインスタンスmakeComplexSpriteではなく、のインスタンスにメッセージを送信しているようです。サンプルコードは正しいように見えますが、サブクラス化はどのように行っていますか?次のようになります。AtlasSpriteManagerCompoundSprite

CompoundSprite.h

@interface CompoundSprite : AtlasSpriteManager
{

}
- (void)makeComplexSprite;
@end

CompoundSprite.m

@interface CompoundSprite
- (void)makeComplexSprite
{
    ...
}
@end

サブクラス化が適切に設定されている場合は、誤って他のオブジェクトではなくmakeComplexSprite、のインスタンスを実際に呼び出していることを確認してください。CompoundSprite

また:

コードサンプルにメモリリークがあります。2つの自動解放されたスプライトを作成し、それらを保持し(つまり、クラスがそれらの所有権を取得します)、決して解放しません。AddChild:メソッドはオブジェクトを自動的に保持するため、呼び出しを失うだけでretain、すべてが正常になります。

于 2009-11-16T14:25:40.270 に答える