Cocos2d初学者objc_msgSend EXC_BAD_ACCESS

时间:2012-11-03 23:43:44

标签: objective-c ios cocos2d-iphone ios6

我正在使用Objective C中的Cocos2d开发我的第一个iOS应用程序。我是目标c的新手,但我试图谷歌,但我找不到解决这个一般问题的方法。

-(void)accelerate{
     moveSpeed = 720.0 / 3.0;

     [self stopAllActions];
     _moving = FALSE;
     CCAnimation *walkAnim = [CCAnimation animationWithFrames:_walkAnimFrames delay:0.066f];
     self.walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
     CGPoint loc = ccp(500, 200);
     [self playerMoveTo:loc];
 }

-(void)playerMoveTo:(CGPoint)moveLocation{
     CGPoint moveDifference = ccpSub(moveLocation, self.position); //here is EXC_BAD_ACCESS
     float distanceToMove = ccpLength(moveDifference);
 }

这就是我从我的游戏场景中调用Player1加速的方式:

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [touch locationInView: [touch view]];
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];
    [self.Player1 accelerate];
}

Player1在我的gameScene中:

//implementation
@synthesize Player1 = _Player1;

//header
@property (nonatomic,retain) TPlayer *Player1;

感谢您的耐心和帮助。我不确定我应该把这部分代码放在这里,所以请告诉我什么,我会添加它。

西蒙

编辑1: Player1在游戏场景的init函数中分配。 TPlayer是CCSprite的子类:

_Player1 = [[TPlayer alloc] initWithSpriteFrameName:@"walk2"];

EXC_BAD_ACCESS发生在这一行:

CGPoint moveDifference = ccpSub(moveLocation, self.position);

3 个答案:

答案 0 :(得分:0)

  • 属性应以小写字母开头(并且是camelCased)

  • 显示@synthesize属性的位置,而不是实际分配实例的位置。

类似的东西:

_player1 = [[Player alloc] init];

如果没有看到ccpSub()的回溯和定义,很难说更多。最好的猜测是,self.position返回一个无意义的值,使ccpSub()脱轨。 self被过度释放的可能性较小,但仍然可行,足以允许随后在调用[self position]时崩溃的方法调度。

答案 1 :(得分:0)

你现在有崩溃的解决方案......但是你的moveTo功能不正确。

-(void)playerMoveTo:(CGPoint)moveLocation{
     CGPoint moveDifference = ccpSub(moveLocation, self.position); //here is EXC_BAD_ACCESS
     float distanceToMove = ccpLength(moveDifference);

     [self runAction:[CCMoveTo actionWithDuration:1 position:moveLocation]];

 }

答案 2 :(得分:0)

由于内存问题,

self.position可能会崩溃。自我可能会被取消分配给你。你在运行什么版本的Xcode?在最新版本中,@ synthesize是不必要的,因为属性会自动为您合成。您也可以考虑将项目转换为ARC。我用我的Cocos2D项目完成了它,我很高兴我做到了。

你可以尝试:

_Player1 = [[[TPlayer alloc] initWithSpriteFrameName:@"walk2"] autorelease];

或初始化后手动提升引用计数:

[self.Player1 retain];

看看是否有帮助。这就是我喜欢ARC的原因:)。