将Hud图层添加到场景Cocos2d-3

时间:2014-06-12 07:16:22

标签: iphone objective-c cocos2d-iphone cocos2d-iphone-3

为了简单起见,在默认的HelloWorld场景(例如)中将默认[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;
}

1 个答案:

答案 0 :(得分:1)

从OP我认为你有两个问题,一个是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;

在这个场景中你要添加两个" main"一层是你的游戏玩法层作为主要游戏玩法层的孩子,另一层是你的HUD层,例如它们看起来像:

GameplayLayer* gameLayer;
HudLayer* hudLayer;

[scene addChild:gameLayer];
[scene addChild:hudLayer];

当玩家移动(或相机或其他)时,应该移动的是游戏的层,而不是根Hello World场景。移动根场景将移动其所有子节点,其中包括hud。那不是你想要的。

当我工作时,例如,金鱼之谜应用程序(https://itunes.apple.com/us/app/finn-friends-mysteries/id740040227?mt=8)我基本上有以下层:

  • 故事(由多个子图层组成,如bg,字符等)
  • 文字(与旁白音频一起播放的突出显示文字)
  • HUD(由多个子层组成)

每当故事级别出现移动时,它就会发生在故事层上。当HUD出现时,文本和故事层被递归地暂停(即他们和他们所有的孩子)以及叙述音频(如果有的话)正在播放但是HUD层保持不变。恢复包括恢复故事,文本和任何播放叙述。如果因为我没有把iPad放在我面前,我不记得从这个特定的应用程序中删除故事和文本图层,我不记得了,但我已经完成了以下的应用程序hud移动了所有其他层。在那种情况下,对于一个简单的应用程序,移动场景会很好,因为场景只会移动到足以显示TOC(例如在这种类型的应用程序中)。你看起来要做的就是用玩家的动作移动整个场景,这不是你真正想做的事情。

无论哪种方式,您希望层之间的明确分离和仅在特定层上发生的操作应仅针对这些层。

希望这会有所帮助。

更新(已编辑):

根据您新编辑的OP,您遇到了一个新问题。对于hud你不应该设置图层的位置,因为在hud层内部,一切都已经相对于屏幕布局了。所以你应该拥有的是:

hudLayer = [HudLayer node];
[self addChild:hudLayer z:1];

第二个问题是你没有正确编写游戏和hud图层类的init方法。 init应该看起来像:

- (instanceType)init
{
    self = [super init];

    if (self)
    {
        // Do your init stuff...
    }

    return self;
}

你永远不会打电话:

self = [super init];