Cocos2D CCTexture2D "Класс удержания" - Ошибка - PullRequest
1 голос
/ 03 марта 2012

У меня есть класс с именем 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 имеет тип " Текстуры " и BalloonSprite имеет тип " Balloon ", который является моим подклассом CCSprite )

[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, как вы можетесм. в журнале ошибок, но это не должно иметь никакого значения. Я уверен, что я, возможно, что-то делаю не так.

Любая помощь приветствуется, спасибо!

Редактировать Как выглядит папка ресурсов, они также находятся в папках физического диска.Resources folder

Кроме того, это прекрасно работает (добавление 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]];
        .......

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Я считаю, что ответ проще, чем вы думаете ..!

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 каким-то образом сохранил его где-то еще, кэш очищается при получении предупреждения от памяти ОС, что может привести к аварийному завершению вашей игры.

1 голос
/ 03 марта 2012

NSAsserts - это настоящая боль, но когда это сообщение бесполезно :) ... хорошо, глядя на строку 192 в cocos2d (CCSprite), текстура равна нулю (вызывая ошибку подтверждения). Проверьте, есть ли у вас сообщения, подобные этим, для ваших текстур при добавлении их в sharedTextureCache.

2012-03-02 21: 19: 43.497 MyGame [55224: 12203] cocos2d: CCTexture2D. Не могу создать текстуру. UIImage - ноль

2012-03-02 21: 19: 43.498 MyGame [55224: 12203] cocos2d: Не удалось добавить изображение: a.png в CCTextureCache

Если вы это сделали, текстуры не были найдены. Убедитесь, что они находятся в вашей папке ресурсов, а также что они являются членами цели, которую вы строите.

часть 2: просто перечитав код, вы получите ту же ошибку, если SpriteTextures равняется нулю в выражении

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

Это может объяснить, почему это работает в одном месте, а не в другом.

часть 3: вы не инициализируете и не устанавливаете SpritTextures в своем классе init. Попробуйте:

    self.isTouchEnabled = true;
    self.SpriteTextures = [[Textures alloc] init];
    [SpriteTextures setTextures];
...