1

プレイヤーが出口まで上がり、次のレベルに移動するゲームを作っています。プロジェクトをコンパイルすると、次のメッセージが表示されます。EXC_BAD_ACCESS (code = 2, address = 0x791)

このコードを使用して、出口をセットアップします。

_exit = [CCSprite spriteWithSpriteFrameName:@"exit.png"];
    CGPoint exitTileCoord = ccp(908, 980);
    CGPoint exitTilePos = [self positionForTileCoord:exitTileCoord];
    _exit.position = exitTilePos;
    [_batchNode addChild:_exit];

そして、次のコードを使用して、プレーヤーが出口に到達したかどうかを確認します。

CGRect tankBoundingBox = CGRectMake(_tank.position.x - _tank.contentSize.width/2, _tank.position.y + _tank.contentSize.height, _tank.contentSize.width, _tank.contentSize.height);
CGRect exitBoundingBox = CGRectMake(_exit.position.x - _exit.contentSize.width/2, _exit.position.y + _exit.contentSize.height, _exit.contentSize.width, _exit.contentSize.height);
for (Tank *enemy in _enemyTanks) {
                if (CGRectIntersectsRect(sprite.boundingBox, enemy.boundingBox)) {

                    [childrenToRemove addObject:sprite];
                    enemy.hp--;
                    if (enemy.hp <= 0) {
                        [_enemyTanks removeObject:enemy];
                        [childrenToRemove addObject:enemy];
                    } else {
                    }
                }
            }

exitBoundingBox を設定した行でエラーが発生しますが、tankBoundingBox では発生しません。誰かが私が間違っていることを教えてもらえますか?

参考になれば、私はRay Wenderlich のチュートリアルを使用してこれを行っており、コードを彼の Web サイトにあるとおりにコピーしました (ただし、BoundingBoxes に追加しました)。

4

2 に答える 2

1

コードの問題は、いくつかのオブジェクトの位置を使用して CGRect を構築していることです。ええと、実際の問題は、位置を取得したオブジェクトの 1 つが解放されることです。NSZombie を使用してどれを検出し、問題を修正する必要があります。 これを行う方法を説明するリファレンスを次に示します。

編集: タンク オブジェクトが問題であると思われますが、それに関するコードをさらに確認する必要があります。EDIT2:ccpとして定義されていCGRectMakeます。だから違いはありません。

于 2012-07-17T21:45:35.050 に答える
1

OPのコメントに基づく:

ccp がどのように機能するかはわかりませんが、cgrect の構築に使用している値の 1 つが汚れているようです。

于 2012-07-17T22:39:47.990 に答える