1

このようなデータを保持する Textures というクラスがあります

//Textures.h
#import <Foundation/Foundation.h>

@interface Textures
{
    CCTexture2D *Balloon_RED;
    CCTexture2D *Balloon_POP;
}
@property (nonatomic, retain) CCTexture2D* Balloon_RED;
@property (nonatomic, retain) CCTexture2D* Balloon_POP;

-(void)setTextures;
+(CCTexture2D*) cacheImg: (NSString*) image;
@end

//Textures.m
#import "Textures.h"

@implementation Textures
@synthesize Balloon_RED;
@synthesize Balloon_POP;
-(void)setTextures
{
    Balloon_RED = [Textures cacheImg:@"red.png"];
    Balloon_POP = [Textures cacheImg:@"pop.png"];
}
+(CCTexture2D*)cacheImg: (NSString*)image
{
    return [[CCTextureCache sharedTextureCache] addImage:image];
}
@end

そして、私はそれをメインクラスで次のように使用します: ( SpriteTexturesは「Textures」タイプで、BalloonSpriteはCCSpriteのサブクラスである「Balloon 」タイプです)

[SpriteTextures setTextures];
BalloonSprite = [Balloon spriteWithTexture: [SpriteTextures Balloon_RED]];

スプラッシュ スクリーンがロードされた後、使用しているテクスチャが無効であるというエラーが表示されます。

Assertion failure in -[Balloon initWithTexture:], /Users/Mark/Kobold2D/Kobold2D-1.0.5/__Kobold2D__/libs/cocos2d-iphone/cocos2d/CCSprite.m:192
2012-03-02 20:00:18.011 Game-iOS[1341:1ca03] ERROR: Uncaught exception Invalid texture for sprite
2012-03-02 20:00:18.011 Game-iOS[1341:1ca03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid texture for sprite'

追加情報は、エラー ログでわかるように、私は Kobold を使用していることですが、実際には違いはありません。おそらくどこかで何か間違ったことをしていると確信しています。

どんな助けでも大歓迎です、ありがとう!

リソースフォルダーがどのように見えるかを 編集します。それらは物理ドライブのフォルダーにもあります。リソース フォルダー

また、これは問題なく機能します(メインクラスに texture2ds を追加)

Texture_RED = [[CCTextureCache sharedTextureCache] addImage:@"red.png"];
Texture_POP = [[CCTextureCache sharedTextureCache] addImage:@"pop.png"];

BalloonSprite = [Balloon spriteWithTexture: Texture_RED];

それとも、全体として、100 近くの異なる画像を含むゲームのために、多くのスプライト (テクスチャを変更する必要があるもの) を整理するためのより良い方法はありますか?

編集

メインクラス (*.h)

#import "Textures.h"

@interface MainClass : CCLayer
{
    Textures *SpriteTextures;
}
-(void)loop;
@property (retain) Textures *SpriteTextures;

実装

-(id) init
{
    if ((self = [super init]))
    {
        self.isTouchEnabled = true;
        [SpriteTextures setTextures];

        BalloonSprite = [Balloon spriteWithTexture: [SpriteTextures Balloon_RED]];
        .......
4

2 に答える 2

1

NSAssertsは本当に苦痛ですが、その上にメッセージが役に立たない場合:) ...わかりました、cocos2d(CCSprite)の行192を見ると、テクスチャはnilです(アサートの失敗を引き起こします)。sharedTextureCacheに追加するときに、テクスチャに対してこれらに類似したメッセージが表示されるかどうかを確認してください。

2012-03-02 21:19:43.497 MyGame [55224:12203] cocos2d:CCTexture2D。テクスチャを作成できません。UIImageはnilです

2012-03-02 21:19:43.498 MyGame [55224:12203] cocos2d:CCTextureCacheにimage:a.pngを追加できませんでした

そうした場合、テクスチャは見つかりませんでした。それらがリソースフォルダにあること、およびそれらが構築しているターゲットのメンバーであることを確認してください。

パート2:コードを再読み込みするだけで、ステートメントでSpriteTexturesがnilの場合、同じエラーが発生します

[SpriteTextures setTextures];
BalloonSprite = [Balloon spriteWithTexture: [SpriteTextures Balloon_RED]];

それは、それが一方の場所では機能するが、もう一方の場所では機能しない理由を説明することができます。

パート3:クラスinitでSpritTexturesを初期化または設定していません。試す:

    self.isTouchEnabled = true;
    self.SpriteTextures = [[Textures alloc] init];
    [SpriteTextures setTextures];
于 2012-03-03T02:25:47.727 に答える
1

答えはあなたが思っているよりも簡単だと思います..!

Texture_RED = [[CCTextureCache sharedTextureCache] addImage:@"red.png"];
Texture_POP = [[CCTextureCache sharedTextureCache] addImage:@"pop.png"];

テクスチャは保持されません。試す:

self.Texture_RED = [[CCTextureCache sharedTextureCache] addImage:@"red.png"];
self.Texture_POP = [[CCTextureCache sharedTextureCache] addImage:@"pop.png"];

理由が必要な場合は、ここに私の理由を示します。

        if( tex )
            [textures_ setObject: tex forKey:path];
        else
            CCLOG(@"cocos2d: Couldn't add image:%@ in CCTextureCache", path);

        // autorelease prevents possible crash in multithreaded environments
        [tex autorelease];  

以前のコードは、

CCTextureCache addImage:

つまり、テクスチャを保持する必要があります。

さらに、CCTextureCache によって別の場所に何らかの形で保持されていたとしても、OS からメモリ警告を受信するとキャッシュが消去され、ゲームがクラッシュする可能性があります。

于 2012-03-03T09:01:49.817 に答える