2015-06-30 2 views
0

Я пытаюсь создать очень простую картографическую систему плитки, у меня были проблемы несколько недель назад и спросили здесь, но в последнее время я переписал ее, и она перестала работать правильно.Почему не все изображение на карте плитки?

Обратите внимание, что я использую 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

Кажется, что ответ Давиде верен, но я хочу обратить ваше внимание на небольшую оптимизацию, которую вы можете сделать.

В настоящее время в цикле, вы проверяете, если ваша плитка равно определенное значение:

if(map[y][x] == 0) 
... 
if(map[y][x] == 1) 
... 
etc 

Это все хорошо и прекрасно, пока у вас есть сотни или тысячи плиток. Все эти утверждения if выполняют точную вещь, которая загружает изображение плитки и рисует ее. Однако для целей скорости это не главная проблема. Одной из основных проблем является инициализация изображения каждой отдельной итерацией, когда вы знаете, что такое конечный результат. Я не знаком с 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 и изменил его с помощью этого метода.

+0

Спасибо за вход! – CalebB

Смежные вопросы