J'ai copié le code de l'implémentation de ParticleDemo dans mon projet et essayé de le faire fonctionner. Je veux que lorsque je clique sur une image, elle change/remplace la scène. Pour une raison quelconque, la scène n'est pas remplacée. Voici mon implémentation:iPhone Charger des scènes Cocos2d
//
// HelloWorldLayer.h
// FirstCocoaApplication
//
// Created by Mohammad Azam on 8/27/10.
// Copyright HighOnCoding 2010. All rights reserved.
//
// When you import this file, you import all the cocos2d classes
#import "cocos2d.h"
// HelloWorld Layer
@interface HelloWorld : CCLayer
{
}
// returns a Scene that contains the HelloWorld as the only child
+(id) scene;
@end
@class Emitter;
@interface ParticleDemo : CCColorLayer
{
CCParticleSystem *emitter;
CCSprite *background;
}
@property (readwrite, retain) CCParticleSystem *emitter;
@end
@interface DemoFire : ParticleDemo
{}
@end
Et voici le fichier .m:
//
// HelloWorldLayer.m
// FirstCocoaApplication
//
// Created by Mohammad Azam on 8/27/10.
// Copyright HighOnCoding 2010. All rights reserved.
//
// Import the interfaces
#import "HelloWorldScene.h"
Class nextAction()
{
NSLog(@"next action fired");
NSString *r = @"DemoFire";
Class c = NSClassFromString(r);
return c;
}
@implementation ParticleDemo
@synthesize emitter;
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super" return value
if((self=[super init])) {
// create and initialize a Label
//CCLabel* label = [CCLabel labelWithString:@"Particle Demo" fontName:@"Marker Felt" fontSize:64];
//CCScene *s = [CCScene node];
CCMenuItemImage *item1 = [CCMenuItemImage itemFromNormalImage:@"f1.png" selectedImage:@"f1.png" target:self selector:@selector(nextCallback:)];
CGSize s = [[CCDirector sharedDirector] winSize];
CCMenu *menu = [CCMenu menuWithItems:item1,nil];
menu.position = CGPointZero;
item1.position = ccp(s.width/2 - 100,30);
[self addChild:menu z:100];
//[s addChild: [nextAction() node]];
//[[CCDirector sharedDirector] replaceScene: s];
// ask director the the window size
//CGSize size = [[CCDirector sharedDirector] winSize];
// position the label on the center of the screen
//label.position = ccp(size.width /2 , size.height/2);
// add the label as a child to this Layer
//[self addChild: label];
}
return self;
}
- (void) dealloc
{
[emitter release];
[super dealloc];
}
-(void) nextCallback: (id) sender
{
NSLog(@"nextCallback fired!");
CCScene *s = [CCScene node];
[s addChild: [nextAction() node]];
[[CCDirector sharedDirector] replaceScene: s];
}
-(void) setEmitterPosition
{
if(CGPointEqualToPoint(emitter.centerOfGravity, CGPointZero))
emitter.position = ccp(200,70);
}
@end
@implementation DemoFire
-(void) onEnter
{
NSLog(@"demo fire onenter fred");
[super onEnter];
self.emitter = [CCParticleFire node];
[background addChild:emitter z:10];
emitter.texture = [[CCTextureCache sharedTextureCache] addImage:@"fire.pvr"];
CGPoint p = emitter.position;
emitter.position = ccp(p.x, 100);
[self setEmitterPosition];
}
@end
// HelloWorld implementation
@implementation HelloWorld
+(id) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
ParticleDemo *layer = [ParticleDemo node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
// on "init" you need to initialize your instance
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super" return value
if((self=[super init])) {
// create and initialize a Label
CCLabel* label = [CCLabel labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
// ask director the the window size
CGSize size = [[CCDirector sharedDirector] winSize];
// position the label on the center of the screen
label.position = ccp(size.width /2 , size.height/2);
// add the label as a child to this Layer
[self addChild: label];
}
return self;
}
// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
// in case you have something to dealloc, do it in this method
// in this particular example nothing needs to be released.
// cocos2d will automatically release all the children (Label)
// don't forget to call "super dealloc"
[super dealloc];
}
@end
// CLASS IMPLEMENTATIONS
@implementation AppController
- (void) applicationDidFinishLaunching:(UIApplication*)application
{
// CC_DIRECTOR_INIT()
//
// 1. Initializes an EAGLView with 0-bit depth format, and RGB565 render buffer
// 2. EAGLView multiple touches: disabled
// 3. creates a UIWindow, and assign it to the "window" var (it must already be declared)
// 4. Parents EAGLView to the newly created window
// 5. Creates Display Link Director
// 5a. If it fails, it will use an NSTimer director
// 6. It will try to run at 60 FPS
// 7. Display FPS: NO
// 8. Device orientation: Portrait
// 9. Connects the director to the EAGLView
//
// CC_DIRECTOR_INIT();
// Obtain the shared director in order to...
CCDirector *director = [CCDirector sharedDirector];
// Turn on display FPS
[director setDisplayFPS:YES];
// Default texture format for PNG/BMP/TIFF/JPEG/GIF images
// It can be RGBA8888, RGBA4444, RGB5_A1, RGB565
// You can change anytime.
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
CCScene *scene = [CCScene node];
[scene addChild: [nextAction() node]];
[director runWithScene: scene];
}
// getting a call, pause the game
-(void) applicationWillResignActive:(UIApplication *)application
{
[[CCDirector sharedDirector] pause];
}
// call got rejected
-(void) applicationDidBecomeActive:(UIApplication *)application
{
[[CCDirector sharedDirector] resume];
}
-(void) applicationDidEnterBackground:(UIApplication*)application
{
[[CCDirector sharedDirector] stopAnimation];
}
-(void) applicationWillEnterForeground:(UIApplication*)application
{
[[CCDirector sharedDirector] startAnimation];
}
- (void)applicationWillTerminate:(UIApplication *)application
{
[[CCDirector sharedDirector] end];
}
// purge memory
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
[[CCDirector sharedDirector] purgeCachedData];
}
// next delta time will be zero
-(void) applicationSignificantTimeChange:(UIApplication *)application
{
[[CCDirector sharedDirector] setNextDeltaTimeZero:YES];
}
@end
Dans le fichier AppDelegate j'ai configuré pour charger le ParticleDemo que la scène actuelle!
Merci pour la réponse! En fait, j'ai commencé avec une ardoise vierge et j'ai ajouté un code de démo Cocos2d. Je capture l'événement Click MenuItem et il déclenche: CCMenuItemImage * item1 = [CCMenuItemImage itemFromNormalImage: @ "f1.png" selectedImage: @ "f1.png" cible: autosélecteur: @selector (nextCallback :)]; – azamsharp