Aide - Recherche - Membres - Calendrier
Version complète : problème avec une méthode
Centre de Formation Flash - Forums Adobe Flash > Adobe Flash > Programmation Actionscript > Actionscript 3
charly59
Salut tout le monde

je suis en train de développer un petit casse-briques, à l'origine pris du bouquin de gary Rosenzweig et que je suis en train de modifier.
Avec le code source du livre ça marche niquel. Cependant, depuis que j'ai modifié une méthode pour créer une grille aléatoire, je me retrouve avec une erreur :

Code
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
    at casseBriques/moveBall()
    at casseBriques/moveObjects()


je comprends pas pourquoi j'ai une erreur par rapport à cette méthode (qui définit le déplacement de la balle et de la raquette) alors que je n'y ai visiblement pas touché !
je suis en train de faire quelques tests pour essayer de contourner le problème, mais si vous avez une idée, ou besoin de l'ancien/nouveau code source je suis preneur de vos messages !!

merci d'avance
tibibi
Citation (charly59 @ Nov 29 2008, 11:56 PM) *
Salut tout le monde

je suis en train de développer un petit casse-briques, à l'origine pris du bouquin de gary Rosenzweig et que je suis en train de modifier.
Avec le code source du livre ça marche niquel. Cependant, depuis que j'ai modifié une méthode pour créer une grille aléatoire, je me retrouve avec une erreur :

Code
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
    at casseBriques/moveBall()
    at casseBriques/moveObjects()


je comprends pas pourquoi j'ai une erreur par rapport à cette méthode (qui définit le déplacement de la balle et de la raquette) alors que je n'y ai visiblement pas touché !
je suis en train de faire quelques tests pour essayer de contourner le problème, mais si vous avez une idée, ou besoin de l'ancien/nouveau code source je suis preneur de vos messages !!

merci d'avance


Bonsoir,

Effectivement quelques lignes de codes pourrais aider parce que là on ne peut pas te répondre icon_cool.gif

++icon_wink.gif
charly59
oui mais quoi ? la création de la grille ? moveBall() ?

bon je mets mon fla et mon .as ce sera plus simple ^^'
charly59
edit :

je sais que la manière dont je créé ma grille n'est pas forcément une super idée, mais ce n'est que dans un premier temps, après je vais construire mes niveaux à partir d'un fichier xml, ce sera beaucoup simple ^^ (mais il faut d'abord que je les dessine et pour le moment ... pas trop eu le temps ^^')

enfin je dis que c'est mieux avec un xml, mais je dis pas de bétises ?
la pieuvre
salut,

sans regarder le code je peux d'ores et déjà te dire que tu essayes d'appeler une propriété ou une méthode d'un objet qui n'as pas encore était créer.
bon pour dire ça je ne suis pas devin mais j'ai lu l'aide de flash où toutes les erreurs sont documentées wink.gif.

et en regardant ton code la réponse est évidente !!

Action Script

addEventListener(Event.ENTER_FRAME,moveObjects);
stage.addEventListener(MouseEvent.CLICK,newBall);


tu essaye de déplacer la balle avant de la créer...

en plus c'est une double erreur smile.gif
d'une part conceptuellement tu crées la ball après avoir appelé la fonction qui la déplace, je parle des 2 instructions (mais ça en soit ça ne changerai rien puisque la deuxième instruction est asynchrone mais c'est juste dans l'idée c'est bizarre...

et la deuxième erreur (la seule importante) ta première instruction commence directement à appeler la fonction qui crée la balle et ta balle n'est créée que lorsque l'utilisateur à décider de cliquer sur la scène, autant dire qu'il peut se passer quelques appelles à ta fonction de déplacement avant que ta balle ne soit créée. smile.gif

hé ben sur ce ... bonne journée!! wink.gif
charly59
il faudrait donc que je sépare la fonction de déplacement de la raquette et celle de déplacement de la balle et que je n'autorise l'appel à celle de la balle uniquement si la balle est créée ?
charly59
j'ai modifié mon code comme ça :

Action Script

addEventListener(Event.ENTER_FRAME,movePaddle);
newBall();
if (ball != null) {
addEventListener(Event.ENTER_FRAME,moveBall);
}


mais j'ai toujours la même erreur, ce doit surement être une erreur toute bidon que je vois pas ... mais je comprends pas pourquoi il me dit que je tente d'accéder à la propriété d'un objet nul (l'erreur est toujours sur le moveBall() que je n'ai pas modifié)
charly59
EDIT :
en remplaçant ainsi :

Action Script

addEventListener(Event.ENTER_FRAME,movePaddleBegin);
if (ball != null) {
addEventListener(Event.ENTER_FRAME,moveObjects);
} else {
stage.addEventListener(MouseEvent.CLICK,newBall);
}


je n'ai plus d'erreur, et ma balle est bien créée. Seulement elle ne commence pas son mouvement, mais je comprends pas pourquoi :s



PS : désolé pour tous ces posts à la suite, mais on ne peut pas éditer les messages :s
la pieuvre
Citation (charly59 @ Nov 30 2008, 04:41 PM) *
EDIT :
en remplaçant ainsi :

Action Script

addEventListener(Event.ENTER_FRAME,movePaddleBegin);
if (ball != null) {
addEventListener(Event.ENTER_FRAME,moveObjects);
} else {
stage.addEventListener(MouseEvent.CLICK,newBall);
}


je n'ai plus d'erreur, et ma balle est bien créée. Seulement elle ne commence pas son mouvement, mais je comprends pas pourquoi :s
PS : désolé pour tous ces posts à la suite, mais on ne peut pas éditer les messages :s


ta condition ne sert à rien puisque par définition ta balle ne sera pas créée dans ton constructeur. en revanche il faut ajouter l'ecouteur ENTER_FRAME juste après la création de la balle dans la fonction d'écoute du stage.
charly59
Citation (la pieuvre @ Nov 30 2008, 04:00 PM) *
ta condition ne sert à rien puisque par définition ta balle ne sera pas créée dans ton constructeur. en revanche il faut ajouter l'ecouteur ENTER_FRAME juste après la création de la balle dans la fonction d'écoute du stage.


je suis pas sûr de bien comprendre :s

que ma condition ne serve à rien oui ok ça je suis d'accord, mais je comprends pas l'ajout de l'ENTER_FRAME, je dois le mettre où en fait ?
la pieuvre
faisons simple et interprétons ton code (enfin une partie)

à la construction de ton jeu tu vérifie si ton objet balle a été créer.
sachant que celui si ne peut être créé que lorsque :
- l'écouteur sur le stage a été ajouté.
- et que l'utilisateur ai cliqué.
et que l'écouteur est ajouté dans le constructeur.
l'objet balle ne risque pas d'être déjà créé quand le constructeur est appelé.

donc :

Action Script

if (ball != null)

sera toujours faut.

donc ta condition ne sert à rien.

en suite

Action Script

addEventListener(Event.ENTER_FRAME,moveObjects);

ajoute un écouteur sur l'évènement ENTER_FRAME ce qui veux dire que dès que cet écouteur est ajouté toutes les x miliseconde (dépend du framerate) la fonction moveObjects est appelé.
or cette fonction déplace l'objet balle ; objet balle qui , comme nous l'avons vu plus haut, ne peut pas être créé quand le constructeur est appelé.
malheureusement l'écouteur est ajouté dans le constructeur.

donc tu essaye de déplacer un objet qui n'existe pas.

alors avec un peu de bol on pourrait dire "oui mais comme la fonction moveObjects va être appelé dans quelques milisecondes ça peut allé, l'objet pouura être créé".
ce qui pourrai être vrai, bien que mal adroit si dans le constructeur on créé directement l'objet balle.
malheureusement ce n'est pas le cas c'est à l'utilisateur de créer cet objet en claquant sur la scène.

et là on est bien mal barré... soit l'utilisateur est ultra rapide et arrive à cliqué avant le premier évènement ENTER_FRAME (mais ça j'y crois pas du tout et en plus on perd l'intérêt de l'écouteur) soit, on attend que l'utilisateur est créé la balle pour commencer à la faire bouger.

ce qui revient à attendre que l'évènement CLICK sur le stage est été distribué.

on arrive donc à la conclusion que l'écouteur ENTER_FRAME doit être ajouté dans la fonction qui écoute le CLICK sur le stage.

voilà j'espère que c'est assez clair smile.gif.

charly59
ah oui nickel merci beaucoup pour ces explications ! icon_biggrin.gif
charly59
bon si j'ai tout bien compris, ça devrait donner un truc du genre

Action Script

stage.addEventListener(MouseEvent.CLICK, newBall);


et dans newBall() :

Action Script

/* code pour créer la balle */
addEventListener(Event.ENTER_FRAME, moveObjects);


seulement il me dit toujours que je fais référence à un objet nul dans moveBall() !


en fait je crois que je vais modifier mon code pour créer ma balle dès le départ, la "snaper" à la palette, et démarrer le mouvement de la balle sur un click utilisateur.

je tiens au courant des mes avancées ^^'

merci pour ton aide icon_biggrin.gif
la pieuvre
tiens il me semblais avoir dit : "on arrive donc à la conclusion que l'écouteur ENTER_FRAME doit être ajouté dans la fonction qui écoute le CLICK sur le stage.".

je ne vois pas où il est question du constructeur de Balle!!
la pieuvre
edit: erreur de ma part newBalle n'est pas new Balle smile.gif.

mais je ne voispas de raison pour lesquelles ça ne fonctionne pas... donne le codne de newBall.

charly59

Action Script

public function newBall(event:Event) {
// Ne pas exécuter ce code s'il y a déjà une balle
if (ball != null) return;

// Créer une balle
ball = new Ball();
ball.x = BallXBegin;
ball.y = BallYBegin;
addChild(ball);

// Vélocité de la balle
ballDX = 0;
ballDY = ballSpeed;

// Utiliser une balle
balls--;
ballsLeft.text = "Balls : "+balls;

// Réinitialiser l'animation
lastTime = 0;

// On appelle moveObjects()
addEventListener(Event.ENTER_FRAME, moveObjects);
}


voilà ^^
charly59
une petite idée ? je sèche vraiment là sad.gif
charly59
up sad.gif

je m'en sors pas ... j'ai pas mal avancé la programmation des niveaux tout ça ...
mais je peux rien tester je suis complètement bloqué à cause de cette fichue méthode sad.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.