Une source posté il y a quelques jours par Stan62970 m'a donner une idée ...
Comment faire pour qu'une voiture puisse rejoindre un point ?
Pour cela, trois problèmes :
- la voiture doit respecter une courbe de virage (elle ne peut pas pivoter sur elle-même)
- la trajectoire doit être la plus courte possible.
- la voiture ne peut pas passer les vitesses trop fréquement (et alors faire avant/arrière pour avancer en escalier)
J'ai donc pondu ce petit bout de code ...
Source / Exemple :
// Variables de mouvement
var rayon = 100;
var vitesse = 5;
var rotation = vitesse/rayon;
// Evènement :
var onEnterFrame = undefined;
var pause = false;
onMouseUp = function () {
Objectif._x=_xmouse, Objectif._y=_ymouse;
onEnterFrame = function () {
if (!pause)
rejoindre(Voiture, Objectif);
};
};
// Fonction qui fait tout !
function rejoindre(mc, pt)
{
// Recueille les coordonnées relatives de la cible.
var Cible = new Object();
Cible.x=pt._x, Cible.y=pt._y;
Objectif._parent.localToGlobal(Cible);
mc.globalToLocal(Cible);
// Analyse la position de la cible.
var distance = Cible.x*Cible.x+Cible.y*Cible.y;
// _________________________________________________________________
// Trois cas possibles en fonction de la position voiture/cible.
if (Math.abs(Cible.y)<5 and Cible.x>0) {
// La cible est droit devant.
avancer(mc, vitesse);
}
else if (Math.abs(Cible.y)<5 and Cible.x>-rayon) {
// La cible est juste derrière.
avancer(mc, -vitesse);
}
else if (distance<2*rayon*Math.abs(Cible.y)) {
// La cible est juste à coté de la voiture
// (dans les deux cercles) : il faut reculer.
tourner(mc, Cible.y>0);
avancer(mc, -vitesse);
}
else if (Cible.x>0) {
// La cible en avant de la voiture : il faut tourner pour l'atteindre.
tourner(mc, Cible.y>0);
avancer(mc, vitesse);
}
else if (distance<rayon*rayon*2) {
// La cible est arrière de la voiture : il faut faire demi-tour.
tourner(mc, Cible.y<0);
avancer(mc, -vitesse);
}
else {
// La cible est en arrière de la voiture : il faut faire demi-tour.
tourner(mc, Cible.y>0);
avancer(mc, -vitesse);
}
// On arrête de bouger si on a atteint l'objectif.
if (distance<25*25) {
this.onEnterFrame = undefined;
affiche = " Arrêt des moteurs";
}
}
// Fonction outils :
function avancer(mc, distance) {
// On peut avancer d'une distance positive ou négative.
mc._x += distance*Math.cos(mc._rotation*Math.PI/180);
mc._y += distance*Math.sin(mc._rotation*Math.PI/180);
}
function tourner(mc, sens) {
// "sens" est un booléen indiquant si il faut tourner dans le sens positif.
mc._rotation += (sens ? 1 : -1)*rotation*180/Math.PI;
}
Conclusion :
Demandez s'il vous faut des explications !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.