Я хочу зробити те, що описано в цій темі:
http://www.allegro.cc/forums/print-thread/283220
Я спробував різні методи, згадані тут.
Спочатку я спробував використати метод, описаний Carrus85:
Просто візьміть співвідношення двох трикутникових гіпонтануз (не має значення, який трикутник ви використовуєте для іншого, я пропоную пункт 1 і 2 як відстань, яку ви обчислите). Це дасть вам співвідношення сторін трикутника в кутку від більшого трикутника. Тоді ви просто помножите дельтакс на це значення, щоб отримати зсув координати x, і дельтай на це значення, щоб отримати зміщення y координати.
Але я не зміг знайти спосіб обчислити, як далеко об’єкт знаходиться від краю екрана.
Потім я спробував використовувати рентгенівський кастинг (чого я ніколи раніше не робив), запропонований 23yrold3yrold:
Стріляйте промінь від центру екрана до екрана. Обчисліть, де на прямокутнику перетинається промінь. Там є ваші координати.
Я вперше обчислив гіпотенузу трикутника, утворену різницею позицій x і y двох точок. Я використовував це для створення одиничного вектора по цій лінії. Я перекинув цей вектор, поки або координата x, або координата y не вийшли з екрана. Дві поточні значення x і y потім утворюють стрілки x і y.
Ось код для мого методу випромінювання (написаний на C ++ та 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);
}
Це було відносно успішно. Стрілки відображаються в нижній правій частині екрана, коли об’єкти розташовані вище та зліва від екрану так, як ніби місця, де намальовані стрілки, повернуті на 180 градусів навколо центру екрана.
Я припускав, що це пов'язано з тим, що коли я обчислював гіпотенузу трикутника, він завжди буде позитивним незалежно від того, різниця в x чи різниця у y від'ємна.
Поміркувавши про це, передавання променів не здається вдалим способом вирішення проблеми (через те, що воно передбачає використання sqrt () та великого для циклу).