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

.