3 votes

Cocos2D - propriété userData pour sprite

Je développe une application de jeu iPhone en utilisant Cocos2d.

Je trouve que c'est une excellente solution à mon problème de stockage d'un entier dans la propriété de sprite :

sprite.userData = 123;

Cependant, sprite.userData ne peut stocker qu'une seule donnée. Si j'ai besoin de stocker trois données, quelle est la meilleure façon de le faire?

2voto

sg7 Points 4137

'userData' est en fait un pointeur void non retenu par la classe 'Node' :

void *userData_;

En tant que tel, il peut pointer vers n'importe quelle structure de données ou classe (ou même une fonction C).

0voto

Votre meilleure option, pour une ou neuf variables personnalisées, est de sous-classer CCSprite et d'avoir vos variables personnalisées en tant que variables de classe de la nouvelle classe, en utilisant des propriétés pour les lire/écrire publiquement.

Comme le ferait un programmeur Objective-C bien versé.

Pour répondre explicitement à votre question : Vous pouvez affecter un NSDictionary ou un NSArray à userData, qui peuvent eux-mêmes contenir plus d'un élément. Mais si vous allez aussi loin : lisez ci-dessus.

0voto

Umesh Sharma Points 378

Étendre la classe ccsprite en classe userdata et utiliser cette classe pour n'importe quel nombre de variables que vous souhaitez créer... cependant, vous devrez utiliser cette classe pour toutes les vérifications et conditions....

Voici le code

Userdata.h

//
// UserData.h
//
//

#import "CCSprite.h"
#import "Constants.h"

@class GameLayer;
@interface UserData : CCSprite {
    int userDataType;
    int tag;
    int parentTag;
      GameLayer *gameLayer;
    BOOL readyForDeletion; 
}

@property(nonatomic) int userDataType;
@property(nonatomic) int tag;
@property(nonatomic) int parentTag;
@property(nonatomic, assign) GameLayer *gameLayer;
@property(nonatomic) BOOL readyForDeletion;

-(id) initWithSpriteName:(NSString *)spriteName;

@end

et le userdata.mm

//
// UserData.mm
//
//

#import "UserData.h"

@implementation UserData

@synthesize userDataType;
@synthesize tag;
@synthesize parentTag;
@synthesize gameLayer;
@synthesize readyForDeletion;

-(id) initWithSpriteName:(NSString *)spriteName {
   if (self = [super initWithFileName:spriteName]) {

   }
   return self;
}

-(void) onExit {
   [super onExit];
}

-(void) dealloc {
   [super dealloc];
}

@end

@end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X