IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

problème accès NSMutableArray


Sujet :

Objective-C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 19
    Points
    19
    Par défaut problème accès NSMutableArray
    Bonjour,

    Je suis en train de développer un jeu sur iphone en utilisant la library cocos2d, et j'ai un soucis pour mettre à jour la position de mon curseur dans ma fonction d'update.

    Je ne fais que ça dans mon update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -(void)update:(ccTime)dt
    {
    	cursor.sprite.position = [self getTouchedTilePosition];
    }
    Voici ma fonction getToucheTilePosition, je pense qu'elle fonctionne, car je passe dedans à l'initialisation de mon curseur et le curseur est à la bonne position au début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -(CGPoint) getTouchedTilePosition
    {
    	BoD_Map *m = (BoD_Map*)[world.maps objectAtIndex:0];
    	BoD_Tile *t = (BoD_Tile*)[m.tiles objectAtIndex:indexTouchedTile];
    	return t.sprite.position;
    }
    Mon soucis est que une fois l'initialisation passée, quand le programme repasse dans cette fonction durant l'update, le programme crash à la récupération du NSMutableArray maps dans l'objet world, alors qu'il n'a pas été modifié depuis l'initialisation.

    Voici mon code d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    // on "init" you need to initialize your instance
    -(id) init
    {
    	if( (self=[super init] )) 
    	{
    		indexTouchedTile = (16 / 2) + (15 / 2)*16;
    		if( [self initWorld] != 0 && [self initCursor] !=0)
    		{
    			self.isTouchEnabled = YES;
    			[self schedule:@selector(update:)];
    			return self;
    		}
    	}
    	return NULL;
    }
     
     
    //Initialize the world
    -(int) initWorld
    {
    	world = [[BoD_World alloc] init];
     
    	if(world != NULL)
    	{
    		BoD_Map *m = (BoD_Map*)[world.maps objectAtIndex:0];
    		for(int i=0; i<[m.tiles count]; i++)
    		{
    			CCSprite *s = ((BoD_Tile*)[m.tiles objectAtIndex:i]).sprite;
    			[self addChild:s];
    		}
     
    		return 1;
    	}else{
    		return 0;
    	}
    }
     
     
    //Initialize the cursor
    -(int) initCursor
    {
    	cursor = [[BoD_Cursor alloc] init];
     
    	if(cursor != NULL)
    	{
    		cursor.sprite.position = [self getTouchedTilePosition];
    		[self addChild:cursor.sprite];
    		return 1;
    	}else{
    		return 0;
    	}
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 950
    Points : 4 373
    Points
    4 373
    Par défaut
    maps étant sans doute initialisé dans le init de BoD_World c'est donc lui qu'il faut montrer…
    mais il est à parier que soit il y manque un retain, soit l'initialisation bypass le setter si vous utilisez @property(retain) sur maps.
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maps = [[NSMutableArray array] retain] ;
    ou si maps est @synthesize avec @property(retain), il est aussi possible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.maps = [NSMutableArray array] ;
    dans les 2 cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maps = [NSMutableArray array] ;
    est erroné.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Bonjour,
    Merci pour ta réponse.

    Ah oui, en effet, j'aurais dût mettre BoD_World mais je ne pensais pas à un problème d'initialisation vu que l'initialisation se passe bien et que j'affiche ma map comme il faut pendant mon premier passage dans ma fonction d'affichage. Le problème se pose au premier passage dans la fonction d'update. Je regarderais ce soir et posterais ma classe BoD_World, mais je suis quasiment sûr d'avoir le maps en @synthetize avec @property(retain) et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maps = [NSMutableArray array] ;
    le "self.maps" est-il obligatoire?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 950
    Points : 4 373
    Points
    4 373
    Par défaut
    Citation Envoyé par kouax Voir le message
    Bonjour,
    Merci pour ta réponse.

    Ah oui, en effet, j'aurais dût mettre BoD_World mais je ne pensais pas à un problème d'initialisation vu que l'initialisation se passe bien et que j'affiche ma map comme il faut pendant mon premier passage dans ma fonction d'affichage. Le problème se pose au premier passage dans la fonction d'update. Je regarderais ce soir et posterais ma classe BoD_World, mais je suis quasiment sûr d'avoir le maps en @synthetize avec @property(retain) et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maps = [NSMutableArray array] ;
    le "self.maps" est-il obligatoire?
    ce n'est pas une question d'obligatoire, cela n'est pas la même chose :

    "maps=" assigne la variable maps directement
    "self.maps" appelle le "setter" généré par @synthesize.
    "self.maps = value" n'est qu'un raccourci pour "[self setMaps:value]".

    et synthesize génère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    - (void)setMaps:(NSMutableArray *)inMaps
    {
         [inMaps retain] ;
         [maps release] ;
         maps = inMaps ; // et non pas self.maps qui génèrerait une récursion infinie…
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    ah ok, merci, je testerais ce soir

Discussions similaires

  1. Appli Web, problème accès concurrent
    Par the java lover dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 12/06/2006, 10h11
  2. Problème accés Firewall
    Par liliprog dans le forum Développement
    Réponses: 5
    Dernier message: 02/06/2006, 16h06
  3. Problème accès base de données
    Par alainconnu dans le forum Outils
    Réponses: 3
    Dernier message: 27/04/2006, 09h31
  4. (débutant) Problème accès concurrents
    Par lolo... dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2005, 08h49
  5. [Problème] Accès aux propriétés de listes nommées avec []
    Par VincentL dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/10/2005, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo