Ios 学习Cocos2D书籍过时的场景

Ios 学习Cocos2D书籍过时的场景,ios,cocos2d-iphone,Ios,Cocos2d Iphone,我试图从Rod Strougo&Ray Wenderlich的实践指南Learning Cocos2D中学习Cocos2D,但它使用的是Cocos 1,而不是现在流行的Cocos 2。我想这本书在以后仍然是相关的,但在第一章中我遇到了一个问题,告诉导演运行一个场景,因为整个过程在CoCoS2D2中似乎已经不同了 我不想买一本不同的书,所以我希望改变场景的运行方式是相当简单的 这本书就是这么说的: 找到-ApplicationIDFinishLaunching方法并注释掉: [[CCDirect

我试图从Rod Strougo&Ray Wenderlich的实践指南Learning Cocos2D中学习Cocos2D,但它使用的是Cocos 1,而不是现在流行的Cocos 2。我想这本书在以后仍然是相关的,但在第一章中我遇到了一个问题,告诉导演运行一个场景,因为整个过程在CoCoS2D2中似乎已经不同了

我不想买一本不同的书,所以我希望改变场景的运行方式是相当简单的

这本书就是这么说的:

找到-ApplicationIDFinishLaunching方法并注释掉:

 [[CCDirector sharedDirector]runWithScene: [HelloWorld scene]];
并加上:

[[CCDirector sharedDirector]runWithScene:[GameScene node]];
我在AppDelegate中找不到类似的内容,相反,它似乎与新方式有关:

[director_ pushScene: [IntroLayer scene]]; 
到目前为止,我试图将教程中的内容调整为新方式的尝试都失败了,但也许这是一个简单的解决方法

如果游戏场景已经过时:
游戏场景

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

@interface GameScene : CCScene
{

}
@end
你试过这个吗:

[[CCDirector sharedDirector] pushScene:[IntroLayer scene]];
你试过这个吗:

[[CCDirector sharedDirector] pushScene:[IntroLayer scene]];

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

注释掉
[director\upushscene:[IntroLayer scene]]在-ApplicationIDFinishLaunching中,并将其替换为以下内容:

[director\upushscene:[游戏场景节点]

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

如果您想知道为什么调用
[GameSecene]
对您不起作用,那是因为您从未在接口中声明过这样的方法。这有点让人困惑,但基本上您应该创建一个游戏CCLayer的子类,并在.h文件中声明该类方法:

+(CCScene*)场景

在implementation.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方法将为该层创建场景并将其作为子层添加。速度更快,但根据我的经验,使用多个层可能会更麻烦。

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

注释掉
[director\upushscene:[IntroLayer scene]]在-ApplicationIDFinishLaunching中,并将其替换为以下内容:

[director\upushscene:[游戏场景节点]

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

如果您想知道为什么调用
[GameSecene]
对您不起作用,那是因为您从未在接口中声明过这样的方法。这有点让人困惑,但基本上您应该创建一个游戏CCLayer的子类,并在.h文件中声明该类方法:

+(CCScene*)场景

在implementation.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方法将为该层创建场景并将其作为子层添加。速度更快,但在我的经验中,使用多个层次可能会更麻烦。

我发现这些教程对学习非常有帮助。并在init中设置断点。init能被执行吗?我发现这些教程对学习很有帮助。并在init中设置断点。init被执行了吗?我刚刚执行了,虽然它仍然允许我像正常一样运行模板的IntroLayer,但当它变成:[[CCDirector sharedDirector]pushScene:[GameSecene]]时,它不会运行教程的游戏场景;相反,它不会加载任何场景。我将更新主文本以显示GameSecene的功能,它可能也太过时了。我刚刚更新了,虽然它仍然允许我像正常情况一样运行模板的内层,但它在变成:[[CCDirector sharedDirector]pushScene:[GameSecene]]时不会运行教程的游戏场景;相反,它不会加载任何场景。我将更新主文本以显示游戏场景的功能,它可能也太过时了。第一条建议实际上不起作用,但是关于创建游戏层子类的建议起了作用,所以非常感谢。第一条建议实际上不起作用,但是关于创建游戏层子类的建议起了作用,非常感谢。