gpt4 book ai didi

java - 瓷砖网格世界创建麻烦

转载 作者:行者123 更新时间:2023-12-01 13:08:28 26 4
gpt4 key购买 nike

我在这里提出一个想法,但遇到了一些问题。首先,我有一个包含创建新世界方法的类。

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));
}
}

这会创建并预定义整个世界的图 block 位置,并为它们提供一个空白的图 block Sprite 。它在开始时只运行一次。处理这个问题的类就是问题开始的地方。

此处,图 block 将被迭代并跳过所有不在屏幕上的图 block 。 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());
}

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

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());

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

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

最佳答案

一些小建议:

首先,我认为您最终会将这些渲染到屏幕上。您能否计算出图 block 与将要显示的内容相关的位置,并跳过那些不会渲染的图 block ?这应该会显着减少您的计算量。

其次,在 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++){
// ***
}
}

关于java - 瓷砖网格世界创建麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23089866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com