J'ai essayé de créer un propre composant GUI avec Cocos 2D. J'ai écrit une classe (Sprite). Cette classe initialise avec des graphiques et une étiquette. Si je crée une instance de ma classe, je peux voir mon composant mais je ne peux utiliser aucune fonction. J'ai écrit une fonction setLabel
mais l'étiquette change.propre composant ... fonctions ne fonctionnent pas
J'ai créé une instance avec ce code:
drop1 = [DropDown init];
//here I call the function but it dont works :-(
[drop1 setCaption:@"Produkt"];
///dropDown.m:
#import "DropDown.h"
@implementation DropDown
@synthesize captionLbl;
+ (id) init
{
if((self=[super init]))
{
return [[[self spriteWithFile:@"menue_dropdownbtn.png"] addChild:[[self alloc] initActiveState]] addChild:[[self alloc] initLabel]];
}
}
- (id)initActiveState
{
activated = [Sprite spriteWithFile:@"menue_dropactiveated.png"];
[activated setAnchorPoint:ccp(0,0)];
[activated setPosition:ccp(173,0)];
[activated setVisible:NO];
return activated;
}
- (id)initLabel
{
captionLbl = [Label labelWithString:@"Text" fontName:@"Arial" fontSize:14.0f];
[captionLbl setAnchorPoint:ccp(0,0)];
[captionLbl setPosition:ccp(10,5)];
[captionLbl setRGB:0 :0 :0];
return captionLbl;
}
- (void)setCaption:(NSString*)text
{
[captionLbl setString:text];
NSLog(@"Hallooooo");
}
- (void)activate
{
[activated setVisible:YES];
isActive = YES;
}
- (void)deactivate
{
[activated setVisible:NO];
isActive = NO;
}
@end
// DropDown.h
//
//
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface DropDown : Sprite
{
BOOL isActive;
@private
Sprite* activated;
Label* captionLbl;
}
@property (nonatomic, retain) Label* captionLbl;
+ (id) init;
- (id)initActiveState;
- (id)initLabel;
- (void)setCaption:(NSString*)text;
- (void)activate;
- (void)deactivate;
@end
Je ne peux pas enlever le alloc
car il est nécessaire d'accéder aux fonctions d'instance.
Voici la classe cocos2d Sprite
originale:
@interface Sprite (Private)
// lazy allocation
-(void) initAnimationDictionary;
@end
@implementation Sprite
#pragma mark Sprite - image file
+ (id) spriteWithFile:(NSString*) filename
{
return [[[self alloc] initWithFile:filename] autorelease];
}
- (id) initWithFile:(NSString*) filename
{
self = [super init];
if(self) {
// texture is retained
self.texture = [[TextureMgr sharedTextureMgr] addImage: filename];
// lazy alloc
animations = nil;
}
return self;
}
#pragma mark Sprite - CGImageRef
+ (id) spriteWithCGImage: (CGImageRef) image
{
return [[[self alloc] initWithCGImage:image] autorelease];
}
- (id) initWithCGImage: (CGImageRef) image
{
self = [super init];
if(self) {
// XXX: possible bug. See issue #349. New API should be added
NSString *key = [NSString stringWithFormat:@"%08X",(unsigned long)image];
self.texture = [[TextureMgr sharedTextureMgr] addCGImage:image forKey:key];
// lazy alloc
animations = nil;
}
return self;
}
#pragma mark Sprite - Texture2D
+ (id) spriteWithTexture:(Texture2D*) tex
{
return [[[self alloc] initWithTexture:tex] autorelease];
}
- (id) initWithTexture:(Texture2D*) tex
{
if((self = [super init])) {
// texture is retained
self.texture = tex;
// lazy alloc
animations = nil;
}
return self;
}
#pragma mark Sprite
-(void) dealloc
{
[animations release];
[super dealloc];
}
-(void) initAnimationDictionary
{
animations = [[NSMutableDictionary dictionaryWithCapacity:2] retain];
}
//
// CocosNodeFrames protocol
//
-(void) setDisplayFrame:(id)frame
{
self.texture = frame;
}
-(void) setDisplayFrame: (NSString*) animationName index:(int) frameIndex
{
if(! animations)
[self initAnimationDictionary];
Animation *a = [animations objectForKey: animationName];
Texture2D *frame = [[a frames] objectAtIndex:frameIndex];
self.texture = frame;
}
-(BOOL) isFrameDisplayed:(id)frame
{
return texture_ == frame;
}
-(id) displayFrame
{
return texture_;
}
-(void) addAnimation: (id<CocosAnimation>) anim
{
// lazy alloc
if(! animations)
[self initAnimationDictionary];
[animations setObject:anim forKey:[anim name]];
}
-(id<CocosAnimation>)animationByName: (NSString*) animationName
{
NSAssert(animationName != nil, @"animationName parameter must be non nil");
return [animations objectForKey:animationName];
}
@end