我将代码从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加载为当前场景!
答案 0 :(得分:2)
cocos2d测试项目是启动项目的非常糟糕的例子。他们的目的是测试代码的某些方面,以及您应该查看并可能复制的那些方面。设置cocos2d测试用例的方式虽然不是一个好的,干净的项目。有许多快捷方式,比如将所有内容放在一个文件中,依靠左/右按钮来更改测试用例(我相信这是nextAction类的用法)。
我建议您安装cocos2d Xcode项目模板,并从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/
我从您的代码中看到的是该图层没有
self.isTouchEnabled = YES
并且它也没有添加常规触摸输入事件方法(ccTouchesBegan等)。因此,它首先不会对触摸输入作出反应,更不用说调用任何调用replaceScene的方法。