Redessiner une UIView sur demande
Bonjour,
dans mon pacman, je me penche maintenant sur le "mangeage" de boules
Les boules sont dessinées à partir d'un tableau tout comme mon labyrinthe d'ailleurs. Du coup je sais pas trop comment m'y prendre pour que le pacman les mangent.
Dois-je redessiner par dessus une boule noire ou dois je rappeler ma UIView avec un tableau mis à jour ?
J'ai essayé de me créer une propriété qui est un tableau que je mettais à jour mais j'avais des erreurs de pointeur que je n'ai pas réussi à résoude.
Merci
dans mon pacman, je me penche maintenant sur le "mangeage" de boules
Les boules sont dessinées à partir d'un tableau tout comme mon labyrinthe d'ailleurs. Du coup je sais pas trop comment m'y prendre pour que le pacman les mangent.
Dois-je redessiner par dessus une boule noire ou dois je rappeler ma UIView avec un tableau mis à jour ?
J'ai essayé de me créer une propriété qui est un tableau que je mettais à jour mais j'avais des erreurs de pointeur que je n'ai pas réussi à résoude.
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ceci dans ma UIView.
J'obtiens cette erreur "subscribed value is neither pointer nor array" à la ligne if (laby[c][l] == 0)
Voici ma déclaration :
Après j'aimerais accéder à ce tableau pour le modifier et ainsi rappeler le drawRect avec setNeedsDisplay afin de redéssiner la vue.
Une idée ??
Je vais tenter de t'expliquer le problème.
Ce que tu fais actuellement, c'est déclarer un tableau global et l'initialiser avec des valeurs lors de sa création. Pour faire ce que tu veux, il te faudrait un tableau par instance, mais si tu déclares
Alors il te faudra remplir ce tableau dans la méthode -init, ce qui s'avère compliqué:
laby2[0][0] = 1;
laby2[0][1] = 0;
etc.
Tu pourrais écrire une fonction qui copie ton tableau global (constant) vers le tableau de la variable d'instance.
Par ailleurs, le labyrinthe devrait faire partie de la couche modèle du paradigme MVC, et pas d'une vue.
P.S.: j'espère que tu n'appelles pas
UIImageView *blah = UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.jpg";
dans drawRect:
Sinon, tu m'étonnes que c'est lent ! Fais-le dans la méthode d'init.
EDIT : j'ai bien compris ce que tu me dis, je devrais déclarer mon tableau global dans mon UIVIewController et ensuite le recopier dans une var d'instance dans la méthode init de ma UIView mais je ne sais pas comment faire cela. Y a t il moyen d'avoir ce tableau global accessible depuis ma UIView autrement que par une propriété ?
Je suis un peu confus..
Il faudrait que je puisse passer un nouveau tableau à ma classe Labyrinthe à chaque fois que mon pacman se déplace sur une nouvelle case afin que la UIView se redessine avec le bon tableau.
Comme j'ai dit précédemment j'ai donc essayer de déclarer une propriété dans ma classe Labyrinthe qui serait de ce type int lab[20][30]; mais sans succés j'ai toujours des erreus de pointeurs, incompatibilité, bref je ne m'en sors pas.
Je vais essayer de mieux m'expliquer.
j'ai 3 classes :
BleekerViewController qui crée une instance de la classe Bleeker (mon pacman) et qui appelle aussi ma classe UIView Labyrinthe qui déssine les boules.
J'aimerais donc dans ma classe Bleeker pouvoir accéder à ma classe Labyrinthe afin de lui passer un nouveau tableau et lui dire aussi setNeedsDisplay afin qu'elle se redessine.
Mais la je ne sais plus quoi essayer...
Une âme charitable pour m'aiguiller svp
Un peu de code :
ma classe Bleeker
ma classe labyrinthe :
le viewDidLoad de mon UIViewController, BleekerViewController :
MERCIIIII
Je n'ai pas vérifié que ça compilait, mais voilà l'idée.
Tu instancies un Labyrinthe dans ta vue et récupères les pointeurs sur les tableaux.
J'avais réussi à trouver une solution qui ressemblait à la tienne, du coup j'ai fait un mélange des deux.
Ca y est mon pacman, mange des boules, meurt lorsqu'il touche les ennemis, gagne lorsqu'il a tout mangé et voila.
Me reste plus qu'à gerer les bonus qui apparaissent et apres à moi les niveaux et les finitions avant/apres partie.
Merci beaucoup :adios!:
Sur clic d'un bouton, j'appel un webservices et j'aimerai que pendant le temps de traitement et d'envoi/réponse HTTP, placer une UIView à fond noir avec transparence sur ma view principale.
Rien de bien compliqué jusque là :
Excepté que la view se redéssine pas sur le setNeedsDisplay mais à la fin de l'action, qui se trouve être, la fin du traitement de l'information.
Du coup j'ai ma vue noire qui apparait à la fin du traitement
Parce que si c'est un appel synchrone, c'est normal que la vue ne se redessine pas...
Pour faire de l'asynchrone, faudrait par exemple que je lance un Thread qui s'occupe de la requet HTTP et du traitement ? Ce n'est pas un appelle bloquant ?
Sinon les classes NSInvocationOperation (que je suis en ce moment en train d'utiliser de plus en plus tellement je commence à trouver ça pratique) te permettent de lancer des méthodes (des tâches en fait) de manière asynchrone en les installant sur une NSOperationQueue...
Pas obligatoirement, cela dépend de ce que tu utilises pour effectuer la requête au webservice. Dis-nous en plus (classes/méthodes utilisées) et on pourra t'aider.
J'ai regardé NSULRConnection avant de répondre ici sur l'aspect asynchrone :
On éxécute la requete avec connectionWithRequest:delegate:, on recupère le résultat avec connection:didReceiveData: et l'erreur si besoin avec connection:didFailWithError:, ai je bon ?
Par contre je ne trouve pas le protocol à utiliser comme il faut faire généralement avec un delegate. De plus, une fois la réponse HTTP reçu, je fais un traitement dessus, et j'aimerai que cet emsemble soit asynchrone, pas juste la requete.
Pour NSInvocationOperation, je comprends pas bien le truc.
-avec initWithTarget:selector:object: tu définie la méthode à invoquer d'accord, tu la lances ensuite quand besoin avec la méthode invocation mais en quoi c'est asynchrone ? Il me faudrai qqchose pour lancer le traitement sans que ce soit bloquant pour noircir ma view. Et de recevoir un évènement quand le traitement est fini pour la rendre normal.
Parce que NSURLConnection utilise un protocol informel (car elle date de l'époque où les protocoles avec méthodes optionnelles n'existaient pas), donc déclaré comme une catégorie de NSObject.
Maintenant pour ton information, les NSInvocationOperation (et NSOperation en général, dont NSInvocationOperation hérite) sont à rajouter dans une NSOperationQueue (qui est une "pile de tâches à exécuter de manière asynchrone"). Dès que tu rajoutes une NSOperation à une NSOperationQueue, après c'est la NSOpQueue qui se charge de démarrer la NSOperation (dès qu'elle peut, en fonction des éventuelles dépendances de cette NSOperation avec les autres NSOps de la NSOpQueue, etc).
Typiquement c'est pratique pour demander à Cocoa de faire des tâches "quand t'as le temps", pour empiler des tâches à faire et le laisser se débrouiller avec (surtout s'il y a des dépendances entre les tâches)... ou pour rendre asynchrone les méthodes qui ne le sont pas, en écoutant (via KVO) la clé "isFinished" pour être informé quand l'opération est terminée et en récupérer le résultat.
Mais bon pour en revenir à ton problème, si tu utilises NSURLConnection pour ta connection, c'est 10x plus simple (et plus logique !) d'utiliser NSURLConnection en mode asychrone, donc oublie NSInvocationOperation, qui n'est pas le plus adapté à ton contexte finalement.
Ali comme toujours merci pour ta patience et tes réponses complète