[ AS3 ] problemes de déplacement dynamique d'un Child

Messages postés
36
Date d'inscription
mardi 30 juin 2009
Statut
Membre
Dernière intervention
1 novembre 2010
- - Dernière réponse : ptitvincent
Messages postés
36
Date d'inscription
mardi 30 juin 2009
Statut
Membre
Dernière intervention
1 novembre 2010
- 1 nov. 2010 à 13:28
Bonjour à tou,

Je suis actuellement sur le dev d'un jeu en flash pour mon apprentissage personnel (quelques un de mes problemes ont trouvé reponse ici grace à pegaze ^^)

J'en arrive au stade ou mes ennemis sur scene (ajouté via addchild) doivent tirer des boules de feu.
Hors ses meme boulles de feu (ajouté par addchild aussi) ne se déplace pas.
Il me dit meme qu'il est impossible d'accéder à la référence d'un objet nul.

voici le code (je ne commente que les parties qui nous intéressent ici) :


var i:int=0;
//ici un tableau pour les coordonées de mes mechants
var tabx:Array=new Array(1050,1860,2640,3280,5160,6178,7154,8000,8948);

//une boucle pour ajouter les mechants sur scene
for (i=0; i<tabx.length; i++) {
var mechant:Mechant = new Mechant();
mechant.name=String(i);
//ajout des mechant sur un calque en 4eme position
addChildAt(mechant, 4);
//positionnement du x du mechant en cours via le tableau
getChildByName(String(i)).x=int(tabx[i]);
getChildByName(String(i)).y=-220;
}







import flash.media.SoundChannel;
import flash.events.Event;
import MusicLoop;



var snd:Sound = new MusicLoop();

startSound(snd);

function startSound(sound:Sound):void {
var channel:SoundChannel=sound.play();
channel.addEventListener(Event.SOUND_COMPLETE,replay);
}

function replay(e:Event):void {
startSound(snd);
}


var gravity:Number=1;
var velocity:Number=0;
var speed:int=10;
var sens:int=1;
var stopsens:int=1;
var run:Boolean=false;
var rung:Boolean=false;
var Jump:Boolean=false;




stage.addEventListener(KeyboardEvent.KEY_DOWN, f_DOWN);
stage.addEventListener(KeyboardEvent.KEY_UP, f_UP);
stage.addEventListener(Event.ENTER_FRAME, f_ALL);

function f_DOWN(event:KeyboardEvent):void {
switch (event.keyCode) {
case Keyboard.UP :
Jump=true;
break;
case Keyboard.RIGHT :
sens=1;
run=true;
rung=false;
stopsens=1;
if (! testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
foxAnim.scaleX=1;
stopsens=1;
}
break;
case Keyboard.LEFT :
sens=-1;
rung=true;
run=false;
stopsens=2;
if (! testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
foxAnim.scaleX=-1;
stopsens=2;
}
break;
}
}

function f_UP(event:KeyboardEvent):void {
switch (event.keyCode) {
case Keyboard.UP :
Jump=false;
break;
case Keyboard.RIGHT :
run=false;
if (rung==false&&! velocity>0) {
foxAnim.gotoAndStop(1);
}
break;
case Keyboard.LEFT :
rung=false;
if (run==false&&! velocity>0) {
foxAnim.gotoAndStop(6);
}
break;
}
}
function f_ALL(event:Event):void {
velocity+=gravity;
if (testee.hitTestPoint(fronttest.x,fronttest.y,true)||testee.hitTestPoint(fronttestg.x,fronttestg.y,true)||sol.x==-8||sol.x==-9388) {
speed=0;
if (sol.x==-8&&run==true) {
speed=10;
}
} else {
speed=10;
}
if (testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
velocity=0;

if (Jump==true) {
foxAnim.y-=10;
fronttest.y-=10;
fronttestg.y-=10;
pattest.y-=10;
foxAnim.y--;
fronttest.y--;
fronttestg.y--;
pattest.y--;
velocity=-12.5;
if (stopsens==1) {
foxAnim.gotoAndStop(3);
}
if (stopsens==2) {
foxAnim.gotoAndStop(4);
}
}
} else {
foxAnim.y+=velocity;
fronttest.y+=velocity;
fronttestg.y+=velocity;
pattest.y+=velocity;
if (rung==true&&testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
foxAnim.gotoAndStop(5);
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
}
if (run==true&&testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
foxAnim.gotoAndStop(2);
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
}
if (rung==false&&run==false&&testee.hitTestPoint(pattest.x,pattest.y+pattest.height/2,true)) {
if (stopsens==1) {
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
foxAnim.gotoAndStop(1);
}
if (stopsens==2) {
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
foxAnim.gotoAndStop(6);
}
}
}
if (rung==true&&! velocity>0) {
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
foxAnim.gotoAndStop(5);
}
if (run==true&&! velocity>0) {
if (foxAnim.scaleX==-1) {
foxAnim.scaleX=1;
}
foxAnim.gotoAndStop(2);
}
if (rung==true) {
back.x-=sens*speed/8;
sol.x-=sens*speed;
testee.x-=sens*speed;
solf.x-=sens*speed;
}


if (run==true) {
back.x-=sens*speed/8;
sol.x-=sens*speed;
testee.x-=sens*speed;
solf.x-=sens*speed;
}

/* -------------     LES MECHANTS  --------------- */
//une autre boucle pour récuperer un i aléatoire via les meme regles que la boucle pour créer les mechants
for (i=0; i<tabx.length; i++) {
//pour me simplifier la vie je renome le getChild
var thismechant=getChildByName(String(i));
//ici les regles pour que les mechants suivent le terrain (marchent nikel)
if (rung==true) {
thismechant.x-=sens*speed;
}
if (run==true) {
thismechant.x-=sens*speed;
}
if (! testee.hitTestPoint(thismechant.x,thismechant.y+thismechant.height,true)&&thismechant.x<2000) {
thismechant.y+=5;
}
/* ----- MON PROBLEME ----- */
//je veux qu'ils tirent quand ils sont à 300pixels du hero (qui se trouve à x_300 sur une scene à 600)
var calculshoot:int=thismechant.x-foxAnim.x;
if (calculshoot==300) {
//je joue l'anim de tir du mechant
thismechant.gotoAndPlay(13);
//j'ajoute une fireball
var fireball:Fireball = new Fireball();
fireball.name="fb";
var thisfireball=getChildByName("fb");
addChildAt(fireball, 5);
//ici je la positione sur le mechant
thisfireball.x=thismechant.x;
thisfireball.y=thismechant.y;
//si elle ne touche pas le sol ni le hero alors je décrémante son x de 20
if (! testee.hitTestPoint(thisfireball.x,thisfireball.y,true)||! foxAnim.hitTestObject(thisfireball)) {
thisfireball.x-=20;
if (run==true) {
//de 10 si le hero avance à droite
thisfireball.x-=10;
}
if (rung==true) {
//de 30 si il avance à gauche
thisfireball.x-=30;
}
}
}
}
}



Je ne sais vraiment plus par quel out prendre mon probleme :x

Merci d'avance pour votre aide

à bientot.
Afficher la suite 

2 réponses

Messages postés
36
Date d'inscription
mardi 30 juin 2009
Statut
Membre
Dernière intervention
1 novembre 2010
0
Merci
j'ai oublié de préciser que mon message d'erreur arrive quand je suis à 300px du premier mechant.
Commenter la réponse de ptitvincent
Messages postés
36
Date d'inscription
mardi 30 juin 2009
Statut
Membre
Dernière intervention
1 novembre 2010
0
Merci
personne n'aurait une idée ? :)
Commenter la réponse de ptitvincent