Tôi muốn làm những gì được mô tả trong chủ đề này:
http://www.allegro.cc/forums/print-thread/283220
Tôi đã thử một loạt các phương pháp được đề cập ở đây.
Đầu tiên tôi đã thử sử dụng phương pháp được mô tả bởi Carrus85:
Chỉ cần lấy tỷ lệ của hai hypontenuses tam giác (không quan trọng bạn sử dụng cách nào để sử dụng cho cái kia, tôi đề nghị điểm 1 và điểm 2 là khoảng cách bạn tính toán). Điều này sẽ cung cấp cho bạn tỷ lệ phần trăm tỷ lệ của hình tam giác trong góc từ hình tam giác lớn hơn. Sau đó, bạn chỉ cần nhân deltax với giá trị đó để lấy offset tọa độ x và deltay với giá trị đó để lấy offset tọa độ y.
Nhưng tôi không thể tìm ra cách tính vật thể cách xa mép màn hình.
Sau đó, tôi đã thử sử dụng phương pháp đúc tia (điều mà tôi chưa bao giờ thực hiện trước đây) được đề xuất bởi 23yrold3yrold:
Bắn một tia từ giữa màn hình vào đối tượng ngoài màn hình. Tính vị trí trên hình chữ nhật mà tia giao nhau. Có tọa độ của bạn.
Trước tiên tôi tính toán cạnh huyền của tam giác được hình thành bởi sự khác biệt về vị trí x và y của hai điểm. Tôi đã sử dụng điều này để tạo ra một vector đơn vị dọc theo dòng đó. Tôi lặp qua vectơ đó cho đến khi tọa độ x hoặc tọa độ y tắt khỏi màn hình. Hai giá trị x và y hiện tại sau đó tạo thành x và y của mũi tên.
Đây là mã cho phương pháp đúc tia của tôi (được viết bằng C ++ và 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);
}
Điều này đã tương đối thành công. Mũi tên được hiển thị ở phần dưới cùng bên phải của màn hình khi các đối tượng nằm ở phía trên và bên trái màn hình như thể các vị trí của mũi tên được vẽ đã được xoay 180 độ quanh tâm màn hình.
Tôi cho rằng điều này là do thực tế là khi tôi tính toán cạnh huyền của tam giác, nó sẽ luôn dương bất kể sự khác biệt về x hay khác biệt trong y là âm.
Nghĩ về nó, việc truyền tia dường như không phải là một cách tốt để giải quyết vấn đề (do thực tế là nó liên quan đến việc sử dụng sqrt () và một vòng lặp lớn).