0

为简单起见,在默认 HelloWorld 场景(例如)中将默认 [ Menu ] 设置为自己的图层的最简单方法是什么。我现在遇到的问题是场景完全是黑色的,什么都没有出现!

游戏层节点:

- (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;
}
4

1 回答 1

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;

在这个场景中,您将添加两个“主”层,一个是您的游戏层,作为主游戏层的子层,另一个是您的 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 出现时,文本和故事层会递归地暂停(即它们和它们的所有子级)以及旁白音频(如果有的话),但 HUD 层保持不变。恢复包括恢复故事、文本和任何播放旁白。我不记得如果放下 hud 会在这个特定的应用程序中向下移动故事和文本层,因为我面前没有 iPad,但我过去做过一些应用程序,放下 hud 会改变一切其他层。在这种情况下,对于一个简单的应用程序来说,移动场景会很好,因为场景只会移动到足以显示 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];
于 2014-06-12T18:14:52.570 回答