Kết xuất và chọn Isometric?


23

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ì?


Phương pháp và công thức chính xác được sử dụng phụ thuộc một chút vào hình dạng các ô của bạn và có thể một chút về cách bạn vẽ bản đồ (là 0,0 ở trên cùng, dưới cùng hoặc một trong các cạnh của bản đồ) Chi tiết khác về vấn đề của bạn sẽ giúp.
năm11

1
Gạch là 2: 1 (cụ thể hơn, 64x32). Hệ thống tọa độ không thành vấn đề vì tôi đang viết trình soạn thảo. (0,0 ở trên cùng hoặc bên trái có vẻ hợp lý.)
mpnk121

Rất muộn cho câu hỏi và tôi thậm chí không có câu trả lời hoàn chỉnh, nhưng đã có một Google Tech Talk rất hay về chủ đề chính xác này. Thiết lập của họ bao gồm chọn phần không trong suốt của hình ảnh tùy ý (trong javascript, không kém). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Câu trả lời:


21

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.


1
Cảm ơn bạn! - điều này hoạt động tuyệt vời cho bản đồ phẳng. Bây giờ, bạn có thể cho tôi biết thêm một chút về cách tôi có thể thêm các ô có kích thước tùy ý (nghĩa là có độ sâu Z) nằm trên một lớp khác không? (Chẳng hạn như đạo cụ như một cái giếng, hoặc đèn đường)
mpnk121

2
Đó là khi bạn sử dụng các giá trị offsetY và offsetX. Nếu đèn đường của bạn là 64x64, thì việc chuyển sang âm 32 cho giá trị offset sẽ làm cho nó xuất hiện ở đúng nơi. Hy vọng là đủ để bạn bắt đầu.
thedaian

6
Không phải tọa độ "2.1" trong ví dụ của bạn là "2.0"?
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.