1

我正在尝试从学习 Cocos2D 中学习 Cocos2D,Rod Strougo 和 Ray Wenderlich 的动手指南,但它使用的是 Cocos 1,而不是现在推出的 2。我想这本书稍后仍然适用,但在第一章中我遇到了一个问题,告诉导演运行一个场景,因为在 Cocos2D 2 中,整个过程现在似乎不同了。

我宁愿不必买另一本书,所以我希望改变运行场景的方式相当简单。

这就是这本书所说的:

找到 -applicationDidFinishLaunching 方法并注释掉:

 [[CCDirector sharedDirector]runWithScene: [HelloWorld scene]];

并添加:

[[CCDirector sharedDirector]runWithScene:[GameScene node]];

我在 AppDelegate 中找不到任何类似的东西,但看起来这与新方法有关:

[director_ pushScene: [IntroLayer scene]]; 

到目前为止,我尝试将教程所说的内容适应新方式的尝试都失败了,但也许这是一个简单的解决方法。

以防它是过时的 GameScene:
GameScene.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "BackgroundLayer.h"
#import "GameplayLayer.h"
#import "CCScene.h"

@interface GameScene : CCScene
{

}
@end

游戏场景.m

@implementation GameScene

-(id)init
{
    self = [super init];
    if (self != nil)
    {
        BackgroundLayer *backgroundLayer = [BackgroundLayer node];
        [self addChild:backgroundLayer z:0];
        GameplayLayer *gameplayLayer = [GameplayLayer node];
        [self addChild:gameplayLayer z:5];
    }
    return self;
}
@end
4

2 回答 2

1

您遇到的问题是类方法 +scene。这用于在图层中创建场景而不是初始化场景并让该实例创建自己的子图层。当您深入了解场景 -> 层关系时,您将在本书后面了解这些差异。

在 -applicationDidFinishLaunching 中注释掉[director_ pushScene: [IntroLayer scene]];并将其替换为以下内容:

[director_ pushScene:[GameScene node]];

应该可以满足您的需求。它将创建一个 GameScene 实例(CCScene 的子类),其中您的两个 CCLayer 子类实例作为孩子,它们是您在 GameScene -init 方法中实例化的 backgroundLayer 和 gameLayer。

如果您对为什么调用[GameScene scene]对您不起作用感到好奇,那是因为您从未在界面中声明过这样的方法。这有点令人困惑,但基本上你会创建一个 CCLayer 的 Game Layer子类,并在你的 .h 文件中声明这个类方法:

+ (CCScene *)scene;

在您的实现 .m 文件中,您可以这样定义该方法:

// Class initializer method
+ (CCScene *)scene {
    CCScene *scene = [CCScene node]; // Create a container scene instance
    GameLayer *gameLayer = [GameLayer node]; // Create an instance of the current layer class
    [scene addChild:gameLayer]; // Add new layer to container scene
    return scene; // Return ready-made scene and layer in one
}

然后,当您调用[GameLayer scene]该 +scene 方法时,将为该图层创建场景并将其添加为子图层。它更快,但根据我的经验,多层可能会更麻烦。

于 2012-10-11T03:47:37.517 回答
0

你有没有试过这个:

[[CCDirector sharedDirector] pushScene:[IntroLayer scene]];
于 2012-10-10T17:22:48.857 回答