Forums Développement Multimédia

Aller au contenu

Erreur pour "accéder à la propriété ou à la méthode d'une référence d'objet nul."

CODE

25 réponses à ce sujet

#1 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 24 March 2011 - 12:52 PM

Bonjour à tous,

Je suis actuellement en train de développer un petit jeu en AS3 sur Flash CS5, le but est d'éviter des astéroïdes qui arrivent sur mon MovieClip (un vaisseau).

Je suis parvenu à faire disparaître les Astéroïdes en cas de collision avec le vaisseau, mais lorsque ça arrive, une erreur ce produit dans l'onglet "Sortie" de Flash:

Citation

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 SpaceGame_fla::MainTimeline/animationAsteroid()

J'ai déjà essayé de chercher à quoi correspondait cette erreur, apparemment je fais référence à un objet qui n’existe pas (ou plus) puisque je supprime du stage mes astéroïdes, donc normal, mais je ne sais pas comment résoudre ce problème; Ça doit venir de ma partie "Collision" tout en bas du code.


var hero = new vaisseau();
addChild(hero);

hero.speedX = 0;
hero.speedY = 0;

//Je définis la taille de ma scene
var LargeurScene:uint=stage.stageWidth;
var HauteurScene:uint=stage.stageHeight;

// Position de base du vaisseau sur la scène
(hero.x=550);
(hero.y=200);

// Touches clavier quand appuyés
stage.addEventListener(KeyboardEvent.KEY_DOWN, clavierDown);
function clavierDown(e)
{
                if(e.keyCode == 37) //LEFT
           {
                   hero.speedX = -10;
                   hero.scaleX = 1
                   
           }
           if(e.keyCode == 39) //RIGHT
           {
                   hero.speedX = 10;
                   hero.scaleX = -1
           }
           if(e.keyCode == 38) //UP
           {
                   hero.speedY = -10;
           }
           if(e.keyCode == 40) //DOWN
           {
                   hero.speedY = 10;

           }
}

// Touches clavier quand levés
stage.addEventListener(KeyboardEvent.KEY_UP, clavierUp)
function clavierUp(e)
{
        if(e.keyCode == 37)
        {
                hero.speedX = 0;
                hero.scaleX = 1
        }
        if(e.keyCode == 39)
        {
                hero.speedX = 0;
                hero.scaleX = -1
        }
        if(e.keyCode == 38)
        {
                hero.speedY = 0;
        }
        if(e.keyCode == 40)
        {
                hero.speedY = 0;
        }
}

// Animation du vaisseau
stage.addEventListener(Event.ENTER_FRAME, animeHero);

function animeHero(e)
{
        //Je déplace le vaisseau (hero) selon ses vitesses
        hero.x += hero.speedX;
        hero.y += hero.speedY;
}

       

// INTEGRATION DES ASTEROIDS ===================================

//Je définis le nombre d'Asteroids à générer
var nbAsteroid:uint=8;
//Je génère une boucle
for (var i:uint = 0; i<nbAsteroid; i++) {
//Création d'un Asteroid
var AsteroidNouveau = new Asteroid();
//Propriété nom
AsteroidNouveau.name='Asteroid'+i;
modifierAspectAsteroid(AsteroidNouveau,true);
//La fonction onEnterFrame simule le déplacement de la tête de lecture
AsteroidNouveau.addEventListener(Event.ENTER_FRAME,animationAsteroid);
}
//Fonction pour modifier l'aspect des Asteroids
function modifierAspectAsteroid(AsteroidActuel:MovieClip,origine:Boolean):void {
//Positionnement sur la scene et dimensions
with (AsteroidActuel) {
//Sur l'axe des y, Asteroids arrivent aléatoirement
y=Math.random()*HauteurScene;
//Sur l'axe des x, Asteroids partent de la gauche
x=0;

//Je définis une taille aléatoire pour mes Asteroids
//scaleX et scaleY prennent des valeurs de 0 a 1 en AS3
scaleY=scaleX=.1+Math.random()*.8;
}
//Gestion du déplacement pour chaque Asteroids
//La vitesse est déterminé au hasard
AsteroidActuel.VitesseHorizontale=2+Math.random()*5;
//J'affiche l'Asteroid sur la scene
addChild(AsteroidActuel);

}
//fontion pour animer l'Asteroid
function animationAsteroid(NomParticule:Event):void {
//Recupere le nom de l'Asteroid
var AsteroidActuel:MovieClip=NomParticule.currentTarget as MovieClip;
//trace(AsteroidActuel.name);
AsteroidActuel.x+=AsteroidActuel.VitesseHorizontale;
//si nous atteignons le côté droit de la scene
if (AsteroidActuel.x>=LargeurScene) {
modifierAspectAsteroid(AsteroidActuel,false);
}

//COLLISIONS ===================================
        if(AsteroidActuel.hitTestObject(hero))
        {

//Je retire l'Asteroid de l'affichage
        AsteroidActuel.parent.removeChild(AsteroidActuel);
       
        }
}

Une petite idée ? ;)

Merci d'avance !

#2 Billyben

    KlouChiPonshoñistäs

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2597 messages

Posté 24 March 2011 - 12:58 PM

Voir le messageobzilo, le 24 March 2011 - 12:52 PM, dit :

Ça doit venir de ma partie "Collision" tout en bas du code.

Bonjour, la première chose à faire est d'identifier l'objet qu'il ne trouve pas. Pour faire simple, utilise le débogueur de CS5 (ctrl+maj+entrée) quand l'erreur survient il va t'indiquer par une petite flèche la ligne ou se situe l'erreur. Ensuite tu trace tout les objets qui sont appelés dans cette ligne, ça va déjà te donner pas mal d'indications.

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 March 2011 - 13:02 PM

Dans la fonction animationAsteroid, tu termines par :

        AsteroidActuel.parent.removeChild(AsteroidActuel);
 
Ceci ne marche qu'une fois.
Après le removeChild, AsteroidActuel n'a plus de parent.
Pourtant, il est transformé, se déplace (dans le néant puisqu'il n'est pas affiché), mais le test de collision ne cherche pas à savoir si les objets sont dans le même "univers" (néant ou liste d'affichage). Le test se concentre sur les coordonnés. Et quand les coordonnées donnent un collision, le code tente à nouveau la ligne :

        AsteroidActuel.parent.removeChild(AsteroidActuel);
 

Mais AsteroidActuel, n'a plus de parent… d'ou l'erreur.

2 solutions :
- si tu reexploites l'asteroide (je n'ai pas tout épluché le code), il te manque un addChild quelque part.
- si tu ne le reexploite pas, tu dois lui supprimer ses écouteurs, références etc, pour qu'il ne se déplace plus, ne teste plus la collision… S'il est proprement nettoyé, il sera évacué par le garbage collector et tu n'auras plus de soucis.

#4 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 24 March 2011 - 13:22 PM

@Dldler: Effectivement je rééxploite le MovieClip de l'Asteroid, j'ai donc rajouté un addChild :

//COLLISIONS ===================================
        if(AsteroidActuel.hitTestObject(hero))
        {
               
        //Je rajoute ici un addChild car je rééxploide le MovieClip AsteroidActuel après sa destruction
        addChild(AsteroidActuel);

//Je retire l'Asteroid de l'affichage
        AsteroidActuel.parent.removeChild(AsteroidActuel);
       
        }
}

Et... Ça marche !

Merci beaucoup, ça fait une semaine que j’essaie de résoudre ce bug... ^^'

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 March 2011 - 13:45 PM

:shock:
:shock:
:mrgreen: Ça marche oui, forcément :
tu fais: j'ajoute à la liste puis je retire de la liste…
Forcément plus de souci de parent…

…mais



Il se passe maintenant cela :

- Je suis un astéroide
- je suis affiché
- je me déplace (3)
- je heurte un vaisseau spatial
- je suis affiché
- je ne suis plus affiché
- je suis transformé
- je recommence en (3)
… ce qui donne :
- je me déplace (mais je ne suis pas affiché !)
- je heurte un vaisseau spatial (en fait, non, puisque je ne suis pas affiché)
- je suis affiché
- je ne suis plus affiché
- je suis transformé
- je recommence en (3)

A mon avis, ce n'est pas le bon endroit pour faire le addChild… et tu dois avoir de moins en moins d'astéroïdes… non ?


Pour t'en assurer, teste ceci :
//COLLISIONS ===================================
        if(AsteroidActuel.hitTestObject(hero))
        {
        if(AsteroidActuel.parent==null) trace ("Un astéroïde invisible vient de heurter le vaisseau spatial !");
        //Je rajoute ici un addChild au mauvais endroit
        addChild(AsteroidActuel);

//Je retire l'Asteroid de l'affichage
        AsteroidActuel.parent.removeChild(AsteroidActuel);
       
        }
}
 


#6 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 24 March 2011 - 16:46 PM

Oui en effet j'ai des "Un astéroïde invisible vient de heurter le vaisseau". Mais si j'ai aucune erreur, ça ne dois pas être si grave si ? Car toute façon le but du jeu est de les éviter, donc bientôt je vais coder une fonction qui fasse perdre le joueur au bout de 5 collisions.
Le problème aurait été plus important si le but était de tous les attraper non?

#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 March 2011 - 16:57 PM

Le problème, c'est que tu as des asteroides qui ne sont plus affichés, mais continuent à se promener, a tester la collision avec le vaisseau spatial.

C'est grave pour 2 raisons :

C'est grave parce que tu ne les maîtrises pas, tu ne sais pas pourquoi il sont là… Tu as une erreur logique dans ta conception. Tu va traîner cette erreur comme un boulet, tu auras d'autres soucis, et à chaque fois il faudra que tu trouves une rustine. De plus en plus d'astéroïdes invisibles, de plus en plus de rustines, de plus en plus d'utilisation mémoire et CPU == de moins en moins de performances.
Sur ce point tu peux faire l'autruche. Ça tiendra ce que ça tiendra…

C'est grave aussi parce que des astéroïdes invisibles entrent en collision avec le vaisseau. De la même façon qu'ils génèrent le 'trace', ils vont générer des dégâts. Faire atteindre le seuil des 5 collisions et le joueur va perdre parce qu'il heurte des astéroïdes qu'il ne voit pas ! Ça, tu ne vas pas pouvoir faire l'autruche. Alors, une autre rustine ?

A mon avis, avec un peu d'expérience, un seul conseil : trouve la source, règle le problème maintenant.
C'est juste un addChild à placer au bon endroit. Quelque part dans ta fonction transformation ?

Ne laisse pas le doute s'insinuer, il va encombrer ton esprit à chaque souci que tu auras par la suite, qu'il y ai un rapport ou non avec le problème.
;-)

#8 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 24 March 2011 - 17:34 PM

Ok, ouais vu comme ça c'est sur c'est pas très optimisé, mais du coup il faut juste placer l'addChild à un autre endroit ? Bon je devrais pouvoir y arriver, je vais voir cela ! Merci ;)

#9 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 24 March 2011 - 17:48 PM

@ Dldler: Mmmh... En fait je n'ai pas l'impression qu'il y ait des Astéroïdes invisibles sur ma scène, car après avoir observé le tout plusieurs fois, ton "trace" ne se déclenche que lorsque je touche un asteroid visible, j'ai fait plusieurs fois le teste, tant que je ne touche rien, le "trace" ne bouge pas dans Sortie. :neutral:

#10 remidebra

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 282 messages

Posté 25 March 2011 - 12:17 PM

sinon, y a une méthode de bourrin (dont tu n'aura pas besoin là), mais qui pourrait te servir plus tard peut-être:

function supprime(){

if( asteroide ){ this.removeChild(asteroide) }

}

 

En fait, tu supprimes seulement si le clip existe bien. Mais en général, il vaut mieux s'arranger autrement.

#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 12:37 PM

Salut.

je suis entré un peu plus dans le code.

En fait, tu réutilises les astéroïdes qui sortent à gauche (ou a droite, pas vérifié).
Mais, en l'état du code, tu ne réutilises pas ceux qui percutent le vaisseau.

Tu dois donc les "nettoyer" : enlever toutes les références qui empêcheraient le garbageCollector de les supprimer définitivement.
La seule référence qui doit te gêner, c'est l'écouteur de l'événement EnterFrame, celui qui déclenche la fonction animationAsteroid


Aussi je te conseille d'ajouter cette ligne de code vers la fin :
        //COLLISIONS ===================================
        if (AsteroidActuel.hitTestObject(hero)) {

                //Je retire l'Asteroid de l'affichage
                AsteroidActuel.parent.removeChild (AsteroidActuel);
                // Je retire l'écouteur qui le fait bouger et participer au test de collision
                AsteroidNouveau.removeEventListener (Event.ENTER_FRAME,animationAsteroid); //‹‹‹‹‹‹‹‹‹ ICI
        }
 
Et supprimer le addChild juste avant le removeChild
Sinon, pour l'instant, tes astéroïdes continuent de vivre, de se déplacer en dehors de la liste d'affichage.

#12 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 25 March 2011 - 13:45 PM

Erf, j'ai bien rajouté la ligne "removeEventListener" et supprimé le addChild juste avant le removeChild mais du coup j'ai la même erreur qui revient: "Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul." :sad:

Je vais essayer de coder une function score avec la version du code avec le "addChild" pour voir si j'ai des problèmes avec des asteroid invisibles.

#13 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 14:02 PM

:/

Autant pour moi… mais si tu faisait un petit effort aussi ? :)
A cet endroit ta variable ne s'appelle pas AsteroidNouveau, mais AsteroidActuel…

A remplacer dans la ligne de code.

#14 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 25 March 2011 - 14:51 PM

Justement j'avais essayé aussi de mettre "AsteroidActuel" avant de poster mon message car ça me semblait bizarre ! :) Mais les Astéroïdes disparaissaient jusqu'à ce qu'il n'y en ait plus qui s'affichent après une collision ! Elle ne se régénéraient plus en fait.

Sinon, j'ai coder ma fonction score. Avec le "addChild" mal placé, effectivement je perd jusqu'à 30 points d'un coup au lieu de 1 quand le vaisseau touche un astéroïde... Quand je vire le "addChild" mal placé, je perd bien 1 point à la fois mais j'ai toujours l'erreur dans Sortie du coup.

Aller j'y suis presque je retourne fouiller dans mon code. :D

#15 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 15:01 PM

Voir le messageobzilo, le 25 March 2011 - 14:51 PM, dit :

Mais les Astéroïdes disparaissaient jusqu'à ce qu'il n'y en ait plus qui s'affichent après une collision ! Elle ne se régénéraient plus en fait.

Tout à fait. Puisque tu ne lances pas la fonction modifierAsteroid après une collision. Ils ne se régénèrent pas.

Et si ça marche avec le addChild/removeChild, c'est parce que les astéroïdes invisibles continuent leur course, finissent par sortir de l'écran et sont alors envoyés à la fonction modifierAsteroid… et reprennent un cours normal. Sauf que leur partie de trajet en invisible continue d'interférer avec le hitTest.

Conclusion : après une collision, tu dois régénérer tes astéroïdes et dans ce cas, pas besoin de faire le removeChild (encore moins le addChild)

#16 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 25 March 2011 - 15:19 PM

Pouah mais la je suis perdu, à présent je n'arrive plus à perdre 1 point à la fois... Quoi que je fasse mon compteur de points s'affole complètement même si je n'ai encore touché aucun Asteroide.... Plus j'avance plus je m'enlise.

Voila la dernière version de mon code:

var hero = new vaisseau();
addChild(hero);

hero.speedX = 0;
hero.speedY = 0;

//Je définis la taille de ma scene
var LargeurScene:uint=stage.stageWidth;
var HauteurScene:uint=stage.stageHeight;

//Variable score
var score = 10;

// Position de base du vaisseau sur la scène
(hero.x=550);
(hero.y=200);

// DEPLACEMENT DU VAISSEAU =============================================
// Touches Down
stage.addEventListener(KeyboardEvent.KEY_DOWN, clavierDown);
function clavierDown(e)
{
                if(e.keyCode == 37) //LEFT
           {
                   hero.speedX = -10;
                   hero.scaleX = 1
                   
           }
           if(e.keyCode == 39) //RIGHT
           {
                   hero.speedX = 10;
                   hero.scaleX = -1
           }
           if(e.keyCode == 38) //UP
           {
                   hero.speedY = -10;
           }
           if(e.keyCode == 40) //DOWN
           {
                   hero.speedY = 10;

           }
}

// Touches Up
stage.addEventListener(KeyboardEvent.KEY_UP, clavierUp)
function clavierUp(e)
{
        if(e.keyCode == 37)
        {
                hero.speedX = 0;
                hero.scaleX = 1
        }
        if(e.keyCode == 39)
        {
                hero.speedX = 0;
                hero.scaleX = -1
        }
        if(e.keyCode == 38)
        {
                hero.speedY = 0;
        }
        if(e.keyCode == 40)
        {
                hero.speedY = 0;
        }
}

// Animation du vaisseau
stage.addEventListener(Event.ENTER_FRAME, animeHero);

function animeHero(e)
{
        //Je déplace le vaisseau (hero) selon ses vitesses
        hero.x += hero.speedX;
        hero.y += hero.speedY;
       
}

// AFFICHAGE DES ASTEROIDES ===============================================

//Je définis le nombre d'Asteroides à générer
var nbAsteroid:uint=8;
//Je génère une boucle for
for (var i:uint = 0; i<nbAsteroid; i++) {
//Création d'un Asteroide
var AsteroidNouveau = new Asteroid();
//Propriété nom
AsteroidNouveau.name='Asteroid'+i;
modifierAspectAsteroid(AsteroidNouveau,true);
//La fonction onEnterFrame simule le déplacement de la tête de lecture
AsteroidNouveau.addEventListener(Event.ENTER_FRAME,animationAsteroid);
}
//Fonction pour modifier l'aspect des Asteroides
function modifierAspectAsteroid(AsteroidActuel:MovieClip,origine:Boolean):void {
//Positionnement sur la scene et dimensions
with (AsteroidActuel) {
//Sur l'axe des y, les Asteroides arrivent aléatoirement
y=Math.random()*HauteurScene;
//Sur l'axe des x, les Asteroides partent de la gauche
x=0;

//Je définis une taille aléatoire pour mes Asteroides
//scaleX et scaleY prennent des valeurs de 0 a 1 en AS3
scaleY=scaleX=.1+Math.random()*.8;
}

//Gestion du déplacement pour chaque Asteroids
//La vitesse est déterminé au hasard
AsteroidActuel.VitesseHorizontale=2+Math.random()*5;
//J'affiche l'Asteroide sur la scene
addChild(AsteroidActuel);

}
//fontion pour animer l'Asteroide
function animationAsteroid(NomParticule:Event):void {
//Recupere le nom de l'Asteroide
var AsteroidActuel:MovieClip=NomParticule.currentTarget as MovieClip;
//trace(AsteroidActuel.name);
AsteroidActuel.x+=AsteroidActuel.VitesseHorizontale;
//si nous atteignons le côté droit de la scene
if (AsteroidActuel.x>=LargeurScene) {
modifierAspectAsteroid(AsteroidActuel,false);
}
       
//COLLISIONS ==============================================================
        if (AsteroidActuel.hitTestObject(hero)) {

                //Je retire l'Asteroid de l'affichage
                AsteroidActuel.parent.removeChild (AsteroidActuel);
                // Je retire l'écouteur qui le fait bouger et participer au test de collision
                AsteroidActuel.removeEventListener (Event.ENTER_FRAME,animationAsteroid); //‹‹‹‹‹‹‹‹‹ ICI
        }
       
       
//SCORE: Si je touche un Astéroïde... ======================================
score --;

scoreTxt.text="Votre score est de "+score;


if(score < 2)
{
        scoreTxt.appendText(" point !");
}

else
{
        scoreTxt.appendText(" points !");
}

}

Avec ce code, lorsque je lance l'animation, le compteur de mon score s'affole complètement comme si je percutais 50 asteroides à la seconde. Une fois que j'ai percuté toutes les astéroides "visibles" le score s'arrête car plus d'asteroides sur l'affichage... Honnêtement j’essaie vraiment de comprendre le truc mais la... :shock:

#17 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 15:27 PM

Ben là, je n'ai pas le temps de regarder.

Surtout parce qu'il n'est pas facile d'entrer dans ton code.
Normalement, on construit plutôt en 3
étapes :
- déclarations des variables
- code principale
- fonctions

Permet d'avoir une vue d'ensemble du code, et c'est aussi une question d'habitudes.

j'avais réecrit le code à ma sauce pour trouver la faille, je te le joint. J'espère que ça t'aidera un peu quand même.

// VARIABLES ===========================================
var nbAsteroid:uint = 8; //Je définis le nombre d'Asteroids à générer
var degats:int = 0;// Les dégats subits
var LargeurScene:uint = stage.stageWidth; //Je définis la taille de ma scene
var HauteurScene:uint = stage.stageHeight;
var hero = addChild(new Vaisseau()); // Le vaisseau

// CODE PRINCIPAL =======================================
// Ecoute du clavier
stage.addEventListener (KeyboardEvent.KEY_DOWN, clavier);
stage.addEventListener (KeyboardEvent.KEY_UP, clavier);

// Le vaisseau
hero.speedX = hero.speedY = 0;
hero.x = 500;
hero.y = 200;
hero.addEventListener (Event.ENTER_FRAME, animeHero);

// Les astéroïdes
for (var i:uint = 0; i<nbAsteroid; i++) {
        var asteroid:Asteroid=new Asteroid();
        asteroid.addEventListener(Event.ENTER_FRAME,animationAsteroid);
        modifierAspectAsteroid(asteroid);
        addChild(asteroid);
}

// FONCTIONS =========================================
function clavier (e):void
{       // Gestion du clavier
        var up:Boolean = e.type == KeyboardEvent.KEY_DOWN;
        switch (e.keyCode) {
                case 37 ://LEFT
                        hero.speedX = up ? -10:0;
                        hero.scaleX = 1;
                        break;
                case 39 ://RIGHT
                        hero.speedX = up ? 10:0;
                        hero.scaleX = -1;
                        break;
                case 38 ://UP
                        hero.speedY = up ? -10:0;
                        break;
                case 40 ://DOWN
                        hero.speedY = up ? 10:0;
        }
}

function animeHero (e)
{       //déplace le vaisseau (hero) selon ses vitesses
        hero.x += hero.speedX;
        hero.y+=hero.speedY;
}

function animationAsteroid (event:Event):void
{       //anime l'asteroid
        with (event.currentTarget as Asteroid) {
                x+=VitesseHorizontale;
                if (x>=LargeurScene) {
                        //si nous atteignons le côté droit de la scene
                        modifierAspectAsteroid (event.currentTarget);
                }
               
                if (hitTestObject(hero)) {
                        //si l'astéroïde rencontre le vaisseau
                        degats++;
                        trace (degats);
                        modifierAspectAsteroid (event.currentTarget);
                }
        }
}

function modifierAspectAsteroid (asteroid:Asteroid)
{       //modifie l'aspect des Asteroids
        asteroid.y=Math.random()*HauteurScene; //Sur l'axe des y, Asteroids arrivent aléatoirement
        asteroid.x=0; //Sur l'axe des x, Asteroids partent de la gauche
        asteroid.VitesseHorizontale=2+Math.random()*5 //La vitesse est déterminé au hasard
        with (asteroid) scaleY=scaleX=.1+Math.random()*.8; // scaleX et scaleY prennent des valeurs de 0 a 0.9
}


#18 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 15:32 PM

PS : Tant que tu ne règleras pas proprement ton soucis d'astéroides invisibles tu n'auras que des soucis comme ça. Je t'avais prévenu :P
N'essaye pas d'aller plus loin, règle ton problème, fais ton choix entre : (removeChild et supprimer proprement les astéroides) ou (modifierAspectAsteroid après une collision).

Quand ça sera propre, le reste avancera plus vite.

#19 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 25 March 2011 - 15:34 PM

D'ac merci pour ta patience en tout cas. Je vais regarder ça mais à froid, parce que la je surchauffe complètement. Merci pour ton aide en tout cas, si tu à le temps de jeter un oeil à mon code, n'hésite pas. :mrgreen:

#20 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 March 2011 - 15:48 PM

Si ce n'était pas clair, le code ci-dessus fonctionne, conserve le nombre d'astéroïdes et compte les dégats… ;)

#21 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 28 March 2011 - 18:58 PM

Bon j'ai remis de l'ordre dans mon code je pars sur une base propre tout marche merci Dldler! ;)
Par contre, je veux ajouter un bouton "Jouer" au lancement du jeu, j'ai donc créer une scène (où lieu) différente avec ce bouton "Jouer". Quand je clique dessus il pointe bien vers ma scène ou j'ai le jeu etc, tout marche, sauf le déplacement du vaisseau. Les touches ne répondent pas. Bizarre. Quelqu'un sait d'ou ça peut venir ?

Modifié par obzilo, 28 March 2011 - 18:59 PM.


#22 Pripoko

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 59 messages

Posté 28 March 2011 - 19:16 PM

Haha, j'ai déjà eu ce bug...

// Permet d'éviter le bug des touches claviers qui ne marchent pas
stage.focus=this;

En espérant que ça puisse aider. :)

Modifié par Pripoko, 28 March 2011 - 19:18 PM.


#23 obzilo

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 28 March 2011 - 20:42 PM

Énorme ça marche ! Merci beaucoup fallait le savoir ça. ^^

#24 Pripoko

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 59 messages

Posté 28 March 2011 - 21:01 PM

Mais de rien! A mettre dans une fiche de bouts de code utiles! ;)

#25 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 29 March 2011 - 08:18 AM

Voir le messagePripoko, le 28 March 2011 - 19:16 PM, dit :

Haha, j'ai déjà eu ce bug...


;) Sauf qu'il ne s'agit pas d'un bug.
Le clavier est toujours associé à un focus pour définir celui qui reçoit les informations.
Exemple parlant : s'il y a 2 champs de texte de saisie sur la scène, il faut bien qu'il n'y en ai qu'un qui reçoive les événements de saisie. C'est ça le focus.
Comme les boutons sont concernés par le focus, un clic sur un bouton transfère le focus vers celui-ci.
Il faut donc replacer ensuite le focus sur le stage (si on en a besoin). C'est tout à fait normal.

#26 Pripoko

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 59 messages

Posté 29 March 2011 - 12:50 PM

Merci Dldler pour la précision. ;-) J'avoue ne pas avoir vraiment cherché à comprendre comment ce bout de code fonctionnait. A l'époque, tout ce que je voyais, c'était que quand j'appuyais sur la touche P de mon clavier pour faire "pause" dans mon jeu, ça m'actionnait les raccourcis claviers de Flash au lieu d'arrêter le jeu. :neutral:
D'ailleurs, chose "étrange", en général, il fallait faire un simple clic de souris pour que le clavier marche correctement. ^.-

M'enfin. Entre débutants, on se comprend j'imagine! :D



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)