Probleme pour gérer attachMovieClip()

Résolu
Siron123 Messages postés 4 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 30 décembre 2009 - 28 déc. 2009 à 19:23
Siron123 Messages postés 4 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 30 décembre 2009 - 30 déc. 2009 à 11:17
Bonjour à tous,

J'ai un soucis avec la fonction attachMovieClip(), je veux en fait défaire en sorte que mon vaisseau puisse tirer des lasers, donc je fais :

fond.onRelease = function(){ /* au clique de la souris */
reference = attachMovie("laser", "laser"+i, _root.getNextHighestDepth() ); /* on duplique le clip laser de la bibliothèque */
reference._x = vaisseau._x;
reference._y = vaisseau._y - 27;
i++; 
reference.onEnterFrame = function(){ 
this._y -= 5;
if(this._y < -5){ /* on supprime "laser" s'il sort de la scène */
this.removeMovieClip();
}
}
}

Mais lorsque je veux faire en sorte que ces laser disparaissent et fassent disparaitre la cible une fois qu'ils l'ont touchée (avec hitTest), rien ne se passe... Je me suis rendu compte qu'une fois qu'il y avait plusieurs laser sur la même scène, le hitTest devenait inutile..
	
if(hap.hitTest(reference)){
trace("touché");
}

Comment puis je faire donc?

Merci

6 réponses

dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
30 déc. 2009 à 09:53
Ah ben on y voit plus clair !
hap représente donc le seul ennemi à l'écran, qui descend vers le joueur.

Je vois quelques problèmes..

Déjà il faut sortir ton fond.onRelease = function(){ de la boucle onEnterFrame, car elle est redéfinis à chaque rafraichissement et ça ne sert à rien. Tu peux la définir avant le onEnterFrame.

Ensuite pour ton if(hap.hitTest(reference)), c'est normal que ça ne fonctionne pas car reference, tu le déclare en tant que variable locale dans fond.onRelease. Donc elle n'existe plus en dehors de cette fonction. Tu n'as qu'à tester un trace(reference), tu verras que ça sera à nul normalemement. Donc ce qu'il faut c'est faire le hitTest dans sa boucle onEnterFrame, tout simplement car on peut faire un test de collision entre 2 objets, et on connait le clip vaisseau qui est unique, alors que le vaisseau ne connait pas les clips lasers.

reference.onEnterFrame = function(){ 
this._y -= 5;
if(this._y < -5){ /* on supprime "laser" s'il sort de la scène */
if(hap.hitTest(this)){ // si le laser touche l'ennemi
trace("touché");
}
this.removeMovieClip();
}
}


Et encore un truc : fond.onRelease c'est pas top pour déclencher le tir. Il suffit que ton curseur soit au dessus d'un clip par dessus le fond pour que ça ne fonctionne plus. Un _root.onMouseDown serait + approprié par exemple.

Voilà, j'espère que t'y voit plus clair
3
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
29 déc. 2009 à 12:00
Bonjour

Déjà il faudrait effacer l'écouteur onEnterFrame lorsque tu efface un laser (delete this.onEnterFrame).

Quelle est cette variable reference ? Si c'est une variable globale, alors l'ancien est sans cesse écraser par le nouveau, ce qui fait qu'un seul laser fera les tests.
Et peut on voir le code avec le hitTest stp ? Parce que là on ne sait pas à quoi fait référence "hap", donc c'est difficile de te dépanner..
0
Siron123 Messages postés 4 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 30 décembre 2009
29 déc. 2009 à 20:16
Merci pour ta réponse dj_ouf, voila le code entier (non complet d'ailleurs ^^" )

function randRange(min:Number, max:Number):Number { /* Fonction hasard */
    var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
    return randomNum;
}

var vitesse:Number = new Number(5); /* on définit les variables */
var i:Number = new Number(0); 
var p:Number = new Number(0);

fond.swapDepths(-16383);/* profondeur minimal à fond, pour ne pas chevaucher d'autre clip */

_root.onEnterFrame = function(){ 

if(Key.isDown(Key.LEFT)){ /* on donne les mouvements au vaisseaux  */
vaisseau._x -= 5; }
if(Key.isDown(Key.RIGHT)){
vaisseau._x += 5; }

hap._x += vitesse;

/* on controle le vaisseau, le but est de toucher l'ennemi
hap qui s'approche de plus en plus */


if(hap._x - hap._width/2 <= 45){ /* si cible hap touche les limites, changement de sens */
vitesse = -vitesse ; /* variable que l'on rend négative pour changer le sens */
hap._y += 35;
}
if(hap._x + hap._width/2 >= Stage.width - 45){
vitesse = -vitesse ;
hap._y += 35;
}

fond.onRelease = function(){ /* au clique de la souris */

/* au clique de la souris, un laser est tiré */

reference = attachMovie("laser", "laser"+i, _root.getNextHighestDepth() ); /* on duplique le clip laser de la bibliothèque */
reference._x = vaisseau._x;
reference._y = vaisseau._y - 27;
i++; 
reference.onEnterFrame = function(){ 
this._y -= 5;
if(this._y < -5){ /* on supprime "laser" s'il sort de la scène */
this.removeMovieClip();
}
}
}
if(hap.hitTest(reference)){ // si le laser touche l'ennemi
trace("touché");
}
if(randRange(0,30) == 29){ // définit quand hap doit tirer un projectile
 		reference2 = attachMovie("balle","balle"+p,_root.getNextHighestDepth() ); /* on duplique balle */
reference2._x = hap._x;
reference2._y = hap._y;
p++;
reference2.onEnterFrame = function(){
this._y += 5;
if(this.y > Stage.height +5){
this.removeMovieClip();
}
}
}

}


Je suis encore débutant.. donc tout les conseils me seront utiles :')
0
Siron123 Messages postés 4 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 30 décembre 2009
30 déc. 2009 à 10:35
Ah oui, exactement , ca marche impec maintenant ^^

Mais y aurait il une autre solution? Définir référence par exemple, en tant qu'Object ou autre.. j'anticipe sur mes futurs erreurs.

Merci beaucoup en tout cas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
30 déc. 2009 à 11:04
Bah honnêtement je ne vois pas de solutions plus propre que celle ci...

Tu peux faire aussi dans le sens inverse, c'est à dire stocker dans un tableau toutes les variables de tir 'reference', puis boucler ce tableau dans le onEnterFrame pour tester individuellement si chaque tir touche le vaisseau. Mais après il faut effacer chaques référence du tableau quand il sort de l'écran ou touche le vaisseau, donc tu vois c'est bien plus compliqué..

Bref, je pense que cette technique est très bien
0
Siron123 Messages postés 4 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 30 décembre 2009
30 déc. 2009 à 11:17
Oui ^.^" on va garder celle ci,

Merci beaucoup pour ton aide!
0
Rejoignez-nous