Chcę zrobić to, co opisano w tym temacie:
http://www.allegro.cc/forums/print-thread/283220
Próbowałem różnych metod wymienionych tutaj.
Najpierw próbowałem użyć metody opisanej przez Carrus85:
Po prostu weź stosunek dwóch trójkątów przeciwprostokątnych (nie ma znaczenia, którego trójkąta użyjesz dla drugiego, sugeruję punkt 1 i punkt 2 jako obliczaną odległość). To da ci procent proporcji trójkąta w rogu od większego trójkąta. Następnie wystarczy pomnożyć deltax przez tę wartość, aby uzyskać przesunięcie współrzędnej x, i opóźnić przez tę wartość, aby uzyskać przesunięcie współrzędnej y.
Ale nie mogłem znaleźć sposobu, aby obliczyć, jak daleko obiekt znajduje się od krawędzi ekranu.
Następnie spróbowałem użyć rzutowania promieniowego (czego nigdy wcześniej nie robiłem) sugerowanego przez 23yrold3yrold:
Wystrzel promień ze środka ekranu na obiekt poza ekranem. Oblicz, gdzie w prostokącie przecina się promień. Oto twoje współrzędne.
Najpierw obliczyłem przeciwprostokątną trójkąta utworzoną przez różnicę w pozycjach xiy dwóch punktów. Użyłem tego, aby utworzyć wektor jednostkowy wzdłuż tej linii. Zapętlałem ten wektor, dopóki współrzędna x lub y nie znalazła się poza ekranem. Dwie bieżące wartości xiy tworzą następnie xiy strzałki.
Oto kod mojej metody rzutowania promieniami (napisany w C ++ i 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);
}
To było względnie udane. Strzały są wyświetlane w prawej dolnej części ekranu, gdy obiekty znajdują się nad i po lewej stronie ekranu, tak jakby miejsca, w których narysowane są strzałki, zostały obrócone o 180 stopni wokół środka ekranu.
Założyłem, że było to spowodowane faktem, że kiedy obliczałem przeciwprostokątną trójkąta, zawsze będzie ona dodatnia, niezależnie od tego, czy różnica x lub różnica y jest ujemna.
Myśląc o tym, rzutowanie promieniami nie wydaje się dobrym sposobem na rozwiązanie problemu (z uwagi na fakt, że wymaga użycia sqrt () i dużej pętli for).