2012-04-25 10 views
0

昨日同様のスレッドを作成しましたが、詳細が不足しているためほとんど応答がありませんでした。私はもっ​​と徹底的になるつもりです。Cocos2d:クラスまたはインスタンスメソッドを使用して正しく子スプライトを作成できないようです。

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

多分、私はこれが完全にどのように機能するのか分かりませんし、間違ったアプローチをしなければならないかもしれません。もし誰かが私にこのことを一度だけ理解してもらうことができたら、それは大いに感謝されます!

私はもう一度成功しなかった良い例を見つけました。これはまったく表示されません。

ここで私は完全に働いたこと、私が持っていたものをお見せすることができます

を(.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のclassメソッド呼び出しの後、私はselectionScreenOverlaySpriteで親オブジェクトをチェックしました。それはゼロです。

答えて

1

コードの最初のビットでは、プロパティに正しくアクセスしていません。あなたはあなたのコードであなたが直接ivarにアクセスしているプロパティで取得するために、自己ポインタを使用する必要があります。今では理論上のARCでは、とにかくまだivarに正しいretain/releaseをしているはずです。 2番目の例では

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

、spriteSheetはすぐに新しい価値を持つ二行目に上書きメソッドに渡されるパラメータであるので、どんなspriteSheetにあったことは、今失われています。それはコードの残りの部分に依存するかもしれませんが、共有メソッドを呼び出す人はスプライトシートを参照する方法がありません。

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

+0

ありがとうございます。 "私の共有メソッドを呼び出す人は誰でもスプライトシートを参照する方法がありません"というのは興味深いことです。それは親の財産を失うのですか?私はARCなしで0.95のCocos2Dの編集版を使用しています。 – VagueExplanation

+0

いいえ、共有メソッドの変数を変更しても、そのメソッドを呼び出した人に自動的に値がコピーされるわけではありません。宣言する必要があるでしょう**メソッドシグネチャの型と* var = blah;それは呼び出し元に値をコピーします。 – russbishop

関連する問題