Après avoir calculé l’angle entre 2 objets vous pouvez maintenant utiliser cet angle pour par exemple lancer des projectiles en direction d’un objet avec un peu de trigonométrie.
Comment ?
- Calculer l’angle (en radian) entre les 2 objets graphiques avec la méthode Math.atan2.
- Au clic afficher un nouveau projectile à la position du tank et ajouter un évènement enter frame sur ce projectile.
- Sauvegarder l’angle entre le tank et le curseur dans le projectile.
- Utiliser l’angle pendant l’évènement enter frame pour calculer la vitesse en x et en y avec le cosinus et le sinus.
[swf:/wp-content/uploads/2010/12/www.benoitfreslon.com_Throw_bullets_to_mouse_direction.swf 640 400]
import flash.display.MovieClip; import flash.geom.Point; import flash.events.MouseEvent; // Code by Benoit Freslon. // Tutorials, Flash games: // https://www.benoitfreslon.com // Cet objet regardera constamment la souris. myTank.addEventListener(Event.ENTER_FRAME, tankEnterFrame); // Cette fonction est lancée 25 fois par seconde.; function tankEnterFrame(pEvt) { // pEvt.currentTarget: myTank var mc = pEvt.currentTarget; // Calculer l'angle en radians entre la souris et l'objet var angleRadian = Math.atan2(mouseY - mc.y,mouseX - mc.x); // Convertir l'angle radians en degrés. var angleDegree = angleRadian * 180 / Math.PI; // Orienter l'objet. mc.rotation = angleDegree; // Afficher l'angle en degrés sur l'interface. txtAngle.text = Math.round(angleDegree) + "°"; } // Ajouter un évènement souris qui se déclenchera au clic. stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); function mouseDown(pEvent) { // Ajouter un nouveau projectile var b = new Bullet(); // Placer le projectile aux coordonnées du tank. b.x = myTank.x; b.y = myTank.y; // Enregistrer l'angle dans le projectile. // Cet angle orientera le projectile b.angleRadian = Math.atan2(mouseY - myTank.y,mouseX -myTank.x); // Ajouter un écouteur d’évènement ENTER_FRAME) b.addEventListener(Event.ENTER_FRAME, bulletEnterFrame); // Afficher le projectile sur la scène addChild(b); } // Vitesse du projectile var speed = 8; function bulletEnterFrame(pEvent) { // Enregistrer l'objet cible dans une variable var b = pEvent.currentTarget; // Bouger l'objet entre chaque frame // Sur l'axe X utiliser le cosinus de l'angle b.x += Math.cos(b.angleRadian) * speed; // Sur l'axe Y utiliser le sinus de l'angle b.y += Math.sin(b.angleRadian) * speed; // Orienter l'objet en fonction de l'angle en degrés. b.rotation = b.angleRadian * 180 / Math.PI; // Mais il faut supprimer les projectiles lorsqu'ils se retrouvent dehors // Si le projectile est hors de l'écran if (b.x < 0 || b.x > 400 || b.y < 0 || b.y > 400) { // Supprimer le projectile de l'affichage removeChild(b); // /!\ ET RETIRER SON ECOUTEUR ENTER_FRAME b.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame); } }
Télécharger les sources : www.benoitfreslon.com_Throw_bullets_to_mouse_direction.zip