gpt4 book ai didi

objective-c - 在 sprite.runAction 之后调用 Block 时崩溃

转载 作者:行者123 更新时间:2023-11-29 11:13:00 25 4
gpt4 key购买 nike

我在使用 Objective C 时遇到了问题。我试图在移动 Sprite 后调用 block

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

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

我的 Actor 类是这样定义的

// -----------------------------
// 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

如您所见,我试图将 block 存储在 onMoveComplete 参数中(我也在私有(private)变量中尝试过),然后在 Sprite 移动完成后调用它。

在我的调用类中,我正在遍历一堆 Actor (敌人),我想在移动完成后为每个 Actor 调用这个匿名代码块:

{
[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 block 时,我不断收到 EXC_BAD_ACCESS 错误有趣的是,如果我尝试调用 moveTo 方法中的 block ,它会起作用(但我当然希望它在移动完成后触发)。

任何人都可以帮助我解决我做错的事情。我什至使用了正确的机制吗?

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

最佳答案

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

使用 self.onMoveCompleted = moveCompleted 分配您的 block ,您会没事的。

关于objective-c - 在 sprite.runAction 之后调用 Block 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10663290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com