Je souhaite faire ce qui est décrit dans cette rubrique:
http://www.allegro.cc/forums/print-thread/283220
J'ai essayé une variété des méthodes mentionnées ici.
J'ai d'abord essayé d'utiliser la méthode décrite par Carrus85:
Prenez simplement le rapport des deux hyponténuses triangulaires (peu importe le triagle que vous utilisez pour l'autre, je suggère le point 1 et le point 2 comme distance que vous calculez). Cela vous donnera le pourcentage d'aspect du triangle dans le coin par rapport au plus grand triangle. Ensuite, vous multipliez simplement la deltaxe par cette valeur pour obtenir le décalage des coordonnées x et le retard par cette valeur pour obtenir le décalage des coordonnées y.
Mais je n'ai pas trouvé de moyen de calculer à quelle distance l'objet est éloigné du bord de l'écran.
J'ai ensuite essayé d'utiliser le lancer de rayons (ce que je n'ai jamais fait auparavant) suggéré par 23yrold3yrold:
Tirez un rayon du centre de l'écran vers l'objet hors écran. Calculez où sur le rectangle le rayon se croise. Voilà vos coordonnées.
J'ai d'abord calculé l'hypoténuse du triangle formé par la différence de positions x et y des deux points. Je l'ai utilisé pour créer un vecteur unitaire le long de cette ligne. J'ai parcouru ce vecteur jusqu'à ce que la coordonnée x ou la coordonnée y soit hors de l'écran. Les deux valeurs x et y actuelles forment alors les x et y de la flèche.
Voici le code de ma méthode de lancer de rayons (écrit en C ++ et Allegro 5)
void renderArrows(Object* i)
{
float x1 = i->getX() + (i->getWidth() / 2);
float y1 = i->getY() + (i->getHeight() / 2);
float x2 = screenCentreX;
float y2 = ScreenCentreY;
float dx = x2 - x1;
float dy = y2 - y1;
float hypotSquared = (dx * dx) + (dy * dy);
float hypot = sqrt(hypotSquared);
float unitX = dx / hypot;
float unitY = dy / hypot;
float rayX = x2 - view->getViewportX();
float rayY = y2 - view->getViewportY();
float arrowX = 0;
float arrowY = 0;
bool posFound = false;
while(posFound == false)
{
rayX += unitX;
rayY += unitY;
if(rayX <= 0 ||
rayX >= screenWidth ||
rayY <= 0 ||
rayY >= screenHeight)
{
arrowX = rayX;
arrowY = rayY;
posFound = true;
}
}
al_draw_bitmap(sprite, arrowX - spriteWidth, arrowY - spriteHeight, 0);
}
Cela a été relativement réussi. Les flèches sont affichées dans la partie inférieure droite de l'écran lorsque les objets sont situés au-dessus et à gauche de l'écran, comme si les emplacements de l'endroit où les flèches étaient dessinées avaient été tournés de 180 degrés autour du centre de l'écran.
J'ai supposé que cela était dû au fait que lorsque je calculais l'hypoténuse du triangle, elle serait toujours positive, que la différence de x ou la différence de y soit négative ou non.
En y réfléchissant, le lancer de rayons ne semble pas être un bon moyen de résoudre le problème (car il implique l'utilisation de sqrt () et d'une grande boucle for).
la source
arrow-length
temps du vecteur de coupe "et voila", vous avez une origine et une destination pour votre flèche.x
ety
.)