我在與目標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方法中的塊,它的作品(當然我想這觸發運動之後已完成)。
任何人都可以幫助我,我做錯了什麼。我甚至使用正確的機制?
(道歉的格式不正確,不完整的代碼段)
謝謝你很多斯文。整個下午我的腦袋一直在攪亂。我沒有意識到我需要「自我」。我認爲它是在相同的背景下,所以不需要它。我來自C++和C#背景,所以這對我來說是相當新的領域。 – Buzzrick