Làm thế nào để cuộn gạch hex?


7

Tôi dường như không thể tìm thấy câu trả lời cho câu hỏi này. Tôi có một bản đồ gạch hex. Tôi muốn thực hiện cuộn.

Mã hiện tại:

drawTilemap = function() {
    actualX = Math.floor(viewportX / hexWidth);
    actualY = Math.floor(viewportY / hexHeight);
    offsetX = -(viewportX - (actualX * hexWidth));
    offsetY = -(viewportY - (actualY * hexHeight));

    for(i = 0; i < (10); i++)
    {
        for(j = 0; j < 10; j++)
        {
            if(i % 2 == 0) {
                x = (hexOffsetX * i) + offsetX;
                y = j * sourceHeight;
            } else {
                x = (hexOffsetX * i) + offsetX;
                y = hexOffsetY + (j * sourceHeight);
            }

            var tileselected = mapone[actualX + i][j];

            drawTile(x, y, tileselected);
        }
    }
}

Mã tôi đã viết cho đến nay chỉ xử lý chuyển động X. Nó không hoạt động theo cách nó nên làm. Nếu bạn nhìn vào ví dụ của tôi trên jsfiddle.net bên dưới, bạn sẽ thấy rằng khi di chuyển sang phải, khi bạn đến ô lục giác tiếp theo, có một vấn đề với vị trí X và các tính toán đã xảy ra.

Có vẻ như đó là một chút đơn giản của toán học bị thiếu. Thật không may, tôi đã không thể tìm thấy một ví dụ bao gồm cuộn.

http://jsfiddle.net/hd87E/1/

Đảm bảo không có thanh cuộn ngang sau đó thử di chuyển sang phải bằng cách sử dụng -> mũi tên phải trên bàn phím. Bạn sẽ thấy vấn đề khi bạn đạt đến cuối của ô đầu tiên.

Xin lỗi về mã khủng khiếp, tôi đang học!

Chúc mừng


Tôi đã quản lý để tìm thấy điều này. xnaresource.com/default.asp?page=Tutorial:TileEngineSeries:3 Thật không may, nó hoạt động trên màn hình một cách chính xác nhưng sử dụng tọa độ không chính xác. Nếu bạn nhìn vào bức tranh, tôi không nghĩ chúng sẽ hoạt động với hex hex.
Chris Evans

Tôi đã điều chỉnh mã hơn nữa và sạch hơn và dễ hiểu hơn trong vấn đề quan trọng. Bạn có thể tìm thấy một ví dụ đầy đủ ở đây: jsfiddle.net/wg45T/2/embedded/result và mã ở đây: jsfiddle.net/wg45T/2 Bạn sẽ thấy nó cuộn ngay bây giờ và tạo lại bản đồ vv ok. Vấn đề là bây giờ nó không duy trì vị trí của lát sắp tới khi gạch cũ bị loại bỏ. Hãy thử cuộn sang phải để xem.
Chris Evans

Tôi đã tìm thấy câu trả lời nhưng chưa thể đăng. Sẽ tải lên khi thời gian kết thúc.
Chris Evans

Câu trả lời:


1

Dù hex hay không, tôi khuyên bạn nên giữ các biến vị trí (x, y) của mình chỉ vào thế giới trò chơi và chỉ chuyển đổi sang / từ tọa độ màn hình khi cần. Khi bạn chuyển đổi từ màn hình sang thế giới, bạn thêm (cameraX, cameraY) rồi chia cho (brickStepX, brickStepY). Khi bạn chuyển đổi từ thế giới sang màn hình, bạn nhân với (brickStepX, brickStepY) rồi trừ (cameraX, cameraY). Lưu ý rằng có một sự phức tạp nhỏ với các hình lục giác mà bạn xử lý với cột Offerset.

Đây là phiên bản đơn giản hơn của mã của bạn, với x, y, FirstX, FirstY trong tọa độ thế giới:

drawTilemap = function() {
    // Convert top left of the screen (0, 0) to world coordinates
    firstX = Math.floor(cameraX / 45);
    firstY = Math.floor(cameraY / 50);

    for( x = firstX; x < firstX + 10; x++ )  // world coordinates
    {
        var columnOffset = oddRowOffset * (x % 2);

        for( y = firstY; y < firstY + 10; y++ )  // world coordinates
        {
            // Make sure this world coordinate is part of the map
            if ( 0 <= y && y < mapone.length && 0 <= x && x < mapone[y].length )
            {
                // Convert world coordinates to screen coordinates
                drawTile((x * tileStepX) - cameraX,
                         (y * tileStepY + columnOffset) - cameraY,
                         mapone[y][x]);
            }
        }
    }
}

Những gì đơn giản hóa tuyệt vời! Chúc mừng :)
Chris Evans

0

Tìm thấy câu trả lời! Xem tại đây: http://jsfiddle.net/ck6Vq/1/embedded/result/

Không chắc chắn nếu có ai có thể đưa ra bất cứ điều gì gọn gàng hơn mã dưới đây?

drawTilemap = function() {
    firstX = Math.floor(cameraX / 45);
    offsetX = cameraX % 45;
    if(firstX > 0) {
        firstX = firstX - 1;
        offsetX = offsetX + 45;
    }

    console.log(offsetX);

    firstY = Math.floor(cameraY / 50);
    offsetY = cameraY % 50;

    for(x = 0; x < 10; x++)
    {
        var rowOffset = 0;
        var columnOffset = 0;

        if((firstX + x) % 2 == 1)
        {
            columnOffset = oddRowOffset;
        }

        for(y = 0; y < 10; y++)
        {
            drawTile((x * tileStepX) - offsetX,
                     (y * tileStepY) - offsetY + columnOffset,
                     mapone[y+firstY][x+firstX]);
        }
    }
}
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.