为什么不显示整个瓷砖地图?

时间:2015-06-30 14:10:51

标签: java slick2d

我试图创建一个非常简单的瓷砖地图系统,几周前我遇到了问题并在这里问过,但最近我重写了它并且它停止了正常工作。

请注意我使用的是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

感谢。

2 个答案:

答案 0 :(得分:3)

对于我从您的代码中理解的内容,您希望以7x12的矩形打印图像。 如果我理解得很好,你必须在while( x <= 12){

之前的每行之前重置x
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值的原始代码,并使用此方法对其进行了修改。