Cocos2D CCTexture2D“保持类” - 错误

时间:2012-03-03 01:20:07

标签: objective-c cocos2d-iphone textures kobold2d

我有一个名为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 的类型为“气球”,这是我的<的子类强> 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,因为您可以在错误日志中看到,但这不应该真正有所作为我确定我可能在某处做错了。< / p>

感谢任何帮助,谢谢!

修改 资源文件夹的外观如何,它们也位于物理驱动器的文件夹中。 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 个答案:

答案 0 :(得分:1)

NSAsserts是一个真正的痛苦,但是当它在它之上时,消息是无用的:) ...好吧,看看cocos2d(CCSprite)中的第192行,纹理是nil(导致断言失败)。将它们添加到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:无法在CCTextureCache中添加图片: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];

答案 1 :(得分: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以某种方式保留在其他位置,缓存也会在收到操作系统的内存警告时被清除,可能导致游戏崩溃。