le déplacement d'un objet à partir du point-à-point dans une trajectoire linéaire
Je suis en train de déplacer un sprite sur l'écran dans une ligne droite, vers l'endroit où j'ai touché l'écran, ce que j'ai fait lors de la mise à jour() à chaque tour de boucle , il vérifie pour voir si le sprite courant de l'emplacement x y == pour la destination x ,y). si elle n'a pas du sprite x++ et y++...
le truc, c'est ..c'est pas d'avancer en ligne droite... comme il y a des cas où le x ou y à coordonner atteint la destination x ou y d'abord... comment puis je l'ai changé de sorte que les deux x et y répond à la destination ensemble?
mon pseudo-code pour l'objet sprite
destX = destination X
destY = destination Y
posX = current X
posY = current Y
public void update(){
if(destX > posX && destY < posY)
{
posX++;
posY--;
}
else if (destX > posX && destY > posY){
posX++;
posY++;
}
else if(destX < posX && destY > posY)
{
posX--;
posY++;
}
else if(destX < posX && destY < posY){
posX--;
posY--;
}
else if(destX < posX)
posX--;
else if(destX > posX)
posX++;
else if(destY < posY)
posY--;
else if(destY > posY)
posY++;
- même avec bresenham ou tout autre algorithme, il est inévitable que x ou y pour atteindre leur cible avant que les autres dans certains cas (à supposer que la cible de x est le même que l'original x?)
- Bresenham n'a pas de travail pour les lignes verticales. Le principal problème avec l'OPs approche est qu'il incrémente x et y à la même vitesse.
- Je suis sûr que c'est le cas, la version complète de toute façon pas la moitié d'un, vous avez démontré dans votre réponse. N'a pas d'importance si, la situation est la même pour la cible.y = courant.y et de toute autre ligne de où la dernière étape n'est pas diagonale. Mon point est, je suis sûr que l'OP n'est pas réellement le vouloir ce qu'il dit qu'il veut.
- Bon point. Vous avez probablement raison. Son été un moment depuis que j'ai fait ce genre de chose.
- hmm.. bien son un peu comme ces jeux rts où le droit de l'utilisateur clique sur une destination et une unité d'y va en ligne droite, mais moins le cheminement de système..
- si vous voulez que la ligne à être aussi droite que possible, et d'éviter la "diagonale de la partie et la partie droite", droite? Bresenham doit être fine.
Vous devez vous connecter pour publier un commentaire.
Découvrez: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
Cet algorithme simple sera de dire à chacun de vous de coordonnées X,Y sur une ligne entre deux points. Vous pouvez utiliser cet algorithme pour calculer tous les postes qu'il faut visiter, de stocker les coordonnées dans un tableau, et de parcourir le tableau en tant que mise à jour de la position.
De l'Article:
C'est la version plus primitif. L'article contient une meilleure généralisée de l'algorithme que vous devriez regarder.
J'ai affaire à un similair problème que le vôtre. (J'ai une liste de tableaux tenue de l'historique des positions de mon joueur a disparu et je veux l'utiliser pour rembobiner le jeu.)
Au lieu de simplement l'augmentation de la position x et y avec 1 vous pouvez:
position.
représente la vitesse
J'ai fait une classe de cette. J'espère que c'est utile.
Ne pas utiliser les nombres entiers. C'est une très mauvaise idée de travailler avec des entiers. Utiliser des flotteurs. Le concept principal est de: définir le nombre de mesures que vous souhaitez effectuer (
s
). Calculer des différences en X et Y (diffX
etdiffY
). Ne prenez pas de valeurs absolues: Calculer de cette façonPuis calculer le xMove et yMove valeurs en divisant
diffX
etdiffY
pars
(nombre de mesures).Et maintenant vous avez à ajouter pour chaque itération, le moveX et moveY valeurs pour la position actuelle.
Et pour le dessin, vous devez utiliser
Graphics2D
, qui prend en charge floating points. Si vous ne souhaitez pas utiliser Graphics2D, vous pouvez compléter les flotteurs à ints, à l'aide deMath.round(float)
.double
vous donne plus de précision que vous avez besoin pour l'interface graphique des coordonnées. Il avait juste être un gaspillage de 4 octets par variable.s * movex
pourrait égaldiffx
, la somme des
movex
presque ne le sera jamais.