2

なぜ次のことが起こっているのか理解できません。誰かがここで説明してくれることを願っています。

GameLayer (CCLayer) クラスと Food (CCNode) クラスがあります。

Gamelayer クラスでは、プロパティとしてスプライトを持つ一連の食品オブジェクトを作成します。そして、これらのスプライトを CCSpriteBatchNode に追加したいと考えています。

spriteBatch = [CCSpriteBatchNode batchNodeWithFile:@"bol.png"];
[self addChild:spriteBatch]; 
for (int i = 0; i < 1000; i++) {

   Food * tempfood = [Food foodWithParentNode:self];

   [spriteBatch addChild:[tempfood mySprite]];

   [self addChild:tempfood];

 }

上記のコードを使用すると、スプライトはすべて画面に表示されますが、移動しません。(フード クラスの更新をスケジュールし (以下を参照)、この更新では食品オブジェクトの位置が変更されているため、そうする必要があります)

-(id)initWithParentNode:(CCNode *)parentNode{

if((self = [super init]))
{
    mySprite = [CCSprite spriteWithFile:@"bol.png"];

    CGSize screenSize = [[CCDirector sharedDirector] winSize];

    [[self mySprite] setPosition:CGPointMake(screenSize.width/2, screenSize.height/2)];

    [self scheduleUpdate];

}

return self;
}
-(void) update:(ccTime)delta
{
  ... DO SOME position calculations ...

 [[self mySprite] setPosition:CGPointMake(newX, newY)];
}

しかし、バッチにスプライトを追加するコードを Game クラスから food クラスに移動すると、位置を変更する更新が機能し、食品が画面上で移動します。しかし、なぜ?

したがって、これは次のようになります。

-(id)initWithParentNode:(CCNode *)parentNode{

if((self = [super init]))
{
    mySprite = [CCSprite spriteWithFile:@"bol.png"];

    CGSize screenSize = [[CCDirector sharedDirector] winSize];

    [[self mySprite] setPosition:CGPointMake(screenSize.width/2, screenSize.height/2)];

    [[ (GameLayer*) parentNode spriteBatch] addChild:mySprite];

    [self scheduleUpdate];

}

return self;
}

私は本当に呼び出しの違いを見ることができません

[[ (GameLayer*) parentNode spriteBatch] addChild:mySprite];

食品クラスまたは :

[spriteBatch addChild:[tempfood mySprite]];

「親」GameLayer から

4

1 に答える 1

1

ルーベン、mySprite は保持属性を持つプロパティですか? Food クラスは、このプロパティのメモリ参照を失っている可能性があります...

init で、self.mySprite を使用して mySprite を設定し、これを保持します。

.m または .h では、次のように入力します。

@property (nonatomic, retain) CCSprite *mySprite

初期化では、次を使用します。

self.mySprite = [CCSprite spriteWithFile:@"bol.png"];
于 2013-06-10T15:32:03.233 に答える