이 주제에 설명 된대로 수행하고 싶습니다.
http://www.allegro.cc/forums/print-thread/283220
여기에 언급 된 다양한 방법을 시도했습니다.
먼저 Carrus85에서 설명한 방법을 사용하려고했습니다.
두 삼각형 빗변의 비율을 취하십시오 (다른 삼각법에 관계없이 상관없이 계산하는 거리로 포인트 1과 포인트 2를 제안합니다). 그러면 더 큰 삼각형에서 모서리에있는 삼각형의 종횡비 비율이 표시됩니다. 그런 다음 간단하게 deltax에 해당 값을 곱하여 x 좌표 오프셋을 얻고 해당 값을 deltay하여 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 () 및 큰 for 루프를 사용한다는 사실 때문에 문제를 해결하는 좋은 방법처럼 보이지 않습니다.