iPhone Cocos2d сцены загрузки - PullRequest
       4

iPhone Cocos2d сцены загрузки

2 голосов
/ 27 августа 2010

Я скопировал код из реализации ParticleDemo в свой проект и попытался заставить его работать.Я хочу, чтобы при нажатии на изображение оно меняло / заменяло сцену.По какой-то причине сцена не заменяется.Вот моя реализация:

//
//  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

А вот и файл .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

В файле AppDelegate у меня есть настройка для загрузки ParticleDemo в качестве текущей сцены!

1 Ответ

2 голосов
/ 28 августа 2010

Тестовые проекты cocos2d - очень плохие примеры для запуска проекта. Их цель состоит в том, чтобы протестировать определенные аспекты кода, и только те аспекты, которые вы должны рассмотреть и, возможно, скопировать. Способ установки тестовых сценариев cocos2d не создает хорошего, чистого проекта. Есть много горячих клавиш, например, все помещается в один файл и полагается на левую / правую кнопки, чтобы быть там для смены тестовых случаев (я полагаю, именно здесь вступает в игру класс nextAction).

Я рекомендую вам установить шаблоны проекта cocos2d Xcode и начать с проекта приложения cocos2d: http://www.learn -cocos2d.com / база знаний / cocos2d-iphone-чаво / учиться-cocos2d-общественного содержания / ручной / cocos2d-общий / 15838-хау в установке-на-cocos2d-Xcode-проект -templates /

Из вашего кода я вижу, что у слоя нет

self.isTouchEnabled = YES

и к нему также не добавляются обычные методы сенсорного ввода (ccTouchesBegan и т. Д.). Поэтому он никогда не будет реагировать на сенсорный ввод, не говоря уже о том, чтобы вызывать любой метод, который вызывает replaceScene.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...