Desidero fare ciò che è descritto in questo argomento:
http://www.allegro.cc/forums/print-thread/283220
Ho tentato una varietà di metodi citati qui.
Per prima cosa ho provato ad usare il metodo descritto da Carrus85:
Prendi semplicemente il rapporto tra i due triangoli ipoontusi (non importa quale triagle usi per l'altro, suggerisco il punto 1 e il punto 2 come distanza calcolata). Questo ti darà la percentuale di proporzioni del triangolo nell'angolo rispetto al triangolo più grande. Quindi moltiplica semplicemente il deltax per quel valore per ottenere l'offset delle coordinate xe deltay per quel valore per ottenere l'offset delle coordinate y.
Ma non sono riuscito a trovare un modo per calcolare la distanza dell'oggetto dal bordo dello schermo.
Ho quindi provato a utilizzare il ray casting (che non avevo mai fatto prima) suggerito da 23yrold3yrold:
Spara un raggio dal centro dello schermo sull'oggetto fuori schermo. Calcola dove sul rettangolo si interseca il raggio. Ecco le tue coordinate.
In primo luogo ho calcolato l'ipotenusa del triangolo formato dalla differenza nelle posizioni xey dei due punti. L'ho usato per creare un vettore unitario lungo quella linea. Ho passato in rassegna quel vettore fino a quando la coordinata x o la coordinata y erano fuori dallo schermo. I due valori xey attuali formano quindi la x e la y della freccia.
Ecco il codice per il mio metodo di casting ray (scritto in C ++ e 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);
}
Questo ha avuto relativamente successo. Le frecce vengono visualizzate nella sezione in basso a destra dello schermo quando gli oggetti si trovano sopra e a sinistra dello schermo come se le posizioni in cui sono disegnate le frecce fossero ruotate di 180 gradi attorno al centro dello schermo.
Supponevo che ciò fosse dovuto al fatto che quando stavo calcolando l'ipotenusa del triangolo, sarebbe sempre positivo indipendentemente dal fatto che la differenza in x o la differenza in y sia negativa.
A pensarci bene, il ray casting non sembra un buon modo per risolvere il problema (a causa del fatto che implica l'uso di sqrt () e un grande for loop).