【问题标题】:Isometric tile map - Having tiles with bigger sizes?等距瓷砖地图 - 拥有更大尺寸的瓷砖?
【发布时间】:2014-07-03 10:31:35
【问题描述】:

您好,我有以下两个等距图块:

普通瓷砖(水):

岩砖:

我需要在我的游戏板中添加一些像岩石瓷砖这样的瓷砖,但问题是,像这块石头这样的一些瓷砖需要更大的高度。

目前,岩石瓷砖的高度增加了 18 像素。 我尝试将岩石分成 3 块瓷砖,但它看起来很难看,因为你可以看到岩石上地砖的线条。

目前,板子是这样的:


(来源:gyazo.com

如您所见,由于高度不同,瓷砖的位置会有所不同。

我的图形代码层是分层设计的,其中有一个叫Board的层,Board层包含一个叫Nature的层,负责岩石、花朵等。

我的棋盘图:

@Override
public void render(Graphics g) {
    g.translate(this.translate.getX(), this.translate.getY());

    for (int i = 0; i < tiles[0].length; i++) {
        for (int j = 0; j < tiles[1].length; j++) {
            int x = (j * sprite.getWidth() / 2) - (i * sprite.getWidth() / 2);
            int y = (j * sprite.getHeight() / 2) + (i * sprite.getHeight() / 2);
            this.tiles[i][j].render(g, x, y);
        }
    }
    
    // rendering rocks and so on..
    this.nature.render(g);
}

这就是我渲染自然层的方式:

@Override
public void render(Graphics g) {
    for (int i = 0; i < this.tiles[0].length; i++){
        for (int j = 0; j < this.tiles[1].length; j++){
            if (this.tiles[i][j] == null)
                continue;
            int width = this.tiles[i][j].getWidth();
            int height = this.tiles[i][j].getHeight();
            int x = (j * width / 2) - (i * width / 2);
            int y = (j * height / 2) + (i * height / 2);
            
            g.drawImage(this.tiles[i][j], x, y);
        }           
    }
}

我尝试将高度减去 18,但仍然没有运气,它仍然很乱。 是否有任何正确方法可以绘制大于实际尺寸的图块?

【问题讨论】:

    标签: java graphics tiling


    【解决方案1】:

    对您的图块进行抽象。您目前似乎假设一个图块只是简单地表示为一个图像,并且所有内容都是统一大小的。

    如您所见,这并不总是成立。如果你创建一个显式的 Tile 类,你可以在其中封装它的所有细节,并将处理奇怪的东西的责任转移到那里。

    一个简单的 Tile 类可能如下所示:

    public class Tile {
        int offsetX;
        int offsetY;
        Image image;
    
        // Renders the tile at logical coordinates x, y        
        public void draw(Graphics g, int x, int y) {
            g.drawImage(image, x + offsetX, y + offsetY, null);
        }
    }
    

    简而言之,图块会自行管理其古怪之处。

    您可以更进一步,将与游戏相关的数据附加到图块(例如玩家可通过、破坏等)。您保留一个统一的接口来处理切片(Tile 类 API),但每个切片都可以根据需要更改渲染(使用 offsetX/Y 调整其图像大小)。

    编辑:更改渲染中计算 x/y 的公式,使其适用于基本地砖的大小(我猜是 112、56),而与实际地砖精灵的大小无关。您不希望精灵大小弄乱网格中的定位(网格大小由基本地砖大小决定)。 tile 仅补偿其 sprite 与基本尺寸(带有偏移量)之间的差异。

    【讨论】:

    • 我这样做了,但看看会发生什么:gyazo.com/d7c772a760001d4bb4c9bcf6fd96ddc4,它们都有相同的 Y 偏移量,它们到达了不同的点。我把水瓦变成黑色,看看真正的索引在哪里。第一个是 [0][0] 第二个是 [5][5]。瓦片[5][5] = 新瓦片(0, -112, Tiles.ROCK);瓦片[0][0] = 新瓦片(0, -112, Tiles.ROCK);
    • 从您的代码片段中很难判断您正在使用哪种坐标系以及您的图形处于什么状态(您正在使用翻译,当您调用下一个时,它不会神奇地自行撤消render 方法。当重复应用时,它会stacks)。您需要更改 x/y 的公式。瓦片的大小(概念上)都相同,与它们“过度”渲染分配的大小无关。内部 for 循环使用错误的数组长度:它应该是 tiles[i].length 而不是 tiles[1].length(它可能有效,因为当前两个维度相同)。
    • 位于 impl/battle/Nature
    • @BenBeri Stackoverflow 不是调试服务:/ 但正如我所说,您正在根据精灵大小计算 x/y。当然,这确实会给您带来不同大小的奇怪结果。我猜这是导致定位不规则的主要问题。
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多