2010-08-27 6 views
2

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!

Répondre

2

Les projets de test cocos2d sont de très mauvais exemples pour démarrer un projet. Leur intention est de tester certains aspects du code, et seulement les aspects que vous devriez regarder et éventuellement copier. La façon dont les testcases cocos2d sont mis en place ne fait pas un bon projet propre. Il y a beaucoup de raccourcis, comme le fait de tout mettre dans un seul fichier et de s'appuyer sur les boutons gauche/droite pour modifier les cas de test (je crois que c'est là que la classe nextAction entre en jeu).

je vous recommande d'installer les modèles de projet Xcode de cocos2d et commencer par le projet d'application cocos2d: http://www.learn-cocos2d.com/knowledge-base/cocos2d-iphone-faq/learn-cocos2d-public-content/manual/cocos2d-general/15838-how-to-install-the-cocos2d-xcode-project-templates/

Ce que je vois de votre code est que la couche ne pas

self.isTouchEnabled = YES 

et n'a pas non plus les méthodes régulières d'événement d'entrée tactile (ccTouchesBegan etc.) ajoutées. Donc, il ne réagira jamais à l'entrée tactile en premier lieu, et encore moins appelez une méthode qui appelle replaceScene.

+0

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