2009-09-08 5 views
0

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 

Répondre

0

Il semble que le problème est dans votre fonction init dans dropDown.m. Vous appelez [[self alloc] initActiveState]] et [[self alloc] initLabel]] pour les arguments addChild:, mais ce que cela fait, c'est de réallouer de l'espace pour l'ensemble de l'objet. Au lieu de cela, vous devriez faire la répartition dans vos méthodes initActiveState et initLabel. Essayez de changer ceux-ci à [ self initActiveState ] et [ self initLabel ] (en omettant l'appel alloc) et voir où cela vous mène.

Il peut être utile de publier le code dans votre classe Sprite, car vous utilisez des méthodes qui en sont héritées.