【发布时间】: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));
}
}
这将创建和预定义整个世界的瓷砖位置,并为它们提供一个空白的瓷砖精灵。它只在开始时运行一次。处理这个的类是问题的开始。
这里的图块被迭代并跳过所有不在屏幕上的图块。 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 循环的同一部分执行所有操作以减少重复?
希望我已经受够了。让我知道我还应该添加什么。谢谢。
【问题讨论】:
标签: java loops graphics bufferedimage tiles