我有一个基于cocos2d的iphone应用程序有问题。当用户暂停游戏然后点击恢复按钮时,一些CCSprites将从屏幕上消失。 此行为是随机的,没有遵循模式。我只知道这只会在用户恢复游戏时发生。
这是代码,我做错了什么? 我首先想到它可能是一个内存管理问题,但是当用户点击恢复时我从未得到任何EXC_BAD_ACCESS ...所以精灵可能仍然存在。
精灵是我称之为“myobject”的对象中的一个属性。
在myObject.h中我有:
@interface myObject : CCNode{
CCSprite *_sprite1,*_sprite2;
// some other code
}
@property (nonatomic,retain) CCSprite *sprite1,*sprite2;
在myObject.m文件中:
@synthesize sprite1=_sprite1;
@synthesize sprite2=_sprite2;
+(id)create:(CCLayer*)scene{
myobject.sprite1 = [CCSprite spriteWithFile:spriteFile];
[scene addChild:myobject.sprite1];
// same for sprite2
}
-(void) move:(ccTime)dt{
//SOMECODE
self.sprite1.position=ccp(self.x,self.y); // same for sprite2
}
然后他们会在myobject上调用一个函数。
在主场景中,以下是这些对象的创建和移动方式:
myObject *myObject;
NSMutableArray *_myObjects;
@implementation HelloWorld
+(id) scene
{
CCScene *scene = [CCScene node];
HelloWorld *layer = [HelloWorld node];
[scene addChild:layer z:0 tag:33];
return scene;
}
-(id) init
{
if( (self=[super init] )) {
_myObjects = [[NSMutableArray alloc] init];
// some other code
}
}
-(void) addObject(){
myObject=[myObject create:self];
[_fallingObjects addObject:fallingObject];
}
-(void) nextFrame:(ccTime) dt{
for(myObject *theObject in _myObjects){
[theObject move:dt];
}
}
// And here is the function that does the pause/unpause, here it is:
- (void) pauseGame{
if(pauseStatus==0){
[[CCDirector sharedDirector] pause];
pauseStatus=1;
// some code to display menu etc... such as:
[self addChild:pauseMenu z:10];
}
else{
[self removeChild:pauseMenu cleanup:YES];
[self removeChild:scoreLabel cleanup:YES];
[self removeChild:highscoreLabel cleanup:YES];
[self removeChild:titleLabel cleanup:YES];
[self removeChild:pauseLayer cleanup:YES];
[[CCDirector sharedDirector] resume];
pauseStatus=0;
}
}
== EDIT ===
我发现这个问题对于我直接添加到场景中的精灵来说也是如此,例如添加的精灵小丑如下所示:
CCSprite *clown;
@implementation HelloWorld
-(id) init
{
if( (self=[super init] )) {
// some code
clown = [[CCSprite spriteWithFile:@"clown.png"] retain];
[self addChild:clown z:2];
// some more code
}
}
@end
==编辑结束===
答案 0 :(得分:0)
您的设置有些奇怪。 FallingObject是一个包含两个精灵的CCNode。然而,不是将精灵添加到FallingObject类(self),然后将FallingObject添加到场景中,而是将精灵直接添加到场景中。这会将FallingObject节点保留在场景层次结构之外。
这也是为什么你必须手动更新精灵位置,否则根本不需要代码的原因:
self.sprite1.position=ccp(self.x,self.y);
对于它的价值,我认为由于此设置的不一致,您可能会意外地将精灵移动到屏幕外,或者节点未正确暂停或恢复。