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;

ご理解とご協力をお願いいたします。ここにコードのどの部分を入れるべきかわからなかったので、教えてください。追加します。

サイモン

EDIT 1: Player1 は、ゲーム シーンの init 関数で割り当てられます。TPlayer は CCSprite のサブクラスです:

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

EXC_BAD_ACCESS は次の行で発生します。

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

3 に答える 3

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 がクラッシュする可能性があります。Self が割り当て解除されている可能性があります。実行している Xcode のバージョンは何ですか? 最新バージョンでは、プロパティが自動的に合成されるため、@synthesize は不要です。プロジェクトを ARC に変換することも検討してください。私は自分の Cocos2D プロジェクトでそれを行いました。満足しています。

あなたは試すことができます:

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

または、初期化後に参照カウントを手動で増やします。

[self.Player1 retain];

それが役立つかどうかを確認します。これが私がARCが好きな理由です:)

于 2012-11-04T10:47:13.600 に答える
0
  • プロパティは小文字で始める必要があります (キャメルケースにする必要があります)。

  • 実際にインスタンスを割り当てる場所ではなく、プロパティを @synthesize する場所を示します。

何かのようなもの:

_player1 = [[Player alloc] init];

バックトレースと の定義を見ずに、これ以上言うのは難しいですccpSub()。最良の推測は、それself.positionが無意味な値を返していることですccpSub()。それが過度にリリースされている可能性は低いですがself、メソッドのディスパッチを許可するのに十分な実行可能性があり、その後 の呼び出しでクラッシュし[self position]ます。

于 2012-11-04T00:13:07.577 に答える