Tự động thanh lịch


10

Tôi đang tìm kiếm thông tin về cách mọi người thực hiện tự động gắn thẻ trong các trò chơi dựa trên ô của họ. Cho đến nay tôi vẫn luôn ứng biến nó với một loạt các câu lệnh "nếu ... khác ...", và bây giờ tôi quyết định rằng đã đến lúc tìm một giải pháp thanh lịch hơn. Tôi đã tìm kiếm trên Internet các ví dụ về triển khai tự động và thảo luận về chủ đề này, nhưng tôi chỉ đưa ra ba bài viết:

(Đặc biệt là cái cuối cùng là toàn diện và rất hữu ích.)

Tôi cũng đã xem xét các triển khai và tài liệu khác nhau của các thư viện, ví dụ như triển khai nó, ví dụ như flixel: http://www.flixel.org/features.html#tilemaps

Đáng buồn thay, tất cả các giải pháp mà tôi có thể tìm thấy chính xác là ngẫu hứng và ngớ ngẩn, như những gì tôi bắt đầu, và gần như không bao giờ bao gồm tất cả các trường hợp có thể.

Tôi đang tìm kiếm một ví dụ thanh lịch về việc thực hiện tự động hóa mà tôi có thể học hỏi.

Câu trả lời:


10

Tôi đã sử dụng Phương pháp Bitwise để Áp dụng Tilemaps và thấy nó là một giải pháp rất thanh lịch. Bài viết cung cấp một ví dụ cụ thể và thảo luận về cách mở rộng thuật toán để xử lý nhiều loại địa hình.


Điều này trông giống như thuật toán được sử dụng bởi chế độ tự động "TỰ ĐỘNG" của flixel. Cảm ơn bạn, tôi đang thêm nó vào danh sách của tôi.
Radomir Dopieralski

3

Tôi đã đến đây bằng cách tự mình giải quyết vấn đề này, đọc các bài viết được liên kết và tạo ra một giải pháp tương đối nhỏ gọn tạo ra bộ 47 gạch chung. Nó đòi hỏi một lát 2x3 cho vật liệu tự động như thế này:một lát gạch tự động 2x3

Với một biến thể gạch đơn ở phía trên bên trái, các góc bên trong ở trên cùng bên phải và bốn ô góc bên ngoài ở phía dưới (bạn có thể nhận ra sự sắp xếp này từ RPG Maker).

Mẹo nhỏ là chia mỗi ô bản đồ "hợp lý" thành 4 nửa ô để hiển thị. hơn nữa, một nửa ô trong ô xếp chỉ có thể ở vị trí đó trong ô được tạo, do đó, một nửa ô trên cùng bên trái chỉ có thể được sử dụng ở vị trí trên cùng bên trái.

Những hạn chế này có nghĩa là bạn chỉ cần kiểm tra 3 hàng xóm đầy đủ cho mỗi nửa ô, thay vì tất cả 8 ô lân cận.

Tôi thực hiện ý tưởng này một cách nhanh chóng để kiểm tra nó. Đây là mã bằng chứng khái niệm (TypeScript):

//const dirs = { N: 1, E: 2, S: 4, W:8, NE: 16, SE: 32, SW: 64, NW: 128 };
const edges = { A: 1+8+128, B: 1+2+16, C: 4+8+64, D: 4+2+32 };
const mapA = { 0:8, 128:8, 1:16, 8:10, 9:2, 137:18, 136:10, 129:16 };
const mapB = { 0:11, 16:11, 1:19, 2:9, 3:3, 19:17, 18:9, 17:19 };
const mapC = { 0:20, 64:20, 4:12, 8:22, 12:6, 76:14, 72:22, 68:12 };
const mapD = { 0:23, 32:23, 4:15, 2:21, 6:7, 38:13, 34:21, 36:15 };

export function GenerateAutotileMap(_map: number[][], _tile: integer): number[][]
{
    var result = [];
    for (var y=0; y < _map.length; y++) {
        const row = _map[y];
        const Y = y*2;
        // half-tiles
        result[Y] = [];
        result[Y+1] = [];
        // each row
        for (var x=0; x < row.length; x++) {
            // get the tile
            const t = row[x];
            const X = x*2;
            if (t != _tile) continue;
            // Check nearby tile materials.
            const neighbors = (North(_map, x, y) == t? 1:0)
                + (East(_map, x, y) == t? 2:0)
                + (South(_map, x, y) == t? 4:0)
                + (West(_map, x, y) == t? 8:0)
                + (NorthEast(_map, x, y) == t? 16:0)
                + (SouthEast(_map, x, y) == t? 32:0)
                + (SouthWest(_map, x, y) == t? 64:0)
                + (NorthWest(_map, x, y) == t? 128:0);
            // Isolated tile
            if (neighbors == 0) {
                result[Y][X] = 0;
                result[Y][X+1] = 1;
                result[Y+1][X] = 4;
                result[Y+1][X+1] = 5;
                continue;
            }
            // Find half-tiles.
            result[Y][X] = mapA[neighbors & edges.A];
            result[Y][X+1] = mapB[neighbors & edges.B];
            result[Y+1][X] = mapC[neighbors & edges.C];
            result[Y+1][X+1] = mapD[neighbors & edges.D];
        }
    }
    return result;
}    

Giải trình:

  • Alà phần trên cùng bên trái của gạch, Blà trên cùng bên phải, Clà dưới cùng bên trái, Dlà dưới cùng bên phải.
  • edges giữ bitmasks cho mỗi trong số này, vì vậy chúng tôi chỉ có thể lấy thông tin hàng xóm có liên quan.
  • map* là từ điển ánh xạ các trạng thái lân cận tới các chỉ số đồ họa trong hình ảnh lát (0..24).
    • vì mỗi nửa ô kiểm tra 3 hàng xóm, mỗi ô có 2 ^ 3 = 8 trạng thái.
  • _tile là gạch nhắm mục tiêu tự động.
  • Vì các ô logic của chúng tôi lớn gấp đôi các ô hiển thị của chúng tôi, nên tất cả các chuỗi tự động (x, y) phải được nhân đôi trong bản đồ kết xuất.

Dù sao, đây là kết quả (dù sao chỉ có một ô):nhập mô tả hình ảnh ở đây


0

Tôi đọc hầu hết các liên kết và dành thời gian để đưa ra giải pháp khác. Tôi không biết nó có tốt hay không, nhưng để mô phỏng hành vi tự động xếp gạch của RPG Maker VX Ace (47 ô) Tôi bắt đầu làm một cái gì đó như thế này:

(trái 0 hoặc 1) + (phải 0 hoặc 1) + (tăng 0 hoặc 1) + (giảm 0 hoặc 1) bây giờ tôi có 5 trường hợp.

nếu 4 = Ngói 46 được đặt

nếu 3 người nội trú =

nếu 2 4 trường hợp + 2 trường hợp không chắc chắn về thuật toán nhưng không có nhiều nhánh để thực hiện.

nếu 1 = làm việc trên nó nhưng mọi hướng có thể kết thúc trong 4 trường hợp

if 0 = Tôi có thể sử dụng thuật toán số được hiển thị trong các liên kết với 1, 2, 4, 8 và nhận id từ 1 đến 15 tôi có thể trực tiếp sử dụng.

Tôi không phải là lập trình viên và không giỏi nhất với các thuật toán toán học và giải pháp 1, 2, 4, 8, 16, 32, 64, 128 tôi cũng không thích lắm.

Có lẽ cách tiếp cận của tôi ít nhất là tốt hơn thế.


1
Tôi không chắc câu trả lời này trả lời đầy đủ câu hỏi, bạn có thể giải thích thêm một chút không? Nếu bạn đề cập đến một cái gì đó khác, ít nhất bạn có thể liên kết với nó?
Vaillancourt
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.