@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

scene移動時に値をバケツリレー再び

今日は一日、WebテスティングサービスとかいうSPIなやつを、
待ち時間に暇だったので、ずーっとチャレンジしてました。

さて本題ですが、以前下記のようなエントリを書いたのですが、

iPhoneアプリ開発講座を受講する その9
Scene移動時に値を引きわたす

http://blacksheep.hatenablog.com/entry/2012/01/18/234120

こいつだと移動先のinitで、バケツリレーした値が使えない。

というわけで、少しいじってみました。

遷移元.m

-(id) init
{
    if( (self=[super init])) {
        CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
	CGSize size = [[CCDirector sharedDirector] winSize];
	label.position =  ccp( size.width /2 , size.height/2 );
	[self addChild: label];
        CCMenuItemImage *btn = [CCMenuItemImage itemFromNormalImage:@"icon.png" selectedImage:@"icon.png" target:self selector:@selector(doNext)];
        [btn setPosition:ccp(240, 80)];
        CCMenu *menu = [CCMenu menuWithItems:btn, nil];
        [menu setAnchorPoint:ccp(0, 0)];
        [menu setPosition:ccp(0, 0)];
        [self addChild:menu];
        
    }
    return self;
}
    
- (void) doNext
{
    NSLog(@"HelloWorldLAyer#doNext");
    CCScene *scene = [SecondLayer scene:@"遷移するよ"];
    CCTransitionFade *transition = [CCTransitionFade transitionWithDuration:1 scene:scene];
    [[CCDirector sharedDirector]replaceScene:transition];
}

とまぁ、doNextの中でscene経由で値を渡すとこは一緒。
んで、こんな画面が表示される、

f:id:redogu:20120323002647p:plain

cocos2dのマークのとこがメニューボタンになっているので、
そこを押下すると次画面に遷移する。

遷移先.m

こっちはsceneの中で、layerをinitする時に独自initを呼んで対応。
こうすれば、init内で遷移元から渡ってきた値が使える。

ま、そりゃそうか。

@implementation SecondLayer
+(CCScene *) scene:(NSString *)string
{
    NSLog(@"SecondLayer#scene");
    CCScene *scene = [CCScene node];
    SecondLayer *layer = [[SecondLayer alloc] initWithString:string];
    [scene addChild:layer];
    [layer release];
    return scene;
}

-(id) initWithString:(NSString*)str
{
    if((self = [super init])){
        NSLog(@"SecondLayer#initWithString");
	CCLabelTTF *label = [CCLabelTTF labelWithString:str fontName:@"Marker Felt" fontSize:64];
	CGSize size = [[CCDirector sharedDirector] winSize];
	label.position =  ccp( size.width /2 , size.height/2 );
	[self addChild: label];
    }
    return self;
}

んで、渡ってきた値を画面に表示するところで、終了。

f:id:redogu:20120323002700p:plain


よし、これでいいか。