Desejo fazer o que é descrito neste tópico:
http://www.allegro.cc/forums/print-thread/283220
Eu tentei uma variedade dos métodos mencionados aqui.
Primeiro, tentei usar o método descrito por Carrus85:
Pegue a razão entre os dois hipontênios do triângulo (não importa qual triagle você usar para o outro, sugiro os pontos 1 e 2 como a distância que você calcula). Isso fornecerá a porcentagem da proporção do triângulo no canto do triângulo maior. Então você simplesmente multiplica o deltax por esse valor para obter o deslocamento da coordenada x e delta por esse valor para obter o deslocamento da coordenada y.
Mas não consegui encontrar uma maneira de calcular a que distância o objeto está da borda da tela.
Tentei então usar o casting de raios (o que nunca fiz antes) sugerido por 23yrold3yrold:
Dispare um raio do centro da tela para o objeto fora da tela. Calcule onde o retângulo cruza o raio. Aqui estão suas coordenadas.
Primeiro calculei a hipotenusa do triângulo formada pela diferença nas posições x e y dos dois pontos. Eu usei isso para criar um vetor de unidade ao longo dessa linha. Passei por esse vetor até que a coordenada x ou a coordenada y estivesse fora da tela. Os dois valores atuais de x e y formam os x e y da seta.
Aqui está o código para o meu método de conversão de raios (escrito em 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);
}
Isso foi relativamente bem-sucedido. As setas são exibidas na seção inferior direita da tela quando os objetos estão localizados acima e à esquerda da tela, como se os locais onde as setas foram desenhadas foram girados 180 graus ao redor do centro da tela.
Supus que isso se devia ao fato de que, ao calcular a hipotenusa do triângulo, sempre seria positivo, independentemente de a diferença em x ou a diferença em y ser negativa.
Pensando nisso, a conversão de raios não parece ser uma boa maneira de resolver o problema (devido ao fato de envolver o uso de sqrt () e um loop for grande).