我试图创建一个非常简单的瓷砖地图系统,几周前我遇到了问题并在这里问过,但最近我重写了它并且它停止了正常工作。
请注意我使用的是slick2D,所以如果你想重现这个,那么你必须把代码放在你的主渲染循环中。
阵列
public static int[][] map = {{1,1,1,1,1,2,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,0,0,0,0,0,1}};
平铺地图循环。
int x = 0;
int y = 0;
int I = 0;
int II = 0;
while(y <= 7){
while( x <= 12){
if(map[y][x] == 0){
Image img = new Image("res/tile1.png");
img.draw(II,I);
}
if(map[y][x] == 1){
Image img = new Image("res/tile0.png");
img.draw(II,I);
}
if(map[y][x] == 2){
Image img = new Image("res/tile3.jpg");
img.draw(II,I);
}
x++;
II = x * 100;
}
y++;
I = y * 100;
}
屏幕截图http://puu.sh/iIf9r/42c3b6f4db.png
感谢。
答案 0 :(得分:3)
对于我从您的代码中理解的内容,您希望以7x12的矩形打印图像。
如果我理解得很好,你必须在while( x <= 12){
int x = 0;
int y = 0;
int I = 0;
int II = 0;
while(y <= 7){
x = 0;
while( x <= 12){
if(map[y][x] == 0){
Image img = new Image("res/tile1.png");
img.draw(II,I);
}
if(map[y][x] == 1){
Image img = new Image("res/tile0.png");
img.draw(II,I);
}
if(map[y][x] == 2){
Image img = new Image("res/tile3.jpg");
img.draw(II,I);
}
x++;
II = x * 100;
}
y++;
I = y * 100;
}
每次创建新图像时,不需要注意以获得更好的性能。首先创建切片并重复使用。
答案 1 :(得分:1)
似乎Davide的答案是正确的,但我想提请你注意一点点的优化。
目前在您的循环中,您正在检查您的磁贴是否等于某个值:
if(map[y][x] == 0)
...
if(map[y][x] == 1)
...
etc
这一切都很好,直到你有数百或数千个瓷砖。所有这些if语句都是正确的,它正在加载一个tile图像并绘制它。但是,出于速度目的,这不是主要问题。其中一个主要问题是,当您知道最终结果是什么时,每次迭代都会初始化一个图像。我对slick2d
不熟悉,但你可能会做这样的事情:
// Initialize this once outside your render loop
Image[] tileImages = {
new Image("res/tile1.png"),
new Image("res/tile0.png"),
new Image("res/tile3.png")
};
...
int x = 0;
int y = 0;
int I = 0;
int II = 0;
while(y <= 7){
x = 0;
while( x <= 12){
// This replaces a lot of unnecessary code and makes it more efficient
tileImages[map[y][x]].draw(II, I);
x++;
II = x * 100;
}
y++;
I = y * 100;
}
注意:我没有对此进行测试,但一般的想法是存在的。另外,我使用了Davide关于设置x = 0
值的原始代码,并使用此方法对其进行了修改。