4

私は Objective-c と cocos2d を使用していますが、一見無関係に見える 2 つのコードを組み合わせると、奇妙なエラーが発生します。

レイヤーの init に疑わしいコード。

/* sprite setup */

CCSprite *sprite = [ [ [ StaticSprite alloc ] initWithSheetName: @"001-Fighter01" atPosition: ccp( 200, 200 ) withColumn: 0 withRow: 1 ] autorelease ];
[ map.spriteLayer addChild: sprite ];
CCSprite *sprite2 = [ [ [ StaticSprite alloc ] initWithSheetName: @"001-Fighter01" atPosition: ccp( 250, 200 ) withColumn: 0 withRow: 1 ] autorelease ];
[ map.spriteLayer addChild: sprite2 ];
CCSprite *sprite3 = [ [ [ StaticSprite alloc ] initWithSheetName: @"001-Fighter01" atPosition: ccp( 200, 250 ) withColumn: 0 withRow: 1 ] autorelease ];
[ map.spriteLayer addChild: sprite3 ];

/* ui setup */

// dpad
dPadUI = [ DPad node ];
[ self addChild: dPadUI ];

DPad の作成でエラーCGImageProviderCreate: invalid image provider size: 55 x 36が発生し、クラッシュが発生します。奇妙な部分は、sprite setupコードを削除するとDPadコードが正常に動作し、DPadコードを削除するとスプライトコードが正常に動作することですが、どういうわけか両方が存在するとエラーが発生します.

StaticSprite は、CCSprite クラスの非常に単純な拡張です。

@implementation StaticSprite

- ( id ) initWithSheetName: ( NSString * ) sheetName atPosition: ( CGPoint ) initPosition withColumn: ( int ) column withRow: ( int ) row {

    // setup frames
    [ [ CCSpriteFrameCache sharedSpriteFrameCache ] addSpriteFramesWithFile: [ NSString stringWithFormat: @"%@.plist", sheetName ] ];

    if ( self = [ super initWithSpriteFrameName:[ NSString stringWithFormat: @"%@-%d,%d.png", sheetName, column, row ] ] ) {

        int halfSize = [ Geometry spriteHalfSizeFromRect: [ self boundingBox ] ];
        self.anchorPoint = ccp( .5, halfSize / [ self boundingBox ].size.height );

        self.position = initPosition;
        self.zOrder = -self.position.y;
    }

    return self;
}

@end

DPad は、CCSprite のかなり単純な拡張でもあります。

@implementation DPad

- ( id ) init {
    if ( self = [ super initWithFile: @"dPad.png" ] ) {
        self.anchorPoint = ccp( 18 / [ self boundingBox ].size.width, .5 );
        self.visible = false;
        self.blendFunc = ( ccBlendFunc ) { GL_SRC_ALPHA, GL_ONE };
        self.opacity = 64;
    }
    return self;
}

- ( void ) activateWithDirection: ( double ) angle {
    self.visible = true;
    [ self setRotation: CC_RADIANS_TO_DEGREES( -angle ) ];
}

- ( void ) deactivate {
    self.visible = false;
}

@end

さまざまな画像の静的スプライトを問題なく追加できるようで、DPad 画像はかなり小さいです。これらのコード セクションが両方とも単独で機能するのに、同じアプリで一緒に使用すると奇妙なエラーが発生するのはなぜですか?

DPadinitメソッドの名前を に変更してみましたinitDefault

編集

cocos2d コードを調べてみたところ、ここでエラーが発生していることがわかりました。エラーの後、imagenil になります。

UIImage *image = [[UIImage alloc] initWithContentsOfFile:fullpath];

ログのエラーに画像のサイズが出力されるため、画像を見つけていることがわかります。Google でこのエラー メッセージを見た人を他に見つけられないようです。

現在、すべてのスプライト作成コードの前に DPad コードを配置することで、このバグを回避しています。これにより、バグの発生が停止しているように見えますが、なぜこれが発生しているのかを突き止めたいと思います。散発的なバグは、それらを理解できるようになるまで私を非常に緊張させます.

4

2 に答える 2

3

うわー、これは奇妙なものです。コードのどこかに のmax代わりに がありMAX、これがコード全体であらゆる種類の大混乱を引き起こしていました。過去数日間、私が嘆いていた原因不明の 3 つのバグは、1 回の変更ですべて解消されました。何らかの理由maxで、私のコードで を使用すると、説明のつかない floatValue が nil を返すようになり、オブジェクトを配列に追加すると説明のつかない不正なアクセス エラーが発生するまで、すべてが引き起こされました。

助けてくれたすべての人に感謝します。

于 2013-01-15T00:53:26.193 に答える
1

これはロングショットですが、xcodeはエラーのファイル名が別の場所にあると「考えている」と思われます。現在の画像を削除し、まだ使用していない新しい名前 (testMeNow.jpg) を付けてプロジェクトに再コピーし、試してみることをお勧めします。

于 2013-01-14T13:48:28.387 に答える