Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 12
    Points : 2
    Points
    2

    Par défaut Plantage au lancement du SWF

    Bonjour,
    Comme exercice d'initiation aux classes, j'ai créé un aquarium.fla qui renvoie aux fichiers Clown.as, Piranha.as et Poisson.as, Poisson étant la super classe de Clown et Piranha. Quand un Clown rencontre un Clown, ils font des bulles. Quand un Piranha rencontre un Clown il le détruit et dis Miam !
    J'avais tout fini, ça marchait impec et quand j'ai voulu relancer le fichier SWF quelques jours plus tard le player a planté. Si je veux générer le SWF dans Flash, Flash plante aussi. J'ai pensé à des problèmes d'emplacement de fichier, mais apparemment ce n'est pas ça.
    Voici le code d'aquarium.fla :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import flash.display.MovieClip;
    import Classes.Poisson;
    import Classes.Piranha;
    import Classes.Clown;
    import flash.events.TimerEvent;
    //création d'un poisson de chaque type toutes les 5 secondes
    var monTimer:Timer = new Timer(5000);
    monTimer.addEventListener(TimerEvent.TIMER,Creer);
    monTimer.start();
    function Creer(ev:TimerEvent):void
    {
    	var p1:Piranha;
    	//je crée deux fois plus de clowns pour équilibrer le jeu
    	var p2:Clown;
    	var p3:Clown;
    	//les piranhas arrivent par la gauche
    	p1 = new Piranha(0,Math.random() * 400);
    	//les clowns arrivent par la droite
    	p2 = new Clown(550,Math.random() * 400);
    	p3 = new Clown(550,Math.random() * 400);
    	addChild(p1);
    	addChild(p2);
    	addChild(p3);
    }
    La classe Poisson :

    Code :
    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
    package Classes
    {
    	import flash.display.MovieClip;
    	import flash.events.Event;
     
    	public class Poisson extends MovieClip
    	{
    		//création de la liste des poissons, la variable est static pour être partagée par toutes les instances
    		public static var listePoissons:Array = new Array();
    		public static var listePoissons2:Array = new Array();
    		public var vitX,vitY:Number;
    		public function Poisson(px:Number=0,py:Number=0)
    		{
    			this.x = px;
    			this.y = py;
    			//à chaque création on ajoute le poisson dans les listes
    			Poisson.listePoissons.push(this);
    			Poisson.listePoissons2.push(this);
    			this.addEventListener(Event.ENTER_FRAME,bouge);
    			//cet écouteur sera enlevé dans la fonction detruit de la classe clown
    		}
    		public function bouge(ev:Event):void
    		{
    			stop();
    			this.x +=  this.vitX;
    			//si le poisson touche le bord gauche de l'écran donc x<=0
    			if (this.x <= 0)
    			{//à la moitié de la largeur de son corps
    				this.x = this.width/2;
    				//on inverse le sens de déplacement
    				vitX*= -1;
    				//et on change de frame
    				this.gotoAndStop(1);
    			}
    			//bord de droite à la moitié du corps du poisson
    			else if (this.x >= stage.stageWidth-this.width/2)
    			{
    				//on le ramène au bord
    				this.x = stage.stageWidth-this.width/2;
    				//on inverse le sens du déplacement
    				vitX *= -1;
    				//et on change de frame
    				this.gotoAndStop(2);
    			}
    		}
     
    	}
     
    }
    La classe Clown :

    Code :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package Classes
    {
    	import flash.display.MovieClip;
    	import flash.events.Event;
    		import flash.events.TimerEvent;
    	import flash.utils.Timer;
    	import Classes.Poisson;
    	public class Clown extends Poisson
    	{
    		public function Clown(px:Number=0,py:Number=0)
    		{
    			//appelle le constructeur du parent Poisson
    			super(px,py);
    			this.vitX = Math.random() * 10 - 5;
    			this.vitY = Math.random() * 10 - 5;
    			this.addEventListener(Event.ENTER_FRAME,bulle);
    		}
    		//fonction bulle : quand un clown rencontre un clown ils bullent
    		public function bulle(ev:Event)
    		{
    			var j:int;
    			var bulles:Bulles;
    			//on parcoure la liste 2 des poissons
    			//j'ai testé en utilisant la même liste mais ça provoquait des bugs
    			for (j>=0; j=listePoissons2.length-1; j++)
    			{
    				//vérification : que ce n'est pas lui même
    				//que c'est bien un clown
    				//qu'il le touche
    				if (listePoissons2[j] != this && listePoissons2[j] is Clown && this.hitTestObject(listePoissons2[j]))
    				{
    					bulles=new Bulles();
    					addChild(bulles);
    					bulles.x = 23;
    					bulles.y = 0;
    					//bullesTimer : les bulles seront supprimées après 1 secondes
    					// on crée le timer
    					var bullesTimer:Timer = new Timer(1000,1);
    					// on place l'écouteur
    					bullesTimer.addEventListener(TimerEvent.TIMER, effaceBulles);
    					// on démarre le timer
    					bullesTimer.start();
    					//on crée la fonction qui efface les bulles;
    					function effaceBulles(ev:Event):void
    					{
    						trace ("bulles");
    						removeChild(bulles);
    						bullesTimer.stop();
    					}
    				}
    			}
    		}
    		//fonction detruit appelée dans la fonction mange de la classe Piranha
    		public function detruit(ev:Event)
    		{
    			//on détruit le clown touché
    			trace("clown");
    			parent.removeChild(this);
    			//on détruit l'écouteur bouge du poisson touché
    			this.removeEventListener(Event.ENTER_FRAME,bouge);
    		}
    	}
    }
    Et la classe Piranha :

    Code :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    package Classes
    {
    	import flash.display.MovieClip;
    	import flash.events.Event;
    	import flash.events.TimerEvent;
    	import flash.utils.Timer;
    	import Classes.Poisson;
    	public class Piranha extends Poisson
    	{
    		// constructor code
    		public function Piranha(px:Number=0,py:Number=0)
    		{
    			//appelle le constructeur du parent Poisson
    			super(px,py);
    			this.vitX = Math.random() * 5 + 5;
    			this.vitY = Math.random() * 5 + 5;
    			this.addEventListener(Event.ENTER_FRAME,mange);
    		}
    		public function mange(ev:Event):void
    		{
    			var i:int;
    			var miam:Miam;
    			//on parcourt la liste des poissons en partant de la fin
    			for (i=listePoissons.length-1; i>=0; i--)
    			{
    				//vérification : que ce n'est pas lui même
    				//que c'est bien un clown
    				//qu'il le touche
    				if (listePoissons[i] != this && listePoissons[i] is Clown && this.hitTestObject(listePoissons[i]))
    				{
    					//l'écouteur de la fonction bouge sera retiré dans la fonction detruit de la classe clown;
    					var ev:Event;
    					//on affiche miam au-dessus du poisson
    					miam=new Miam();
    					addChild(miam);
    					//miamTimer : le miam sera supprimé après 1 secondes
    					// on crée le timer
    					var miamTimer:Timer = new Timer(1000,1);
    					// on place l'écouteur
    					miamTimer.addEventListener(TimerEvent.TIMER, effaceMiam);
    					// on démarre le timer
    					miamTimer.start();
    					//on crée la fonction qui efface le miam;
    					function effaceMiam(ev:Event):void
    					{
    						removeChild(miam);
    						miamTimer.stop();
    					}
    					//on appelle la fonction détruit qui est dans la classe Clown
    					listePoissons[i].detruit(ev);
    					//on enlève la case vide du tableau;
    					listePoissons.splice(i,1);
    					//on retire de la liste le poisson qu'on a touché;
    					listePoissons[i].parent.removeChild(listePoissons[i]);
     
    				}
    			}
    		}
    	}
     
    }
    Quand on a des erreurs de compilation, on peut chercher et s'en sortir, mais là, je suis totalement désemparée. Qu'est-ce qui peut faire planter le programme ?
    Merci de votre aide !

  2. #2
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    16 409
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 16 409
    Points : 78 204
    Points
    78 204

    Par défaut

    Bonjour,

    N'avez vous pas un débogueur ? Lancez le code en débogue.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Invité de passage
    Inscrit en
    juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 12
    Points : 2
    Points
    2

    Par défaut

    Merci, j'ai essayé et le débogueur m'a indiqué que c'était la fonction bulle dans Clown.as qui posait problème, à : bulles=new Bulles();
    Apparemment le script se bloque à cet endroit.
    J'ai essayé de réécrire ma fonction bulle mais ça bloque toujours au même endroit. Est-ce que vous comprenez où est le problème ?
    Code :
    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
    public function bulle(ev:Event):void
    {
    	var j:int;
    	var bulles:Bulles;
    	//on parcourt la liste 2 des poissons
    	//j'ai testé en utilisant la même liste mais ça provoquait des bugs
    	for (j>=0; j=listePoissons2.length-1; j++)
    	{
    		//vérification : que ce n'est pas lui même
    		//que c'est bien un clown
    		//qu'il le touche
    		if (listePoissons2[j] != this && listePoissons2[j] is Clown && this.hitTestObject(listePoissons2[j]))
    		{
    			var ev:Event;
    			bulles=new Bulles();
    			addChild(bulles);
    			//bulles.x = 23;
    			//bulles.y = 0;
    			//bullesTimer : les bulles seront supprimées après 1 secondes
    			// on crée le timer
    			var bullesTimer:Timer = new Timer(1000,1);
    			// on place l'écouteur
    			bullesTimer.addEventListener(TimerEvent.TIMER, effaceBulles);
    			// on démarre le timer
    			bullesTimer.start();
    			//on crée la fonction qui efface les bulles;
    			function effaceBulles(ev:Event):void
    			{
    				trace ("bulles");
    				removeChild(bulles);
    				bullesTimer.stop();
    			}
    		}
    	}
    }

  4. #4
    Invité de passage
    Inscrit en
    juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 12
    Points : 2
    Points
    2

    Par défaut

    J'ai trouvé où était le problème : je crée une liste de poissons (listepoissons2) et je la parcourais à l'endroit avec j++, ça dû provoquer des problèmes (mais je n'arrive pas à comprendre lesquels puisque je ne fais pas de slice dans ce tableau ???). En tous cas, si je la parcours à l'envers c'est nickel.

    Je n'avais pas l'habitude d'utiliser le débogueur, je me contentais de la fenêtre compiler errors et de contrôles dans l'output avec des trace. C'est vachement plus complet le débogueur, merci !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •