【问题标题】:Tile grid world creation trouble瓷砖网格世界创建麻烦
【发布时间】:2014-04-15 16:50:33
【问题描述】:

我在这里拍摄一个想法并遇到了一些问题。首先,我有一个类,其中包含创建新世界的方法。

2D 平铺世界是这样创建的:

for(int y = 0; y < WORLDSIZE; y++){
    for(int x = 0; x < WORLDSIZE; x++){
        tiles.add(new Tile(Sprite.blanktile, x*32, y*32));
    }
}

这将创建和预定义整个世界的瓷砖位置,并为它们提供一个空白的瓷砖精灵。它只在开始时运行一次。处理这个的类是问题的开始。

这里的图块被迭代并跳过所有不在屏幕上的图块。 xoffyoff 是上下左右移动屏幕的偏移量。我有点担心编辑实际的网格位置。我确信我能够在需要时考虑到这一点。

这是一般的想法。

while(true){
    for(int i = 0; i < world.tiles.size(); i++){
        world.tiles.get(i).x += xoff;
        world.tiles.get(i).y += yoff;

        if(world.tiles.get(i).y + yoff > GameWindow.HEIGHT || world.tiles.get(i).y + yoff < -64 || world.tiles.get(i).x + xoff > GameWindow.WIDTH || world.tiles.get(i).x + xoff < -64){
            continue;
        }else
            render.setTilePixel(world.tiles.get(i).sprite, world.tiles.get(i).x, world.tiles.get(i).y);
    }

    window.draw(render.visualization());
}

它在每次更新时设置每个图块像素。这使得应该更少的东西变得相当慢。它设置像素的方式是这样的:

public void setTilePixel(Sprite sprite, int x, int y){
    int xa, ya;
    for(int hrzt = 0; hrzt < sprite.SIZE; hrzt++){
        for(int vtc = 0; vtc < sprite.SIZE; vtc++){
            xa =  (hrzt + x);
            ya =  (vtc + y);
            if(xa < width && xa > -1){
                if (xa + ya * width < width*height && xa + ya * width > 0){
                    if(sprite.pixels[hrzt + vtc * sprite.SIZE] != 0xff000000 && sprite.pixels[hrzt + vtc * sprite.SIZE] != 0){
                        visualizer.pixels[xa + ya * width] = sprite.pixels[hrzt + vtc * sprite.SIZE];
                    }
                }
            }
        }
    }
}

最后的操作将新的图像数据发送到要绘制到屏幕的窗口。 window.draw(render.visualization());

这里的问题是每个周期都需要很长时间。我尝试了其他一些方法,但它需要很长时间,比如整整一周。所以,我来到了这里。我正在处理的瓷砖越多,它的速度就越慢。我正在寻找一种新的方式。可能它在 for 循环的同一部分执行所有操作以减少重复?

希望我已经受够了。让我知道我还应该添加什么。谢谢。

【问题讨论】:

    标签: java loops graphics bufferedimage tiles


    【解决方案1】:

    几个小建议:

    首先,我假设您最终会将这些渲染到屏幕上。你能计算出瓷砖与将要显示的内容相关的位置,并跳过那些不会被渲染的瓷砖吗?这应该会大大减少您的计算量。

    其次,在您的 setTilePixel 方法中,您循环遍历 hrzt 和 vtc 值的全部范围,然后进行一些检查以查看是否执行操作。你可以做这样的事情,改变:

    for(int hrzt = 0; hrzt < sprite.SIZE; hrzt++){
        for(int vtc = 0; vtc < sprite.SIZE; vtc++){
            xa =  (hrzt + x);
            ya =  (vtc + y);
            if(xa < width && xa > -1){
                if (xa + ya * width < width*height && xa + ya * width > 0){
                // ***
                }
            }
        }
    }
    

    到:

    int maxValidHrzt = width-x;
    int minValidHrzt = -1;
    int maxValidVtc = etc...
    int minValidVtc = etc...
    for(int hrzt = minValidHrzt; hrzt < maxValidHrzt; hrzt++){
        for(int vtc = minValidVtc; vtc < maxValidVtc; vtc++){
            // ***
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多