このトピックで説明されていることを実行したいと考えています。
http://www.allegro.cc/forums/print-thread/283220
ここで述べたさまざまな方法を試しました。
まず、Carrus85で説明されている方法を使用しようとしました。
2つの三角形の斜辺の比を取るだけです(もう一方の三角形を使用しても構いません。計算する距離としてポイント1とポイント2をお勧めします)。これにより、大きな三角形からコーナーの三角形のアスペクト比のパーセンテージが得られます。次に、deltaxにその値を掛けてx座標のオフセットを取得し、deltayにその値を掛けてy座標のオフセットを取得します。
しかし、オブジェクトが画面の端からどれだけ離れているかを計算する方法を見つけることができませんでした。
次に、23yrold3yroldによって提案されたレイキャスティング(これまで行ったことのない)を使用してみました。
画面の中心からオフスクリーンオブジェクトに光線を発射します。光線が長方形のどこで交差するかを計算します。あなたの座標があります。
最初に、2つのポイントのx位置とy位置の差によって形成される三角形の斜辺を計算しました。これを使用して、その線に沿って単位ベクトルを作成しました。x座標またはy座標のいずれかが画面外になるまで、そのベクトルをループしました。2つの現在の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ループを使用する必要があるため)。