我有一个名为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>
感谢任何帮助,谢谢!
修改 资源文件夹的外观如何,它们也位于物理驱动器的文件夹中。
此外,这很好用(将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]];
.......
答案 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以某种方式保留在其他位置,缓存也会在收到操作系统的内存警告时被清除,可能导致游戏崩溃。