0

昨日も同様のスレッドを立てましたが、詳細が不足しているためか、ほとんど反応がありませんでした。もっと徹底していきます。

そのため、tmx マップが追加されたクラス (JoinedMapsLayer) をクリーンアップし、更新、描画などを実行しました。完全に成功せずに他のクラスに追加しようとしたメソッドがいくつかあります。スプライトを作成して画面に正常に表示するものもありますが、JoinedMapsLayer は、ヘッダー ファイルの元の場所であっても、スプライトを識別できないようです。したがって、 JoinedMapsLayer または他のクラスを使用して削除することはできません。ブレークポイントが追加された後 (どこに追加されても) ブレークポイントを設定しようとしましたが、コンソールに po [spritename] と入力すると、nil が表示されます。

たぶん、これがどのように機能するかを完全に理解していないだけで、間違ったアプローチをとっているに違いありません。誰かがこれを完全に理解するのを手伝ってくれるなら、それは大歓迎です!

私はまだ成功していない良い例に出くわしました。こいつは全く登場しない。

ここで、私が以前持っていたものが完全に機能していたことを紹介できます。

(.h) 私が持っている JoinedMapsLayer のインターフェイス:

CCSprite *selectionScreenOverlaySprite;
CCSpriteBatchNode * selectionScreenOverlaySpriteSheet;

私のプロパティ:

@property(nonatomic, retain) CCSprite *selectionScreenOverlaySprite;
@property(nonatomic, retain) CCSpriteBatchNode *selectionScreenOverlaySpriteSheet;

メソッドを宣言します。

-(void) addSelectionScreenOverlay;

(.m) プロパティを合成します。

@synthesize selectionScreenOverlaySprite, selectionScreenOverlaySpriteSheet;

私の方法:

-(void) addSelectionScreenOverlay {

    // overlay

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    selectionScreenOverlaySpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    selectionScreenOverlaySprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [selectionScreenOverlaySpriteSheet addChild:selectionScreenOverlaySprite];

    [self addChild:selectionScreenOverlaySpriteSheet z:13];

    selectionScreenOverlaySprite.position = [self convertToNodeSpace:CGPointMake(512, 384)];
    selectionScreenOverlaySprite.scale = 260;

    selectionScreenOverlaySprite.opacity = 0;

}

それでうまくいきます...


しかし、ヘッダーに SpriteFX.h というクラスをインポートして新しいメソッドを呼び出しても、何も起こりませんか?

次のようにクラス メソッドを呼び出します。

[SpriteFX addSelectionScreenOverlayOnLayer:self
                                withSprite:selectionScreenOverlaySprite
                           withSpriteSheet:selectionScreenOverlaySpriteSheet];

そして、次のように SpriteFX.h で宣言されたメソッドがあります。

+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet;

SpriteFX.m の私のメソッドは次のようになります。

+(void) addSelectionScreenOverlayOnLayer:(CCLayer*)layer
                              withSprite:(CCSprite*)sprite
                         withSpriteSheet:(CCSpriteBatchNode*)spriteSheet {

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"selectionScreenOverlay.plist"];

    spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

    NSMutableArray *selectionScreenFrames = [NSMutableArray array];

    [selectionScreenFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"selectionScreenOverlay.png"]]];

    sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"selectionScreenOverlay.png"]];  

    [spriteSheet addChild:sprite];

    [layer addChild:spriteSheet z:13];

    sprite.position = [layer convertToNodeSpace:CGPointMake(512, 384)];
    sprite.scale = 260;

    sprite.opacity = 0;
}

豆なし

私が自分自身をCCLayerとして渡しているので、正しくアンダーサンドすると、クラスメソッドのレイヤーはJoinedMapsLayerのCCLayerを指すはずです。また、渡されるスプライトとスプライト シートは JoinedMapsLayer を指している必要があるため、すべて同じように機能するはずですが、そうではありません。

JoinedMapsLayer でクラス メソッドを呼び出した後、selectionScreenOverlaySprite で親オブジェクトを確認しました。ゼロです。

4

1 に答える 1

1

コードの最初の部分では、プロパティに正しくアクセスしていません。プロパティを取得するには、セルフポインタを使用する必要があります...コードでは、ivarに直接アクセスしているだけです。理論的にはARCを使用すると、とにかくivarで正しい保持/解放を実行するはずですが、それでもなおです。

self.selectionScreenOverlaySpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"selectionScreenOverlay.png"];

2番目の例では、spriteSheetはメソッドに渡されるパラメーターであり、2行目ですぐに新しい値で上書きするため、spriteSheetにあったものはすべて失われます。コードの残りの部分によっては問題になる場合と問題にならない場合がありますが、共有メソッドを呼び出す人は誰でもスプライトシートを参照する方法がありません。

ARCを使用している場合は、addChildを呼び出した直後にランタイムがspriteSheetを解放している可能性があります。私はそれらの参照がcocos2dでどのように設定されているかを正確に理解していませんが、それらが弱いか保持されていない場合は、それも問題になる可能性があります。

于 2012-04-25T23:44:56.153 に答える