2011-03-08 6 views
1

Existe-t-il un moyen plus élégant/plus court/organisé d'écrire ce morceau de code?Java façon plus élégante d'écrire des instructions avec des images

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

'Carte tuiles,', ajouter tous ceux à la carte '.put ('O', rocher)', utilisez le mapping comme table de consultation? – LumpN

Répondre

1

Quelque part (? Dans le constructeur), enregistrer un Map comme variable membre:

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

Ensuite, votre dessin ressemblera:

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

J'ai essayé de mettre le code dans mon compilateur et j'ai déclaré mon HashMap comme ça: 'HashMap images;'. Il me donne des avertissements lors de la déclaration et lors de l'utilisation de 'images.put'. De plus, j'obtiens une erreur en utilisant 'images = new HashMap ();' indique-t-on les dimensions attendues après ce jeton (le caractère est souligné)? – Bob

+0

Déclarez-le paramétré comme suit: 'HashMap '. Vous devez également utiliser 'Char' avec un 'c' majuscule en raison du système de type * intéressant * de Java et de ce qu'il vous permet d'utiliser comme paramètres de modèle. –

+0

Désolé, c'est 'Character' pas' Char'. –

5

La première amélioration pourrait être d'utiliser une structure switch/case, mais dans votre cas, une carte simple (Map<Char,Image>) sera encore mieux.

Allant encore plus loin, vous pouvez utiliser un ENUM au lieu de caractères pour identifier les objets qui vous aideront à éviter les fautes de frappe, mais à tout le moins, vous devriez utiliser des constantes de caractères, comme

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

et ainsi sur.

0

Puisque vous fondez de caractère , vous pouvez utiliser une instruction switch. L'autre chose que vous pouvez faire est, puisque vous utilisez g.drawImage(SOMETHING, j * TILESIZE, i * TILESIZE, null) dans tous les cas, vous pouvez extraire tout ce qui est la même chose après que le commutateur et juste assigner une variable et l'utiliser pour les changements qui

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

utiliser un commutateur/cas (pas de carte) car le compilateur aurait plus de place pour optimiser, car il connaît l'ensemble exact des valeurs char que vous passez sur:

... 
switch(map[y+i][x+j]) { 
    case: '@': image = item; break; 
    case: ' ': image = ground; break; 
    ... 
} 
g.drawImage(image, j * TILESIZE, i * TILESIZE, null); 
... 
+0

AUSSI: la solution la plus rapide est si vous êtes sûr que vous n'obtiendrez jamais une valeur autre que celles que vous testez alors vous pouvez créer un ** tableau ** de taille 255, assigner des tuiles comme 'tile_array ['@'] = item; ', puis remplacez tout votre code avec une ligne ** single **:' g.drawImage (tile_array [carte [y + i] [x + j]], j * TILESIZE, i * TILESIZE, null); ' – necromancer

0

vous pouvez utiliser un commutateur avec une valeur char si tha Cela pourrait être plus clair. De plus, les paramètres 2, 3 et 4 sont toujours les mêmes, alors peut-être définir un var dans le commutateur et appeler la méthode à l'extérieur. Un petit code pseudo:

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