Saya ingin melakukan apa yang dijelaskan dalam topik ini:
http://www.allegro.cc/forums/print-thread/283220
Saya telah mencoba berbagai metode yang disebutkan di sini.
Pertama saya mencoba menggunakan metode yang dijelaskan oleh Carrus85:
Ambil saja rasio dari kedua segitiga hypontenus (tidak masalah triagle mana yang Anda gunakan untuk yang lain, saya sarankan titik 1 dan titik 2 sebagai jarak yang Anda hitung). Ini akan memberi Anda persentase aspek rasio segitiga di sudut dari segitiga yang lebih besar. Kemudian Anda cukup mengalikan deltax dengan nilai itu untuk mendapatkan offset koordinat-x, dan menunda dengan nilai itu untuk mendapatkan offset koordinat-y.
Tetapi saya tidak dapat menemukan cara untuk menghitung seberapa jauh objek tersebut berada jauh dari tepi layar.
Saya kemudian mencoba menggunakan ray casting (yang belum pernah saya lakukan sebelumnya) yang disarankan oleh 23yrold3yrold:
Tembakan sinar dari tengah layar ke objek offscreen. Hitung di mana pada persegi panjang sinar berpotongan. Itu koordinatmu.
Saya pertama kali menghitung sisi miring dari segitiga yang dibentuk oleh perbedaan posisi x dan y dari dua titik. Saya menggunakan ini untuk membuat vektor satuan di sepanjang garis itu. Saya memutar-mutar vektor itu sampai koordinat x atau koordinat y tidak ada di layar. Dua nilai x dan y saat ini kemudian membentuk x dan y dari panah.
Berikut adalah kode untuk metode pengecoran sinar saya (ditulis dalam C ++ dan 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);
}
Ini relatif sukses. Panah ditampilkan di bagian kanan bawah layar ketika objek berada di atas dan kiri layar seolah-olah lokasi di mana panah ditarik telah diputar 180 derajat di sekitar tengah layar.
Saya berasumsi ini karena fakta bahwa ketika saya menghitung sisi miring dari segitiga, itu akan selalu positif terlepas dari apakah perbedaan dalam x atau perbedaan dalam y adalah negatif.
Berpikir tentang hal itu, ray casting sepertinya bukan cara yang baik untuk menyelesaikan masalah (karena fakta bahwa itu melibatkan penggunaan sqrt () dan besar untuk loop).