0

我正在用 Objective C 中的 Cocos2d 开发我的第一个 iOS 应用程序。我是 Objective 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 分配在游戏场景的初始化函数中。TPlayer 是 CCSprite 的子类:

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

EXC_BAD_ACCESS 发生在这一行:

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

3 回答 3

0
  • 属性应该以小写字母开头(并且是驼峰式)

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

就像是:

_player1 = [[Player alloc] init];

如果没有看到回溯和定义,很难说更多ccpSub()。最好的猜测是self.position返回一个无意义的值,使ccpSub()出轨。不太可能是self过度发布,但仍然足够可行以允许随后在调用[self position].

于 2012-11-04T00:13:07.577 回答
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]];

 }
于 2012-11-04T10:31:38.260 回答
0

如前所述,由于内存问题,self.position 可能会崩溃。自我可能会被你释放。你运行的是什么版本的 Xcode?在最新版本中,@synthesize 是不必要的,因为属性会自动为您合成。您也可以考虑将您的项目转换为 ARC。我已经用我的 Cocos2D 项目完成了它,我很高兴我做到了。

你可以试试:

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

或在初始化后手动增加引用计数:

[self.Player1 retain];

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

于 2012-11-04T10:47:13.600 回答