我在这里拍摄一个想法并遇到了一些问题。首先,我有一个课程,有一个创造新世界的方法。
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));
}
}
这会创建并预定义整个世界的平铺位置,并为它们提供所有空白平铺精灵。它只在开始时运行一次。处理此问题的类是问题开始的地方。
这里迭代了瓷砖并跳过屏幕上没有的所有瓷砖。 xoff
和yoff
为向上,向下,向左,向右偏移,用于移动屏幕。我有点担心编辑实际的网格位置。我确信我可以在需要时对此进行说明。
这是一般的想法。
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循环中完成所有工作,从而减少重复次数?
希望我已经足够了。让我知道我应该添加什么。感谢。
答案 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++){
// ***
}
}