Java более элегантный способ написания операторов if с изображениями - PullRequest
1 голос
/ 09 марта 2011

Есть ли более элегантный / короткий / организованный способ написания этого кусочка кода?

for (int i = 0; i < SCREENSIZE; i++) {
        for (int j = 0; j < SCREENSIZE; j++) {
            if (map[y + i][x + j] == '@')
                g.drawImage(item, j * TILESIZE,i * TILESIZE, null);
            else if (map[y + i][x + j] == ' ')
                g.drawImage(ground, j * TILESIZE,i * TILESIZE, null);
            else if (map[y + i][x + j] == 'i')
                g.drawImage(bush, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '~')
                g.drawImage(ocean, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '=')
                g.drawImage(fence, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '#')
                g.drawImage(grass, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'Y')
                g.drawImage(townsPerson, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '/')
                g.drawImage(house01, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '¯')
                g.drawImage(house02, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '\\')
                g.drawImage(house03, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '[')
                g.drawImage(house04, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'n')
                g.drawImage(house05, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '_')
                g.drawImage(house06, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == ']')
                g.drawImage(house07, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '`')
                g.drawImage(cground, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'O')
                g.drawImage(boulder, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'Ÿ')
                g.drawImage(alien, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == '.')
                g.drawImage(tree01, j * TILESIZE, i * TILESIZE, null);
            else if (map[y + i][x + j] == 'T')
                g.drawImage(tree02, j * TILESIZE, i * TILESIZE, null);
        }
    }

Ответы [ 5 ]

5 голосов
/ 09 марта 2011

Первым улучшением может быть использование структуры switch / case, но в вашем случае простая карта (Map<Char,Image>) будет еще лучше.

Если пойти еще дальше, вы можете использовать перечисление вместо символов для идентификации объектов, что поможет вам избежать опечаток, но по крайней мере вы должны использовать символьные константы, такие как

public static final char MAP_ITEM = '@';
public static final char MAP_GROUND = ' ';

и т. Д.

1 голос
/ 09 марта 2011

Где-нибудь (в конструкторе?) Сохраните Map в качестве переменной-члена:

images = new HashMap<Character, Image>();
images.put('@', item);
images.put(' ', ground);

Тогда ваш чертеж будет выглядеть так:

for (int i = 0; i < SCREENSIZE; i++) {
    for (int j = 0; j < SCREENSIZE; j++) {
        g.drawImage(images.get(map[y+i][x+j]), j * TILESIZE, i * TILESIZE, null)
    }
}
0 голосов
/ 09 марта 2011

Вы можете использовать переключатель со значением char, чтобы он был понятнее.Также 2-й, 3-й и четвертый параметры всегда одинаковы, поэтому, возможно, установите переменную в переключателе и вызовите метод снаружи.Небольшой псевдокод:

for() {
  for() {
     Image obj;
     switch (map[y+i][x +j]) {
       case '@':
         Obj = item;
         break;
     // other cases
       default:
       //default or error handling
   }
   g.drawImage(obj, j * TILESIZE, i * TILESIZE, null);
 }
}
0 голосов
/ 09 марта 2011

используйте переключатель / регистр (не карту), потому что у компилятора будет больше возможностей для оптимизации, поскольку он знает точный набор значений символов, которые вы включаете:

...
switch(map[y+i][x+j]) {
    case: '@': image = item; break;
    case: ' ': image = ground; break;
    ...
}
g.drawImage(image, j * TILESIZE, i * TILESIZE, null);
...
0 голосов
/ 09 марта 2011

Поскольку вы основываетесь на персонаже, вы можете использовать оператор switch. Другая вещь, которую вы можете сделать, так как вы используете g.drawImage(SOMETHING, j * TILESIZE, i * TILESIZE, null) в каждом случае, вы можете извлечь все то же самое, что и после переключения, и просто назначить некоторую переменную и использовать ее для изменений

EX:

Object graphic;
switch (map[y + i][x + j]) {
case '@': 
    graphic = item;
    break;
case '#':
    graphic = grass;
    break;
// etc....
}
g.drawImage(graphic, j * TILESIZE, i * TILESIZE, null);
...