Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Flash/ActionScript] Yeux qui suivent la souris

Probleme...

    27 mai 2007 à 22:05:50

    Bonjour ou bonsoir à tous,

    J'ai lu le tuto de Suprazz mais dans cette partie où on doit faire une rotation d'une pupille pour qu'elle suivent les mouvements de la souris et bien j'ai un problème qui doit surement se règler avec votre aide, chers Zéros.

    J'ai essayer de faire la même chose mais avec un bras qui tien un fusil pour un jeu. Losque je test, le bras et le fusil tourne correctement mais le bout du fusil ne pointe pas vers la souris.

    J'aimerais donc que le bout du fusil soit aligner avec la souris tout en tournant sur l'articulation de l'épaule.

    J'ai essayé d'être le plus clair possible, posez-vos questions si vous pensez j'ai oublié de mentionner quelque chose.
    • Partager sur Facebook
    • Partager sur Twitter
      30 mai 2007 à 23:28:20

      Comment je fais pour le montrer ?
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2007 à 17:47:52

        http://imageshack.us/ permet d'héberger des swf

        en attendant, ton soucis c'est que le fusil ne tourne pas au bon endroit et que tu voudrais changer son axe de rotation ?
        Ou c'est que le fusil a un bon axe de rotation mais il y a toujours un décalage entre la souris et le fusil ?
        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2007 à 16:08:43

          Voici mon swf.

          Le probleme c'est que le canon ne suit pas toujours la souris, si vous avez regardé mon swf, vous aurez remarqué.
          • Partager sur Facebook
          • Partager sur Twitter
            11 juin 2007 à 13:26:37


            _root.onEnterFrame = function() {
                    _root.joueur.arm2._rotation = Math.atan2(_ymouse-_root.joueur.arm2._y, _xmouse-_root.joueur.arm2._x)/(Math.PI/180);
            }
            • Partager sur Facebook
            • Partager sur Twitter
              11 juin 2007 à 13:58:39

              Tu n'a pas soustré les coordonnées de ton clip joueur.(c'est simplement un problème de coordonnées).
              En faite ton arme tourne correctement mais par rapport à l'origine sur la scène principale.(enfin je crois).

              Voici une source:
              Ca pourra surement te dépanner. ;)
              L'exemple:
              http://islandofcreation.free.fr/Exemple_site_du_z%E9ro/Source_aide.swf

              (on peut voir que je duplique un clip présent sur la scène pour les balles).

              Le fla
              http://islandofcreation.free.fr/Exemple_site_du_z%E9ro/Source_aide.fla
              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2007 à 22:29:26

                tu me montre ton code car je n'ai pas la bonne version de Flash pour lire ton Fla.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2007 à 8:38:54

                  Voilà. :D (par curiosité quelle version de flash as tu).

                  //Sur ma scène j'ai 2 clip un qui a pour occurence perso(c'est le perso)
                  //Et un qui a pour occurence balle(c'est la balle).
                  //Dans ce clip perso j'ai 2 clip: le clip bras(celui qui tient le gun),
                  //le clip corps(c'est le clip ou se situe le reste du corps).

                  //Récupération des rayons(pour cela on récupère la longueur du bras).
                  rayon_bras=_root.perso.bras._width;
                  hauteur_tete=_root.perso.corps.tete._width;

                  //Variable des distances(afin de décomposer)
                  distance_x=0;
                  distance_y=0;
                  angle_rad=0;
                  //Vitesse de déplacement du perso
                  marche=2;
                  //Gestion des balles
                  compteur=0;

                  onEnterFrame = function(){
                          //Calcul de l'angle
                          //Tu as soustré que les 2 premières c'est là ton erreur.J'ai rajouté -_root.perso._x sur
                          // la distance_x faut faire pareil sur y.
                          distance_x=_root._xmouse-_root.perso.bras._x-_root.perso._x;
                          distance_y=_root._ymouse-_root.perso.bras._y-_root.perso._y;
                          angle_rad=Math.atan2(distance_y,distance_x);
                          //On assigne l'angle à la rotation du bras
                          _root.perso.bras._rotation=(angle_rad*180)/Math.PI;
                         
                          //Déplacement du perso
                          if(Key.isDown(Key.RIGHT)){
                                  _root.perso._x+=marche;
                          }
                          if(Key.isDown(Key.LEFT)){
                                  _root.perso._x-=marche;
                          }
                          //Gestion de la direction des balles
                          for(i=0;i<6;i++){
                                  _root["balle"+i]._x+=Math.cos(_root["balle"+i].leur_angle)*_root["balle"+i].vitesse;
                                  _root["balle"+i]._y+=Math.sin(_root["balle"+i].leur_angle)*_root["balle"+i].vitesse;
                          }
                         
                  }
                  onMouseDown = function(){
                          //Gestion des  balles.
                          //On limite leur nombre.
                                  if(compteur<5){
                                  compteur+=1;
                                  }else{
                                  compteur=0;
                                  }
                                  duplicateMovieClip(_root.balle, "balle"+compteur, compteur);
                                  //Point de départ de la balle.
                                  _root["balle"+compteur]._x=_root.perso._x+Math.cos(angle_rad)*rayon_bras;
                                  _root["balle"+compteur]._y=_root.perso._y+Math.sin(angle_rad)*rayon_bras+hauteur_tete;
                                  //On lui assigne un angle (pour sa direction).
                                  _root["balle"+compteur]._rotation=(angle_rad*180)/Math.PI;
                                  //On créer des variables sur chacun des clip balle(balle1 ou balle2...)
                                  _root["balle"+compteur].vitesse=3;
                                  _root["balle"+compteur].leur_angle=angle_rad;

                  }


                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juin 2007 à 10:58:02

                    bien joué mansuz :-)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2007 à 11:41:40

                      Ca serait bien de mettre l'option "répondu" quand t'as eu ta solution ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2007 à 12:03:07

                        Ben apparament il a peut être trouvé la solution par lui même, où il a oublié son topic. :p
                        Mais en principe c'est incorrect de ne pas répondre. :colere2::colere2::colere2:
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 juin 2007 à 0:54:16

                          Oui, pardon je n'ai pas eu accès à un ordinateur dernièrement.

                          Merci à tous et surtout à toi Mansuz. J'ai une version d'essai de flash (6.45 je crois :P)

                          Je vais essayer avec ton code, merci ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 juin 2007 à 8:13:29

                            Tu es pardonné. :D

                            En faite je voulais savoir ta version car j'ai exporté le fichier en flash MX 2004(pas forcement toute les personnes on flash 8). ;)



                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 juin 2007 à 21:19:38

                              Ok.

                              Ma version d'essai se fini dans 3 jours, est-ce que vous connaissez des sites ou je pourrais en rétélécharger une ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 juin 2007 à 15:28:44

                                Hello,

                                J'ai un problème avec le code que tu as passé:

                                j'aimerais faire une hitTest() entre une des balles et un carré (ennemi)

                                un genre:


                                if(balle.hitTest(mc_ennemi)){
                                     mc_ennemi.alpha -= 20;
                                   }


                                mais je trouve pas comment faire...

                                Merci d'avance !

                                Sogus
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 juin 2007 à 15:56:36

                                  Petit résumé:
                                  On peut avoir jusqu'a 6 balles à l'écran qui on pour occurences:

                                  balle0
                                  balle1
                                  balle2
                                  balle3
                                  balle4
                                  balle5

                                  Si le monstre ou l'ennemi se retrouve en contact avec une de ces 6 balles on doit le détecter .

                                  Donc on va faire:

                                  for(i=0;i<6;i++){
                                          if(_root["balle"+i].hitTest(ennemi)){
                                                  ennemi._alpha=50;
                                          }
                                  }

                                  La boucle fera le test pour les 6 balles démarrant à 0 et on sort de la boucle quand i n'est plus stictement inférieur à 6

                                  Donc en faite la solution c'est d'utiliser une boucle for qui sera placée dans notre enterframe.
                                  On peut utiliser une boucle déjà existante ou bien en créer une autre.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 juin 2007 à 20:05:02

                                    En passant Mansuz, il est sympa ton petit jeu avec la souris et les fromages :-)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 juin 2007 à 22:01:24

                                      Bah, j'me suis posé des questions sur le fonctionnement des déplacements de la souris :-D
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 juin 2007 à 22:34:18

                                        Citation : Mansuz

                                        Petit résumé:
                                        On peut avoir jusqu'a 6 balles à l'écran qui on pour occurences:

                                        balle0
                                        balle1
                                        balle2
                                        balle3
                                        balle4
                                        balle5

                                        Si le monstre ou l'ennemi se retrouve en contact avec une de ces 6 balles on doit le détecter .

                                        Donc on va faire:

                                        for(i=0;i<6;i++){
                                                if(_root["balle"+i].hitTest(ennemi)){
                                                        ennemi._alpha=50;
                                                }
                                        }


                                        La boucle fera le test pour les 6 balles démarrant à 0 et on sort de la boucle quand i n'est plus stictement inférieur à 6

                                        Donc en faite la solution c'est d'utiliser une boucle for qui sera placée dans notre enterframe.
                                        On peut utiliser une boucle déjà existante ou bien en créer une autre.



                                        Hello, tout d'abord merci beaucoup !
                                        mais il ne marche pas encore... je sais pas trop ...

                                        voici mon code:

                                        mc_aim.onRollOver = function() {
                                                        Mouse.hide();
                                                        mc_aim.startDrag(true);
                                                }
                                               
                                               
                                        //Réxupération des rayons
                                        rayon_bras=_root.perso.bras._width;
                                        hauteur_tete=_root.perso.corps.tete._width;

                                        //Variable des distances(afin de décomposer);
                                        distance_x=0;
                                        distance_y=0;
                                        angle_rad=0;

                                        marche=2;
                                        //Gestion des balles
                                        compteur=0;

                                        onEnterFrame = function(){
                                                //Clacul de l'angle
                                                distance_x=_root._xmouse-_root.perso._x-_root.perso.bras._x;
                                                distance_y=_root._ymouse-_root.perso._y-_root.perso.bras._y;
                                                angle_rad=Math.atan2(distance_y,distance_x);
                                                //On assigne l'angle à la rotation du bras
                                                _root.perso.bras._rotation=(angle_rad*180)/Math.PI;
                                               
                                                //Déplacement du perso
                                                if(Key.isDown(Key.RIGHT)){
                                                        _root.perso._x+=marche;
                                                }
                                                if(Key.isDown(Key.LEFT)){
                                                        _root.perso._x-=marche;
                                                }
                                                //Gestion de la direction des balles
                                                for(i=0;i<6;i++){
                                                        _root["balle"+i]._x+=Math.cos(_root["balle"+i].leur_angle)*_root["balle"+i].vitesse;
                                                        _root["balle"+i]._y+=Math.sin(_root["balle"+i].leur_angle)*_root["balle"+i].vitesse;
                                                }
                                               
                                        }
                                        onMouseDown = function(){
                                                //Gestion des  balles.
                                                        if(compteur<5){
                                                        compteur+=1;
                                                        }else{
                                                        compteur=0;
                                                        }
                                                        duplicateMovieClip(_root.balle, "balle"+compteur, compteur);
                                                        _root["balle"+compteur]._x=_root.perso._x+Math.cos(angle_rad)*rayon_bras;
                                                        _root["balle"+compteur]._y=_root.perso._y+Math.sin(angle_rad)*rayon_bras+hauteur_tete+0;
                                                        _root["balle"+compteur]._rotation=(angle_rad*180)/Math.PI;
                                                        _root["balle"+compteur].vitesse=3;
                                                        _root["balle"+compteur].leur_angle=angle_rad;
                                                }

                                        for(i=0;i<6;i++){
                                                if(_root["balle"+i].hitTest(mc_ennemi)){
                                                mc_ennemi._alpha=20;
                                                        if(mc_ennemi._alpha == 0){
                                                                mc_ennemi._x = -200;
                                                                mc_ennemi._y = -200;
                                                        }
                                            }
                                        }



                                        (une bonne partie de ce code tu le connais déjà )

                                        mais il n'y a pas moyen... les balles ont beau toucher le carré (mc_ennemi) mais rien n'y fait !

                                        aurais tu une idée de se qui coince ?

                                        (je débute dans la programmation de jeux flash donc soit indulgent si tu trouve des erreurs bête!)

                                        Merci d'avance

                                        Sogus
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 juin 2007 à 23:32:03

                                          heu juste un truc pour la rotation de ton bras, pk faire compliqué lorsque l'on peut faire simple ?

                                          onEnterFrame=function() {
                                          bras._rotation+=bras._ymouse/10;
                                          }

                                          en plus, c progressif, et sa economise des calcul, et des variables, bref, c mieu :D



                                          [edit]
                                          pour tes balle essais sa :
                                          for(i=0;i<=5;i++) {
                                          nom="balle"+i;
                                          if(_root.mc_ennemie.hitTest(_root[nom]._x,_root[nom]._y,true)) {
                                          trace("touché");
                                          }
                                          }
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 juin 2007 à 5:45:54

                                            Argh... pourquoi des _root, pourquoi des onEnterFrame !!!
                                            n'utilisez pas de méthodes dépréciées !!! c'est comme coder en htm au lieu de xhtml.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              25 juin 2007 à 7:35:31

                                              Stefbuet

                                              bras._rotation+=bras._ymouse/10;

                                              Je connaît l'existence de ce moyen mais j'ai jamais trop compris comment ça pouvais marcher. :D

                                              Pour ce qui est de _root je l'utilise et ré cement j'ai vus que c'était déprécié, et j'ai encore la remarque aujourd'hui.
                                              Pourquoi faut le bannir?

                                              Le this est possible d'utilisation mais par moment c'est plus pratique de ce référer par rapport à la scène principale.

                                              Quand au enterFrame ben j'essaye de minimiser son utilisation...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                25 juin 2007 à 8:51:51

                                                Citation : stefbuet

                                                heu juste un truc pour la rotation de ton bras, pk faire compliqué lorsque l'on peut faire simple ?

                                                onEnterFrame=function() {
                                                bras._rotation+=bras._ymouse/10;
                                                }

                                                en plus, c progressif, et sa economise des calcul, et des variables, bref, c mieu :D



                                                [edit]
                                                pour tes balle essais sa :
                                                for(i=0;i<=5;i++) {
                                                nom="balle"+i;
                                                if(_root.mc_ennemie.hitTest(_root[nom]._x,_root[nom]._y,true)) {
                                                trace("touché");
                                                }
                                                }



                                                Merci bien ! je vais le tester de suite! (on est lundi et donc le boulo a repris ...)

                                                Donnez moi le temps de quelques testes et je vous donnerai une réponse !



                                                Résultat de mes testes:

                                                ca marche pas ^^ je sais pas trop :euh: y a t il un problème entre les calques..?
                                                je upload mon fichier et je vous met le lien. alors le swf -> http://img243.imageshack.us/my.php?image=jeunl7.swf
                                                (je n'ai pas du tout pensé au graphisme... ils viendront plus tard ^^)
                                                Pour le .fla je sais pas ou l'uploader. Si vous avez une adresse, elle est la bienvenue


                                                Bon je vous donne (en texte...) mon fichier fla !

                                                tout mon script se trouve sur la première frame
                                                il y a un calque pour le viseur, un calque pour l'ennemi, un calque pour le perso, ...
                                                sur ces frames il y a un clip qui contient les animations, les designs, ...

                                                si je fais trace(nom._x); il me donne : undefined

                                                merci encore !

                                                Sogus
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  25 juin 2007 à 12:45:31

                                                  @Mansuz :
                                                  le _root n'est pas "déprécié" mais déconseillé.
                                                  pour la simple raison que _root est un ciblage absolu. cela équivaut à mettre l'url complète d'une adresse à chaque fois... (http://...)

                                                  le ciblage relatif this._parent est beaucoup plus axé syntaxe pointée as2.

                                                  De plus et c'est là le gros plus, c'est qu'avec un ciblage relatif... tu bidouilles ton flash comme tu veux après, intégration facile etc... les manipulations sont simples et assurées fonctionnelles.

                                                  reste une option : _lockroot pour bloquer le _root... mais bon gaffe quand même à son utilisation ^^
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    25 juin 2007 à 14:28:17

                                                    salut, je n'utilise pas _root, car _root, c'ay mal :)
                                                    mais dans cette exemple, jlé utilisé car dans le code , ct utilisé,
                                                    _root, est bien ch**** lorsque l'on importe un swf dans l'anim car sa chamboule tt :'(
                                                    j'essais de limiter les onenterframe aussi, mais cette fois, le code est dans un onenterframe :p

                                                    [edit] sogus, tu a bien remplacé le
                                                    bras._rotation+=bras._ymouse/10
                                                    par sa : ?
                                                    perso.bras._rotation+=perso.bras._ymouse/10;
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    [Flash/ActionScript] Yeux qui suivent la souris

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown