1

ロッド・ストロウゴとレイ・ヴェンダーリッヒによるハンズオンガイドであるLearning Cocos2DからCocos2Dを学ぼうとしていますが、現在リリースされている2ではなくCocos1を使用しています。この本は後でまだ関連していると思いますが、最初の章では、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

GameScene.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

あなたが抱えている問題は、クラスメソッド+シーンにあります。これは、シーンを初期化してそのインスタンスに独自の子レイヤーを作成させる代わりに、レイヤー内にシーンを作成するときに使用されます。この本の後半で、シーン->レイヤーの関係について詳しく知ると、違いがわかります。

-applicationDidFinishLaunchingでコメントアウト[director_ pushScene: [IntroLayer scene]];し、次のように置き換えます。

[director_ pushScene:[GameScene node]];

それはあなたのニーズにうまく機能するはずです。2つのCCLayerサブクラスインスタンスを子としてGameScene(CCSceneのサブクラス)のインスタンスを作成します。これらは、GameScene-initメソッドでインスタンス化するbackgroundLayerとgameplayLayerです。

呼び出し[GameScene scene]が機能しなかった理由に興味がある場合は、インターフェイスでそのようなメソッドを宣言したことがないためです。少し紛らわしいですが、基本的には、代わりにCCLayerのゲームレイヤーサブクラスを作成し、.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 に答える