ios - How to replace layers? -
i started learn objective-c , use cocos2d 1 month ago.
i want replace 3 different layers tapping buttons. @ first, tried use "cclayermultiplex." then, use "if sentence." layers overlap or crash when buttons tapped. want previous layer disappear when new layer appears, old layer remains code now.
i think using "cclayermultiplex" best option, can't make work want to. below code. i'm afraid there're poor sentences...
@interface gslayout : cclayer { // button items ccmenuitemimage *file1; ccmenuitemimage *file1pushed; ... // layer (replace) cclayer *layer1; cclayer *layer2; cclayer *layer3; // replace layers cclayermultiplex* mplayer; } @end @implementation gslayout -(id) init{ if( (self=[super init])) { cclog(@"%@: %@", nsstringfromselector(_cmd), self); self.istouchenabled = yes; // buttons file1 = [ccmenuitemimage itemfromnormalimage:@"icon-small-50.png" selectedimage: @"icon-small.png" target:nil selector:nil]; file1pushed = [ccmenuitemimage itemfromnormalimage:@"icon-small.png" selectedimage:@"icon-small-50.png" target:nil selector:nil]; ccmenuitemtoggle *togglefile1 = [ccmenuitemtoggle itemwithtarget:self selector:@selector(selectone:) items:file1,file1pushed, nil]; togglefile1.anchorpoint = cgpointmake(0.5f, 0.5f); file2 = [[ccmenuitemimage itemfromnormalimage:@"icon-small-50.png" selectedimage: @"icon-small.png" target:nil selector:nil]retain]; file2pushed = [[ccmenuitemimage itemfromnormalimage:@"icon-small.png" selectedimage:@"icon-small-50.png" target:nil selector:nil]retain]; ccmenuitemtoggle *togglefile2 = [ccmenuitemtoggle itemwithtarget:self selector:@selector(selecttwo:) items:file2,file2pushed, nil]; togglefile2.anchorpoint = cgpointmake(0.5f, 0.5f); ... ccmenu *togglemenu = [ccmenu menuwithitems:togglefile1,togglefile2,togglefile3, nil]; [togglemenu alignitemshorizontally]; togglemenu.anchorpoint = cgpointmake(0, 1.0f); cgsize screensize = [[ccdirector shareddirector] winsize]; togglemenu.position = cgpointmake(screensize.width/2, screensize.height); [self addchild:togglemenu]; // create layers layer1 = [gamefile1 node]; layer2 = [gamefile2 node]; layer3 = [gamefile3 node]; mplayer = [cclayermultiplex layerwithlayers:layer1,layer2,layer3, nil]; } return self; } - (void) selectone: (ccmenuitem*) menuitem { nslog(@"the first menu called"); if([layer1 isrunning]) { nil; nslog(@"the layer1 running"); } else if([layer2 isrunning]) { [mplayer switchto:0]; nslog(@"the layer2 replaced"); }else if([layer3 isrunning]) { [mplayer switchto:0]; nslog(@"the layer3 replaced"); } else{ [self addchild:layer1]; nslog(@"the layer1 called"); } } - (void) selecttwo: (ccmenuitem*) menuitem { nslog(@"the second menu called"); if([layer2 isrunning]) { nil; nslog(@"the layer2 running"); } else if([layer1 isrunning]) { [mplayer switchto:1]; nslog(@"the layer1 replaced"); } else if([layer3 isrunning]) { [mplayer switchto:1]; nslog(@"the layer3 replaced"); }else{ [self addchild:layer2]; nslog(@"the layer2 called"); } } - (void) selectthree: (ccmenuitem*) menuitem { nslog(@"the third menu called"); ... }
please give me advice! thank in advance!
i'll add codes.
@interface gamefile1 : cclayer { ccsprite* sprite; } @implementation gamefile1 -(id) init{ if( (self=[super init])) { cgsize screensize = [[ccdirector shareddirector] winsize]; ccmenuitemimage *sounditem1 = [ccmenuitemimage itemfromnormalimage:@"button1.png" selectedimage: @"icon.png" target:self selector:@selector(dosomethingone:)]; ccmenuitemimage *sounditem2 = [ccmenuitemimage itemfromnormalimage:@"button2.png" selectedimage: @"icon.png" target:self selector:@selector(dosomethingtwo:)]; ... ccmenu * mymenu = [ccmenu menuwithitems:sounditem1, sounditem2,sounditem3,sounditem4, sounditem5,sounditem6,sounditem7, sounditem8,sounditem9,sounditem10,sounditem11,sounditem12, nil]; [mymenu alignitemsinrows:[nsnumber numberwithint:4],[nsnumber numberwithint:4],[nsnumber numberwithint:4] ,nil]; mymenu.position = cgpointmake(370, 120); [self addchild:mymenu]; sprite = [ccsprite spritewithfile:@"o0400026611355530621.jpg"]; sprite.scale = 0.5f; sprite.position = cgpointmake(screensize.width/2, screensize.height/2); sprite.anchorpoint = cgpointmake(1.0f, 0); [self addchild:sprite]; - (void) dosomethingone: (ccmenuitem *) menuitem { nslog(@"the first menu called"); [[simpleaudioengine sharedengine] playeffect:@"one.wav"]; [sprite settexture:[[cctexturecache sharedtexturecache] addimage: @"one.jpg"]]; } - (void) dosomethingtwo: (ccmenuitem *) menuitem { nslog(@"the second menu called"); [[simpleaudioengine sharedengine] playeffect:@"two.wav"]; [sprite settexture:[[cctexturecache sharedtexturecache] addimage: @"one.jpg"]]; } ... @end
since have loaded textures 3 layers, might have 3 sitting in separate cclayers 2 hidden @ given state using method similar to:
- (void) setlayer:(uint)show { layerone.visible = (show == 0); layertwo.visible = (show == 1); layerthree.visible = (show == 2); }
Comments
Post a Comment