Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在sprite.runAction之后调用块时崩溃_Objective C_Ios_Cocos2d Iphone_Objective C Blocks - Fatal编程技术网

Objective c 在sprite.runAction之后调用块时崩溃

Objective c 在sprite.runAction之后调用块时崩溃,objective-c,ios,cocos2d-iphone,objective-c-blocks,Objective C,Ios,Cocos2d Iphone,Objective C Blocks,我的目标C有问题。 我正试着在我移动了一个精灵后呼叫一个街区 我试图实现的简短版本是,我想移动阵列中的所有敌人,当每个敌人完成移动后,我想检查它们是否发生碰撞 下面的简化代码显示了我正在尝试做的事情 我的演员类定义如下 // ----------------------------- // Actor.h #import <Foundation/Foundation.h> #import "cocos2d.h" #import "ScreenObject.h" typedef v

我的目标C有问题。 我正试着在我移动了一个精灵后呼叫一个街区

我试图实现的简短版本是,我想移动阵列中的所有敌人,当每个敌人完成移动后,我想检查它们是否发生碰撞

下面的简化代码显示了我正在尝试做的事情

我的演员类定义如下

// -----------------------------
// 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
我的主课是这样的

//------------------------------
//
//  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\u BAD\u访问错误 有趣的是,如果我尝试调用moveTo方法中的块,它会工作(但我当然希望在移动完成后触发它)

谁能帮我解决我做错了什么。我是否使用了正确的机制


(对格式不正确、代码段不完整表示歉意)

您正确地将属性声明为copy,但您将实例变量直接设置为块的地址,而不使用生成的访问器。这意味着块在调用之前不会被复制和销毁


使用
self.onMoveCompleted=moveCompleted
分配块,您会很好。

非常感谢Sven。整个下午我都在胡思乱想。我没有意识到我需要“自我”。我假设它在相同的上下文中,所以不需要它。我来自C++和C语言背景,所以这对我来说是一个全新的领域。
//------------------------------
//
//  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