私は 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 コードを調べてみたところ、ここでエラーが発生していることがわかりました。エラーの後、image
nil になります。
UIImage *image = [[UIImage alloc] initWithContentsOfFile:fullpath];
ログのエラーに画像のサイズが出力されるため、画像を見つけていることがわかります。Google でこのエラー メッセージを見た人を他に見つけられないようです。
現在、すべてのスプライト作成コードの前に DPad コードを配置することで、このバグを回避しています。これにより、バグの発生が停止しているように見えますが、なぜこれが発生しているのかを突き止めたいと思います。散発的なバグは、それらを理解できるようになるまで私を非常に緊張させます.