为简单起见,最简单的方法是在默认的HelloWorld Scene中将默认的[Menu]作为自己的图层。我现在遇到的问题是场景完全是黑色的,什么都没有出现!
GameLayer节点:
- (id)init
{
// Enable touch handling on scene node
self.userInteractionEnabled = YES;
self.theMap = [CCTiledMap tiledMapWithFile:@"AftermathRpg.tmx"];
self.contentSize = theMap.contentSize;
self.metaLayer = [theMap layerNamed:@"Meta"];
metaLayer.visible = NO;
CCTiledMapObjectGroup *objects = [theMap objectGroupNamed:@"mainChar"];
NSMutableDictionary *startPoint = [objects objectNamed:@"startPosition"];
int x = [[startPoint valueForKey:@"x"] intValue];
int y = [[startPoint valueForKey:@"y"] intValue];
self.mainChar = [CCSprite spriteWithImageNamed:@"mainChar.png"];
mainChar.position = ccp(x,y);
[self addChild:mainChar];
[self addChild:theMap z:-1];
[self setCenterOfScreen: mainChar.position];
return self;
}
HudLayer节点
-(id)init
{
CGSize winSize = [[CCDirector sharedDirector] viewSize];
CCButton *backButton = [CCButton buttonWithTitle:@"[ Menu ]" fontName:@"Verdana-Bold" fontSize:18.0f];
backButton.position = ccp(0.85f * winSize.width, 0.95f * winSize.height);
[backButton setTarget:self selector:@selector(onBackClicked:)];
[self addChild:backButton];
return self;
}
场景
+ (GameScene *)scene
{
return [[self alloc] init];
}
- (id)init
{
// Apple recommend assigning self with supers return value
self = [super init];
if (!self) return(nil);
CGSize winSize = [CCDirector sharedDirector].viewSize;
self.gameLayer = [GameLayer node];
[self addChild:gameLayer z:-1];
//self.contentSize = self.gameLayer.contentSize;
hudLayer = [HudLayer node];
hudLayer.position = ccp(winSize.width * 0.9, winSize.height * 0.9);
[self addChild:hudLayer z:1];
return self;
}
从OP中,我认为您有两个问题,其中一个是HUD不是静态的(即,它随着地图的移动而移动,这是您不希望的),并且HUD不在屏幕的顶部。
首先查看职位问题,您的职位已设置为归一化。由于场景的内容大小已设为地图的大小(我所选择的大小大于屏幕的大小),因此这就是为什么它显示在地图的右上角而不是屏幕上的原因。要解决此问题,请不要进行标准化定位。如果您仍然希望在0到1范围内表示位置,请使用(也删除将位置类型设置为归一化的行):
CGSize winSize = [[CCDirector sharedDirector] viewSize];
backButton.position = ccp(0.85f * winSize.width, 0.95f * winSize.height);
如果您的地图是10,000 x 10,000,则使用归一化的位置(如您所愿)将按钮设置为(8,500,9,500),而不是屏幕顶部。
接下来看静态问题,从它的外观看,您是否拥有Hello World场景,您将所有内容添加到正确的位置?看起来您正在通过以下方式移动Hello World场景:
[self setCenterOfScreen: player.position];
您想要做的是,首先要有一个场景:
HelloWorldScene* scene;
并向该场景添加两个“主要”层,其中一个是您的游戏层,作为主要游戏层的子级,另一层是您的HUD层,例如,可能类似于:
GameplayLayer* gameLayer;
HudLayer* hudLayer;
[scene addChild:gameLayer];
[scene addChild:hudLayer];
当玩家移动(或相机或其他任何东西)时,应该移动的是游戏的图层,而不是Hello World的根场景。移动根场景将移动它的所有子级,其中包括hud。那不是你想要的。
例如,当我从事Goldfish Mysteries应用程序(https://itunes.apple.com/us/app/finn-friends-mysteries/id740040227?mt=8)时,我基本上具有以下层次:
每当故事级别上发生移动时,它就会在故事层上发生。当出现HUD时,如果正在播放文字和故事层(即他们和他们的所有孩子)以及旁白音频,则它们将递归暂停(如果他们正在播放,但HUD层保持不变)。恢复包括恢复故事,文本和任何播放旁白。我不记得是否放掉平视显示器使该特定应用程序中的故事和文本层向下移动,因为我没有iPad在我面前,但是我过去做过的应用程序使放平视显示器改变了一切其他层。在那种情况下,对于一个简单的应用程序来说,移动场景会很好,因为场景只能移动到足以显示TOC的程度(例如,在这种类型的应用程序中)。您要做的就是随着玩家的移动来移动整个场景,
无论哪种方式,您都希望在层和仅在特定层上发生的操作之间实现清晰的分隔,应该只针对那些层。
希望这对您有所帮助。
更新(已编辑):
根据新编辑的OP,您遇到了一个新问题。对于hud,您不必设置图层的位置,因为在hud图层内部,相对于屏幕的所有内容都已经摆好了。因此,您应该拥有的是:
hudLayer = [HudLayer node];
[self addChild:hudLayer z:1];
第二个问题是您没有为游戏和Hud图层类正确编写init方法。初始化应如下所示:
- (instanceType)init
{
self = [super init];
if (self)
{
// Do your init stuff...
}
return self;
}
您永远不会打电话:
self = [super init];
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句