2012-05-19 100 views
1

我在與目標C. 我試圖調用塊後,我搬到一個精靈崩潰後sprite.runAction

的什麼,我想簡短的版本麻煩實現是我想要移動陣列中的所有敵人,當每個敵人完成移動時,我想檢查它是否發生了碰撞。

下面的簡化代碼顯示了我正在嘗試做什麼。

我的演員類的定義如下

// ----------------------------- 
// Actor.h 

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
#import "ScreenObject.h" 

typedef void (^actorMoveComplete)(void); 

@interface Actor : ScreenObject 
{ 
    // actorMoveComplete onMoveComplete; 
} 

@property (nonatomic) BOOL isMoving; 
@property (readwrite, copy) actorMoveComplete onMoveComplete; 
@property (nonatomic, retain) CCSprite* sprite; 

-(void) moveTo:(CGPoint)targetPosition Speed:(float) speed withCallback:(actorMoveComplete)moveComplete; 

@end 

// ----------------------------- 
// Actor.m 
#import "Actor.h" 

@implementation Actor 

@synthesize onMoveComplete; 
@synthesize sprite; 

-(void) moveTo:(CGPoint)targetPosition Speed:(float) speed withCallback:(actorMoveComplete)moveComplete; 
{ 
    onMoveComplete = moveComplete; 

    id actionMove = [CCMoveTo actionWithDuration:speed position:targetPosition]; 
    id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)]; 
    [super.sprite runAction:[CCSequence actions:actionMove, actionMoveDone, nil]]; 
} 

-(void) spriteMoveFinished:(id) sender 
{ 
    isMoving = NO; 
    if (onMoveComplete != nil) 
     onMoveComplete(); 
} 
@end 

正如你可以看到我想要存儲在一個onMoveComplete參數塊(我也一直試圖在一個私有變量),和然後在精靈移動完成後調用它。

在我的呼喚類即時迭代通過幫演員(敵人)的,我想呼籲每個演員這個匿名代碼塊一次,此舉已完成:

{ 
    [self checkForCollision:enemy]; 
} 

我調用類的樣子這個。

//------------------------------ 
// 
// GameLayer.h 

#import "cocos2d.h" 
#import "Actor.h" 

@interface GameLayer : CCLayerColor 
{ 
} 

@property (nonatomic, copy) NSMutableArray *enemies; 

- (void) updateEnemies; 
- (void) checkForCollision:(Actor*)actor; 
- (BOOL) isMapGridClear:(CGPoint)mapGrid excludeActor:(Actor*)actor; 

@end 


//------------------------------ 
// GameLayer.m 

#import "GameLayer.h" 


@implementation GameLayer 

@synthesize enemies; 

- (void) updateEnemies 
{ 

    for (Actor *enemy in enemies) 
    { 
     // 
     CGPoint newPosition = [self getNewPosition:enemy]; /* method to figure out new position */ 

     [enemy moveDelta:ccp(dX, dY) Speed:enemySpeed withCallback:^{ 
      [self checkForCollision:enemy]; 
     }]; 
    } 
} 


- (void) checkForCollision:(Actor*)actor 
{ 
    if (![self isMapGridClear:actor.gridPosition excludeActor:actor]) 
    { 
     actor.isCrashed=YES; 
     [actor loadSprite:self spriteImage:@"crashed.png"]; 
    } 
} 


- (BOOL) isMapGridClear:(CGPoint)mapGrid excludeActor:(Actor*)actor 
{ 
    /* Actual method figures out if there was a collision */ 
    return YES; 
} 

@end 

不幸的是,當我致電onMoveComplete塊,我不斷收到EXC_BAD_ACCESS錯誤 有趣的是,如果我嘗試調用moveTo方法中的塊,它的作品(當然我想這觸發運動之後已完成)。

任何人都可以幫助我,我做錯了什麼。我甚至使用正確的機制?

(道歉的格式不正確,不完整的代碼段)

回答

2

你正確地宣佈你的財產的副本,但您不使用生成的訪問直接設置你的實例變量塊的地址。這意味着該塊在調用之前不會被複制並被銷燬。

使用self.onMoveCompleted = moveCompleted指定你的區塊,你會沒事的。

+0

謝謝你很多斯文。整個下午我的腦袋一直在攪亂。我沒有意識到我需要「自我」。我認爲它是在相同的背景下,所以不需要它。我來自C++和C#背景,所以這對我來說是相當新的領域。 – Buzzrick