我正在使用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);
答案 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的原因:)。