Forums Développement Multimédia

Aller au contenu

Mouvements aléatoires défaillants.

CODE

10 réponses à ce sujet

#1 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 15 April 2013 - 19:30 PM

Bonjour à tous !

Je travail (en amateur) actuellement sur un petit projet de jeu vidéo afin de me familiariser avec l'AS3 que je viens récemment d'apprendre à travers divers tutoriels, ainsi qu'avec la bibliothèque Flixel.

Je ne vous cache pas que j'ai encore de grosses lacunes et que je me heurte souvent à tout un tas de problèmes en tout genre, habituellement j’apprends donc de mes erreurs lorsque j'arrive enfin à les résoudre.

Cependant, après avoir cherché un bon bout de temps comment gérer un mouvement aléatoire, je n'arrive cette fois ci pas à surmonter le problème.

J'ai un peu fouillé et je suis arrivé à l'écriture de ceci:

public function mouvementZombies(h:FlxGroup):void
    {
        dirX = Math.random()*1366;
        dirY = Math.random()*768;
        vitesse = 500;
       
        z = 0; // indice 0 de mon FlxGroup (correspond à mon premier zombie)
       
        //Cette boucle fait le tour de mon FlgGroup
        while (z <= 1) // Ici le nombre se doit d'être égale a mon nombre de zombies -1 car les indices des tableaux commencent à 0.
        {
        _zombieGrp.members[z].x += (dirX - _zombieGrp.members[z].x)/vitesse;
        _zombieGrp.members[z].y += (dirY - _zombieGrp.members[z].y) / vitesse;
       
        z = z + 1
        }
    }

Bien que les mouvements de mes clips semblent aléatoires sur un courte (voir très courte) distance, ils finissent toujours par arriver au milieu de mon écran pour y piétiner.

J'espère donc que vous voudrez bien m'aider à progresser en pointant du doigt le problème et en me remettant sur la droit chemin grâce à quelques indices.

Merci d'avance pour votre lecture, Getrox.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 15 April 2013 - 20:12 PM

Salut et bienvenue,

Je ne suis pas sur que diviser par la vitesse soit une bonne chose.

La logique voudrait que tu tire une cible aléatoire sur la scène, tant que le zombie n'a pas atteint cette cible il se déplace dans sa direction. Pour cela il faut tirer un point aléatoire (c'est la cible), puis trouver l'angle entre la position actuelle du zombie et la cible et enfin déplacer le zombie sur les deux axes en fonction de l'angle multiplié par la vitesse. Pour affiner (car ce genre de déplacement est rarement précis) tu peux faire un calcul de distance entre le zombie et la cible, si le zombie est assez proche de la cible on considère qu'il l'a atteinte.

Pour la mise en place tu as besoin d'un tirage aléatoire, d'un calcul de distance, et d'un calcul d'angle.

Tirage aléatoire :

cible.x = Math.random()*stage.stageWidth;
cible.y = Math.random()*stage.stageWidth;

Calcul de la distance :

Dx = zombie.x-cible.x;
Dy = zombie.y-cible.y;
distance = Math.sqrt(Dx*Dx-Dy*Dy);

Calcul de l'angle :

Dx = zombie.x-cible.x;
Dy = zombie.y-cible.y;
angle = Math.atan2(Dy,Dx);

Calcul du déplacement :

zombie.x -= Math.cos(angle)*vitesse;
zombie.y -= Math.sin(angle)*vitesse;

Ce qui te donne un truc du genre (à adapter à Flixel) :

var W:int = stage.stageWidth;
var H:int = stage.stageHeight;
var Dx:Number;
var Dy:Number;
var angle:Number;
var distance:Number;
var vitesse:Number = 10;
var cible:Point = new Point(Math.random()*W, Math.random()*H);

addEventListener(Event.ENTER_FRAME, main);

function main(e:Event):void{
       
        Dx = zombie.x-cible.x;
        Dy = zombie.y-cible.y;
        angle = Math.atan2(Dy,Dx);
        distance = Math.sqrt(Dx*Dx-Dy*Dy);

        if(distance>10) {
                zombie.x -= Math.cos(angle)*vitesse;
                zombie.y -= Math.sin(angle)*vitesse;
        } else {
                cible.x = Math.random()*stage.stageWidth;
                cible.y = Math.random()*stage.stageHeight;
        }
}

Histoire d'optimiser, tu peux te passer de la racine carré (Math.sqrt) à ce niveau, il te suffit de passer la distance minimum au carré et tu évitera une opération lourde. A partir de là tu peux intégrer tout un tas de comportements, comme par exemple faire attendre le zombie par moment au lieu de le faire changer de direction tout de suite lorsqu'il a atteint sa cible.

Fichier(s) joint(s)



#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 15 April 2013 - 20:24 PM

Ha oui, je te recommande d'éviter Flixel dès le début de ton apprentissage des jeux vidéos.

Flixel c'est très bien mais ça demande d'avoir déjà une très bonne connaissance des mécanismes inhérents à la conception de jeux vidéo, donc des base suffisantes pour bien prendre en main la librairie. Pour te faire la main je te recommande de commencer par toute une série de jeux simples, que ce soit à l'IDE, en POO et/ou avec des librairies externes ne change rien aux principes. Par exemple la question que tu viens de poser en est un (de principe de base), je trouve ça plus efficace de se faire les dents sur des petits jeux en procédural au départ pour bien saisir les bases, puis de se lancer dans la POO et les librairies par la suite, après chacun fait comme il veut.

Tu as dans ma signature toute une série de tutos pour se faire la main sur des jeux simples en AS3, et tu trouvera pas mal d'autres choses par ici : http://forums.mediab...shplatform/jeux

#4 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 15 April 2013 - 20:30 PM

Wouaw !

Merci pour cette réponse plus que détaillée Monsieur Spi, c'est bien plus que ce que j'en espérais.
Je vais de ce pas tenter de l'intégrer à mon code pour voir ce que ça donne, je vous en dis plus une fois cela fait.

De plus, je prend en compte vos conseils et vous remercie pour les divers liens.

Ps: Il me semble que mon sujet a était déplacé, je ferait plus attention à l'avenir.

#5 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 15 April 2013 - 20:42 PM

Pas de souci, n'hésites pas à repasser si tu as des questions.

Citation

Ps: Il me semble que mon sujet a était déplacé, je ferait plus attention à l'avenir.

Oui c'est moi qui l'ai déplacé dans la section "jeux vidéo" du forum, ta question s'y rapporte directement ;-)

Sinon, voilà un exemple avec 30 zombies qui se déplacent et peuvent faire des pauses.

var W:int = stage.stageWidth;
var H:int = stage.stageHeight;
var Dx:Number;
var Dy:Number;
var angle:Number;
var distance:Number;
var vitesse:Number = 2;
var i:int;
var zombie:Zombie;
var stock:Array;
var cible:Point = new Point(Math.random()*W, Math.random()*H);

init();

function init():void{
        stock = [];
        for (i=0; i<30; i++){
                zombie = new Zombie();
                zombie.x = Math.random()*W;
                zombie.y = Math.random()*H;
                zombie.X = Math.random()*W;
                zombie.Y = Math.random()*H;
                addChild(zombie)
                stock.push(zombie);
        }
   addEventListener(Event.ENTER_FRAME, main);
}

function main(e:Event):void{
       
        for each(zombie in stock){

                Dx = zombie.x-zombie.X;
                Dy = zombie.y-zombie.Y;
               
                angle = Math.atan2(Dy,Dx);
                distance = Math.sqrt(Dx*Dx-Dy*Dy);
               
                if(distance>10) {
                        zombie.x -= Math.cos(angle)*vitesse;
                        zombie.y -= Math.sin(angle)*vitesse;
                } else if(Math.random()>0.95){
                        zombie.X = Math.random()*W;
                        zombie.Y = Math.random()*H;
                }
        }
}

Fichier(s) joint(s)



#6 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 15 April 2013 - 21:37 PM

Je me heurtais justement à ce problème qui est de gérer tous les zombies à la fois, ma question trouve donc sa réponse avant même d'avoir était posée.

Pour l'instant je suis arrivé à adapter votre premier code au mien, le second ne devrait pas être beaucoup plus compliqé (j'espère ne pas parler trop vite). Je vous tiens au courant du résultat obtenu dès que j'aurai mis cela en place.

Merci encore pour ce nouvel ajout, et pour vos réponses rapides, claires et précises.

#7 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 16 April 2013 - 17:10 PM

Bonjour,
afin de faire bien comme il faut, j'aimerai ajouter à mon code la méthode addChild , addEvent, ect... que vous utilisez, mais j'ai une erreur qui me dit que la méthode n'est pas définie. Or, j'ai pourtant importé Flash.geom (pour la class Point par exemple) sans succès.
Je ne vois pas où peut se trouver l'erreur.

Pouvez-vous une nouvelle fois m'éclairer s'il vous plait?

#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 16 April 2013 - 17:34 PM

Dans Flixel il me semble que la méthode "addChild" est remplacée par "add" pour tout objet du FlxGame et la gestion des événements est également un peu particulière (voir notice de Flixel à ce sujet : http://flixel.org/docs/ )....

C'est pourquoi je t'ai recommandé plus haut de ne pas commencer tout de suite sur Flixel car la librairie utilise une surcouche avec sa propre syntaxe et il vaut mieux être bien à l'aise avec la syntaxe classique d'AS avant de se lancer ;-) sinon tu risque de perdre énormément de temps à apprendre à te servir d'une librairie dont le fonctionnement ne correspond pas à la plupart des exemples et tutoriels que tu trouvera sur la création de jeux avec Flash (ou en AS).

Pour mieux cerner tes besoins, quelques questions :

Quel est ton niveau en programmation (et AS) ?
Quel jeu essayes-tu de faire ?
Est-ce un entrainement ou un projet sérieux ?
Pourquoi avoir choisi Flixel ?

#9 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 16 April 2013 - 17:53 PM

Hum, c'est vrai que l'un interfaire sur l'autre, j'aurai pensé qu'il était possible de se servir un peu des deux, mais apparrement pas.
Je pense qu'il serai plus sage de refaire ce qui fonctionne sans utiliser flixel, comme vous me l'avais conseillé donc.

Pour répondre à vos questions:

Mon niveau en programmation est assez faible car l'AS3 est le premier language programmation que j'essai de maitriser. J'ai lu et suivit plusieurs tuto sur différents sites.

J'essai de faire un petit rpg très basique (bouger, combattre, ouvrir l'inventaire, accumuler de l'xp, dropper, et enfin créer à partir de recettes), le tout sans me soucier de l'aspect esthétique, mais seulement du fonctionnement.

C'est clairement un entrainement, à vrai dire j'ai beaucoup de mal à mettre en pratique ce que j'ai appris (quelques soit le domaine), sans rentrer directement dans la pratique.
Je crée donc ce petit jeu pour arriver face à des problèmes, puis les résoudres, et enfin les assimiler et ne plus les refaire.
Je ne vois pas mon projet comme étant un jeu, mais plutot comme plein de petits bouts de différentes technqiues, qui misent l'une derrière l'autre forment un tout.

J'ai choisit flixel car j'ai pensé qu'il serait plus simple pour moi d'avoir recours à une bibliothèque comme celle ci, mais vous tendez à me démontrer que sur ce point, je me suis totalement trompé :eusa_doh:.

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 16 April 2013 - 18:20 PM

Citation

j'aurai pensé qu'il était possible de se servir un peu des deux, mais apparrement pas.

Si c'est tout à fait possible, mais ça demande de bien maîtriser la POO et la syntaxe ;-)

Citation

Mon niveau en programmation est assez faible car l'AS3 est le premier language programmation que j'essai de maitriser. J'ai lu et suivit plusieurs tuto sur différents sites.

Ok tu confirme ce que je pensait et donc je recommande fortement de commencer par le début et de te faire la main sur des petits jeux simples pour apprendre le langage de base.

Citation

J'essai de faire un petit rpg très basique (bouger, combattre, ouvrir l'inventaire, accumuler de l'xp, dropper, et enfin créer à partir de recettes), le tout sans me soucier de l'aspect esthétique, mais seulement du fonctionnement.

Trop compliqué pour un début, le RPG demande beaucoup trop de choses pour fonctionner, tu t'attaque tout de suite à un gros projet, il vaut mieux commencer avec des choses simples et garder l'idée du RPG pour un peu plus tard.

Citation

Je ne vois pas mon projet comme étant un jeu, mais plutot comme plein de petits bouts de différentes technqiues, qui misent l'une derrière l'autre forment un tout.

Je pense que cette approche va t'attirer pas mal de problèmes, car il faut penser ton jeu comme un tout, un ensemble, si tu associe ensemble des petits bouts tu risque de rapidement être dépassé par le nombre de choses qu'il faut gérer et associer pour que le "tout" fonctionne. Si tu veux apprendre il faut passer par des jeux simples ne proposant qu'une seule problématique à résoudre. Prenons l'exemple de Pong, un des jeux les plus basiques, ça t'apprend déjà à créer des graphismes, gérer les événements, récupérer le code d'une touche au clavier, gérer les collisions, gérer un score, créer une petite intelligence artificielle, travailler la trigonométrie pour les déplacements de la balle, etc.... donc déjà un bon paquet de choses bien utiles dans tous les jeux. Ensuite tu peux apprendre à factoriser, réduire et optimiser ton code, un Pong ça tient en une cinquantaine de lignes de code, pas beaucoup plus, mais avant d'en arriver à ce résultat tu as du travail car il faut bien comprendre les mécanismes.

J'ai monté une série d'exercices pour aider les débutants dans leur apprentissage de ce genre de choses, (voir ici : http://forums.mediab...shplatform/jeux ) c'est justement orienté de telle sorte que chaque jeu (très simple) pose une problématique qu'on essaye de résoudre en apprenant à chaque fois de nouvelles petites astuces.

Je te recommande de commencer dans cet ordre par :

Pong
Taquin
Tic Tac Toe
Snake
Frogger

J'ai fait en sorte que dans cet ordre ce soit plus abordable.

Citation

J'ai choisit flixel car j'ai pensé qu'il serait plus simple pour moi d'avoir recours à une bibliothèque comme celle ci, mais vous tendez à me démontrer que sur ce point, je me susi totalement trompé :eusa_doh:.

Le choix de ses outils est très important quand on fait un jeu, Flixel va aider énormément les développeurs qui connaissent déjà les ficelles et veulent gagner du temps, mais pour le débutant c'est comme se retrouver au commandes d'un Aibus A380, il est tout automatisé et peut décoller et atterrir tout seul mais bon courage pour arriver à le faire bouger si tu n'es pas déjà un bon pilote.

#11 Getrox

    Ceinture Blanche

  • Members
  • Pip
  • 6 messages

Posté 16 April 2013 - 18:32 PM

Très bien, merci encore pour votre aide et vos conseils.
Je vais revenir aux bases et éviter de me précipiter, il est vrai que user de raccourcis n'est pas la meilleur des façon pour saisir l'essence des choses.



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

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