Probleme : déplacement aléatoire multiple.

Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008 - 10 janv. 2008 à 17:02
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008 - 25 janv. 2008 à 10:34
Bonjour,

J'ai un soucis je travaille sur un petit jeu où des ennemis doivent se déplacer aléatoirement. Ils avancent font une pause plus ou moins longue, puis avance dans une autre direction, refont une pause et ainsi de suite indéfiniment. J'ai trouvé sur le site un code approchant où un objet avait se comportement.

Malheureusement j'ai deux problemes : Le code que j'ai trouvé est intégré dans son clip et non dans sa frame et je n'arrive pas a l'appliquer à plusieurs objets.

Voici mon code :

stop()

for (j=1; j<=8; j++){
this.attachMovie ("clip", "clip"+j, 100*j);
this["clip"+j]._x = randomization(100,800)
this["clip"+j]._y = randomization(100,650)
}

onEnterFrame = function(){
rebours = rebours-1;

if (rebours==0) {

for (j=1; j<=8; j++){
rebours = Math.floor (Math.random ()*32)+24;
direction = Math.floor (Math.random ()*360);
elan = Math.floor (Math.random ()*5)+10;
_rotation = (direction/Math.PI)*180;
}
}

_x = _x+(Math.cos (direction)*elan);
_y = _y+(Math.sin (direction)*elan);
if (elan>0) {
elan = elan-1;
}
}

la variable rebours est déclarer à 30 dans ma frame précédente (c'ets le seul code qu'on y trouve).
Clip est le nom de mon image.
Le résultat fait que mes 8 clips apparaissent bien mais ils ne se déplacent pas, ils disparaissent au bout d'un moment et respawn ailleurs (la plus part du temps hors de l'écran).

Sauriez-vous me dire comment je dois procéder ? J'avoue être une grande débutante en flash d'où mon probleme...

Merci d'avance pour tout !

13 réponses

cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
11 janv. 2008 à 16:09
Bonjour,
C'est quoi ta fonction randomization.
Sinon, de mon côté, j'ai essayé ton code et je n'ai qu'un bonhomme qui apparaît, c'est donc que la dite fonction, ou bien est absente de ton code ou bien ne fonctionne pas, mais le problème doit se balader la dedans

Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
11 janv. 2008 à 18:56
Argh milles excuses ! j'avasi oublié cette partie de mon code qui se trouve dans ma premiere frame ! :/ Il s'agit de la fonction de random de nombre classique telle qu'on la trouve dans l'aide de flash.

Si tu n'as vu qu'un objet c'est surement parce qu'ils étaient tous superposés du coup. :/

Désolée d'avoir oublié ça :/  voilà la fonction en question qui est placé dans la premiere frame :

function randomization(min:Number, max:Number):Number
{
     var randomY:Number = Math.floor(Math.random() * (max - min + 1)) + min;
     return randomY;
};

Merci pour ta réponse. :)
0
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
12 janv. 2008 à 10:10
Salut
Bon, ça n'est pas la panassé mais au moins ça bouge de façon à peu près aléatoire.
Je t'invite fortement, quand tu as un problème à utiliser les action trace pour voir où le bas blesse. Bref, voici un début de code qu'il reste à améliorer.

for (j=1; j<=8; j++){

this.attachMovie ("clip", "clip"+j, j);

_root["clip"+j]._x = randomization(10,200);

_root["clip"+j]._y = randomization(10,65);

}


direction = Math.floor (Math.random ()*360);

//trace("direction = "+direction);

//_rotation = (direction/Math.PI)*180;

for(i=1;i<=8;i++){

_root["elan"+i]= Math.floor (Math.random()*5)+5;

trace("elan"+i+" = "+_root["elan"+i]);

}


_root.onEnterFrame = function(){

if (elan==0) {

for (j=1; j<=8; j++){

_root["clip"+j]._x = _root["clip"+j]._x+(Math.cos (direction)*_root["elan"+j]);

_root["clip"+j]._y = _root["clip"+j]._y+(Math.sin (direction)*_root["elan"+j]);

trace("IF :: clip"+j+"._x "+_root["clip"+j]._x+" :: clip"+j+"._y "+_root["clip"+j]._y);

}

}

else{

for (j=1; j<=8; j++){

_root["clip"+j]._x = _root["clip"+j]._x+_root["elan"+j];//(Math.cos (direction)*elan);

_root["clip"+j]._y = _root["clip"+j]._y+_root["elan"+j];//(Math.sin (direction)*elan);

trace("ELSE :: clip"+j+"._x "+_root["clip"+j]._x+" :: clip"+j+"._y "+_root["clip"+j]._y);

}

}

}



function randomization(min:Number, max:Number):Number {

var randomY:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomY;

}


Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
14 janv. 2008 à 10:07
Merci beaucoup Inaden !! :)
Je vais regarder ça de suite, j'avais essayé d'utiliser trace mais je ne comprenais plus rien je t'avoue, je m'embrouillais trop. Merci encore pour ton aide ! :)
0

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

Posez votre question
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
14 janv. 2008 à 12:34
No problemo.
Bonne chance : )

Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
18 janv. 2008 à 11:17
Je me permet de relancer le sujet car j'ai un nouveau probleme maintenant. ^^
Grace à ton code Inaden j'ai réussi à coder le déplacement aléatoire comme je le souhaitais. Voici le code en question :

Dans la premiere Frame :
//Function pour randomer un nombre aléatoirement :

function randomization(min:Number, max:Number):Number
{
var randomY:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomY;
};

//déclaration de la variable rebours qui prend une valeur différente pr chaque ennemi.

for(i=1;i<=8;i++){
_root["rebours"+i]= randomization (10,30);
}

//fonction de création des clips

function spawn(){
for (j=1; j<=8; j++){
this.attachMovie ("clip", "clip"+j, 100*j);
this["clip"+j]._x = randomization(100,800)
this["clip"+j]._y = randomization(100,650)
}
}

Dans la seconde frame :

stop()

spawn (); //Appel de la fonction qui crée les ennemis

_root.onEnterFrame = function (){

for(i=1;i<=8;i++){//effectue le code de mouvement pour chaque ennemi séparément

_root["rebours"+i]= _root["rebours"+i]-1;//décompte du compte à rebours

if (_root["rebours"+i] == 0){//qd le compte a rebours est a zero on lance le mouvement du clip.
_root["rebours"+i]= randomization (20,60);
_root["direction"+i] = Math.floor (Math.random ()*360);
_root["clip"+i]._rotation = (_root["direction"+i]/Math.PI)*180;
_root["elan"+i]= Math.floor (Math.random()*5)+15;
}

_root["clip"+i]._x = _root["clip"+i]._x+(Math.cos(_root["direction"+i]) *_root["elan"+i]);
_root["clip"+i]._y = _root["clip"+i]._y+(Math.sin(_root["direction"+i]) *_root["elan"+i]);

if (_root["elan"+i]>0) {
_root["elan"+i] = _root["elan"+i]-1;
}//fin du code de mouvement du clip
}
}

Ce code là marche parfaitement (si vous voulez tester créez juste un movieclip appelé clip). Je souhaite maintenant rajouter deux choses à mon code :
- Empecher mes clips de sortir du cadre de mon décor
ça j'ai réussi, j'utilise deux fonctions, l'une crée le décor et l'autre est un hittest entre mes ennemis et mon décor.

- Empecher mes ennemis de se chevaucher. C'est là ou le bas blesse.
Comme je crée et nomme mes ennemis dynamiquement, ils ont tous le même nom "clip"+i. Le probleme c'est que mon code est dans une boucle du coup je ne sais pas comment faire pour réaliser un hittest entre "clip"+i ou i =1 par exemple et "clip"+i ou i = 2... Je ne sais pas si je suis trés claire dites le moi si vous avez besoin de précisions.

Merci d'avance pour votre aide. :)
0
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
18 janv. 2008 à 14:13
Salut,
Avec l'animation, ou tout du moins l'ensemble du code (test de sortie de scène compris...) ce serait plus facile pour voir comment faire. Et puis la fonction spawn... c'est quoi ?

Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
21 janv. 2008 à 10:18
La fonction spawn est initialisée dans la premiere frame c'est la fonction qui crée les clips. Je vais remettre tout mon code actuel que j'ai mis a l'heure actuel dans trois frames.

La première :

//Function pour randomer un nombre aléatoirement :

function randomization(min:Number, max:Number):Number
{
var randomY:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomY;
};

//déclaration de la variable rebours qui prend une valeur différente pr chaque ennemi.

for(i=1;i<=8;i++){
_root["rebours"+i]= randomization (10,30);
}

//fonction de création des clips

function spawn(){
for (j=1; j<=8; j++){
this.attachMovie ("clip", "clip"+j, 100*j);
this["clip"+j]._x = randomization(100,800)
this["clip"+j]._y = randomization(100,650)
}
}

Dans la deuxieme frame je mets le nouveau code qui m'intéresse :

// Déclaration de la fonction de spawn du décor.

function spawn_borddemap() {
this.attachMovie ("top", "TOP", 130, {_x:0,_y:0});
this.attachMovie ("down", "DOWN1", 134, {_x:0,_y:768});
this.attachMovie ("down", "DOWN", 131, {_x:0,_y:700});
this.attachMovie ("left", "LEFT", 132, {_x:100,_y:0});
this.attachMovie ("right", "RIGHT", 133, {_x:1024,_y:0});
};

// Déclaration de la fonction de collision avec le décor empêchant les ennemis de sortir.

function collisiondecor() {
for (j=1; j<=8; j++)
{
if (eval("ENNEMI"+j).hitTest(TOP))
{
_root["ENNEMI"+j]._y += 30;
}
if (eval("ENNEMI"+j).hitTest(DOWN))
{
_root["ENNEMI"+j]._y -= 30;
}
if (eval("ENNEMI"+j).hitTest(RIGHT))
{
_root["ENNEMI"+j]._x -= 30;
}
if (eval("ENNEMI"+j).hitTest(LEFT))
{
_root["ENNEMI"+j]._x += 30;
}
}
};

// Déclaration de la fonction permettant de tester les collisions entre ennemis & ennemis. Mais ce code là ne marche pas :(

function collision_ennemiennemi() {


for(i=1;i<=8;i++){

for(a=1;a<=8;a++){

if(this["clip"+i].hitTest(this["clip"+a])){
//On regarde que les 2 clips n'aient pas le même numéro

if(this["clip"+i].numero!=this["clip"+a].numero){
//Si c'est le cas 2 clips différent se touchent.
trace("touch");
}
}
}
}
}

Ca code là (le dernier mis) ne marche pas c'ets celui qui me pose probleme le code de collision entre deux ennemis.

et Enfin le code de la troisième frame :

stop()

spawn_borddemap()
spawn ();//fonction qui crée les 8 ennemis.

_root.onEnterFrame = function (){

collisiondecor()
collision_ennemiennemi()

for(i=1;i<=8;i++){//cette boucle permet d'éxecuter les commandes de déplacement et de rebours pour chaque ennemi séparément

_root["rebours"+i]= _root["rebours"+i]-1;//ça c'est le décompte du compte à rebours de l'ennemi numéro i...

if (_root["rebours"+i] == 0){//...qd ce compte à rebours arrive à zero on lance le mouvement de l'ennemi numéro i

_root["rebours"+i]= randomization (20,60);//ça c'est pour réinitialiser le compte à rebours de l'ennemi i
_root["direction"+i] = Math.floor (Math.random ()*360);//ça c'est pr définir la direction dela rotation
_root["ENNEMI"+i]._rotation = (_root["direction"+i]/Math.PI)*180;//ça c'est la fonction de rotation

_root["elan"+i]= Math.floor (Math.random()*5)+15; // ça c'est la fonction qui donne le mouvement du personnage
}

_root["ENNEMI"+i]._x = _root["ENNEMI"+i]._x+(Math.cos (_root["direction"+i])*_root["elan"+i]);
//ça c'est la fonction qui donne le sens du mouvement sur x
_root["ENNEMI"+i]._y = _root["ENNEMI"+i]._y+(Math.sin (_root["direction"+i])*_root["elan"+i]);


if (_root["elan"+i]>0) {
_root["elan"+i] = _root["elan"+i]-1;
}
}
}

Voilà maintenant tu as le code complet. Les décors qui sont appelés par la fonction spawn_borddemap sont tout simplement des traits qui font le bords de l'écran. JE n'arrive pas à faire fonctionner la dernière fonction de la frame deux la collision ennemis/ennemis. Est-ce que tu saurais voir où réside mon erreur ? Je ne parviens pas à comprendre. :/

Merci d'avance pour tout ! :)
0
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
21 janv. 2008 à 18:56
Salut,
désolé mais quand j'édite ton animation (avec ton code) les bonshommes ne se déplacent pas.
Avec l'animation (une version basique) ce serait sûrement plus simple. Désolé.

Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
21 janv. 2008 à 19:14
Raaaah je suis désolée !
Que je suis bete !!
J'ai copié collé le
mauvais code, la fonction spawn est mauvaise...
Voici le bon code
:

//fonction de création des clips

function
spawn(){ 

   for (j=1; j<=8; j++){ 

      this.attachMovie
("clip", "ENNEMI"+j, 100*j); 
      this["ENNEMI"+j]._x =
randomization(100,800) 
      this["ENNEMI"+j]._y =
randomization(100,650) 
   }
}

J'avais modifié le nom du clip
entre mes deux versions et je l'avais complétement oublié qd j'ai posté mon
deuxieme post... Désolée encore :/
Merci de ta patience Inaden. :)
0
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
22 janv. 2008 à 08:16
Salut,
Bon, c'est pas encore ça mais au moins il se passe quelque chose. J'ai changer un peu ta fonction de colision. Plusieurs problèmes :
Il ne se passe pas vraiment quelque chose de probant
La fonction prend le pas sur celle de la scène.


function collision_ennemiennemi() {

//trace("TEST DE COLISION");

for(i=1;i<=8;i++){

for(a=1;a<=8;a++){

if(_root["ENNEMI"+i].hitTest(_root["ENNEMI"+a])){

//trace(" ---> Test de contact");

//On regarde que les 2 clips n'aient pas le même numéro

if(this["ENNEMI"+i]!=this["ENNEMI"+a]){

if(_root["ENNEMI"+i]._x=_root["ENNEMI"+a]._x){

//trace("toucher : "+_root["ENNEMI"+i]+ " / "+_root["ENNEMI"+a]);

_root["ENNEMI"+a]._x+=25;

//trace("toucher : "+_root["ENNEMI"+a]._x);

}

}

}

}

}

}

C'est une piste. Tiens nous au courant
Tout vient à qui sait attendre
0
cs_inaden Messages postés 618 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 27 août 2010 2
22 janv. 2008 à 08:18
Ah oui. Tu peux mettre tout ton code sur une seule image clé. Le tout est de ranger un peu ce qui est fonction, appel de fonction et création de variable et d'élément.

Tout vient à qui sait attendre
0
Seydjinn Messages postés 9 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 11 février 2008
25 janv. 2008 à 10:34
Coucou ! :)

Désolée pour le blackout beaucoup de boulot dc je n'ai pas pu me remettre tout de suite à mon code.

Alors voilà la fonction que j'ai appliqué et qui marche presque ! :)

La seule chose qui me reste comme léger probleme c'est que de temps en temps les clips semblent se bloquer entre eux.
Voilà le code en question :

function collision_ennemiennemi() {

for(i=1;i<=8;i++){

for(a=1;a<=8;a++){

if(_root["ENNEMI"+i].hitTest(_root["ENNEMI"+a])){
//On regarde que les 2 clips n'aient pas le même numéro

if(this["ENNEMI"+i]!=this["ENNEMI"+a]){
_root["direction"+i] = Math.floor (Math.random ()*360);
_root["clip"+i]._rotation = (_root["direction"+i]/Math.PI)*180;
_root["elan"+i]= Math.floor (Math.random()*5)+15;
_root["direction"+a] = Math.floor (Math.random ()*360);
_root["clip"+a]._rotation = (_root["direction"+i]/Math.PI)*180;
_root["elan"+a]= Math.floor (Math.random()*5)+15;
}
_root["ENNEMI"+i]._x = _root["ENNEMI"+i]._x+(Math.cos (_root["direction"+i])*_root["elan"+i]);
_root["ENNEMI"+i]._y = _root["ENNEMI"+i]._y+(Math.sin (_root["direction"+i])*_root["elan"+i]);

_root["ENNEMI"+a]._x = _root["ENNEMI"+a]._x-(Math.cos (_root["direction"+a])*_root["elan"+a]);
_root["ENNEMI"+a]._y = _root["ENNEMI"+a]._y-(Math.sin (_root["direction"+a])*_root["elan"+a]);

}
}
}
}

Voilà merci encore Pour tout ! :)
0
Rejoignez-nous