Tôi đã tìm kiếm một công thức để vẽ đồ thị (thế giới-> màn hình) và chọn chuột (thế giới-> màn hình) trong một thế giới hình kim cương. Những cái mà tôi đã cố gắng dường như luôn luôn là tốt. Cách thông thường / chính xác để làm điều này là gì?
Tôi đã tìm kiếm một công thức để vẽ đồ thị (thế giới-> màn hình) và chọn chuột (thế giới-> màn hình) trong một thế giới hình kim cương. Những cái mà tôi đã cố gắng dường như luôn luôn là tốt. Cách thông thường / chính xác để làm điều này là gì?
Câu trả lời:
Dựa trên nhận xét của bạn, đây là mã tôi đang sử dụng để chuyển đổi các giá trị x, y sang tọa độ màn hình. Bây giờ, nó không tính đến "gạch 3d", mọi thứ được coi là nằm trên cùng một mặt phẳng, vì vậy nếu bạn đang viết một trò chơi có vấn đề, mã này sẽ không hoạt động.
//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
point screen;
//calculate the screen coordinates
//note: these will then be modified by the camera
screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
return screen;
}
điểm chỉ đơn giản là một cấu trúc chứa x và y ints, TILE_WIDTH sẽ là 64 trong trường hợp của bạn, TILE_DEPTH là loại được đặt tên xấu (thực sự là chiều cao của đồ họa ô vuông), nhưng nó sẽ là 32 trong trường hợp của bạn. Điểm bù là nếu bạn muốn bản đồ ô của mình "bắt đầu" tại một vị trí x, y khác (chẳng hạn như nếu bạn muốn các ô nằm trên một tập hợp các ô khác). Thông thường phần bù có thể là 0,0.
Điều này sẽ tạo ra một bản đồ với 0,0 trên đầu, giữa, như thế này:
0,0
0,1 1,0
0,2 1,1 2,1
Đối với việc tìm ô x, y của con trỏ:
point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;
Trong đoạn mã này, mX và mY là tọa độ màn hình chuột, chúng tôi đang kết hợp với các giá trị máy ảnh để tìm ra vị trí của chúng ta trong "tọa độ thế giới". Mọi thứ khác giống như ví dụ mã trước đó.
Một lần nữa, điều này giả định một bản đồ gạch đẳng phương 2d phẳng. Có một số công việc bổ sung nếu bạn muốn sử dụng chế độ xem bán 3d của bản đồ và tất cả điều này giả định rằng bạn vẫn đang làm việc trong 2d.