Deseo hacer lo que se describe en este tema:
http://www.allegro.cc/forums/print-thread/283220
He intentado una variedad de los métodos mencionados aquí.
Primero intenté usar el método descrito por Carrus85:
Simplemente tome la relación de los dos hipóntenos triangulares (no importa qué triángulo use para el otro, sugiero el punto 1 y el punto 2 como la distancia que calcula). Esto le dará el porcentaje de relación de aspecto del triángulo en la esquina del triángulo más grande. Luego, simplemente multiplique deltax por ese valor para obtener el desplazamiento de la coordenada x, y deltay por ese valor para obtener el desplazamiento de la coordenada y.
Pero no pude encontrar una manera de calcular qué tan lejos está el objeto del borde de la pantalla.
Luego intenté usar el casting de rayos (que nunca había hecho antes) sugerido por 23yrold3yrold:
Dispara un rayo desde el centro de la pantalla al objeto fuera de la pantalla. Calcule dónde en el rectángulo se cruza el rayo. Ahí están tus coordenadas.
Primero calculé la hipotenusa del triángulo formado por la diferencia en las posiciones x e y de los dos puntos. Usé esto para crear un vector unitario a lo largo de esa línea. Recorrí ese vector hasta que la coordenada x o la coordenada y estaban fuera de la pantalla. Los dos valores actuales de x e y luego forman las x e y de la flecha.
Aquí está el código para mi método de emisión de rayos (escrito en C ++ y 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);
}
Esto fue relativamente exitoso. Las flechas se muestran en la sección inferior derecha de la pantalla cuando los objetos se encuentran arriba y a la izquierda de la pantalla como si las ubicaciones del lugar donde se dibujan las flechas se hayan girado 180 grados alrededor del centro de la pantalla.
Supuse que esto se debía al hecho de que cuando calculaba la hipotenusa del triángulo, siempre sería positivo independientemente de si la diferencia en x o la diferencia en y es negativa.
Pensando en ello, la proyección de rayos no parece ser una buena forma de resolver el problema (debido al hecho de que implica el uso de sqrt () y un bucle for grande).