瓷砖世界创造麻烦

时间:2014-04-15 16:50:33

标签: java loops graphics bufferedimage tiles

我在这里拍摄一个想法并遇到了一些问题。首先,我有一个课程,有一个创造新世界的方法。

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循环中完成所有工作,从而减少重复次数?

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

1 个答案:

答案 0 :(得分: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++){
        // ***
    }
}