Veja bem. Performance não é tanto o problema, mas sim memória.
Um array de 100x100, vai ocupar pelo menos 40KB.
Agora, a maior parte desse array irá ser ocupado por referências um mesmo tipo de tile, como grama ou o chão de sua caverna. Um desperdício, não?
A solução para isso é usar uma matriz dispersa, que retorna o seu tile default caso não haja um tile cadastrado. Para isso, você cria um map, com outro map dentro.
Eu implementei rapidinho aqui essa classe, que representa esse conceito. Não testei, pode ser que alguns ajustes tenham que ser feitos (não tem como remover um tile, por exemplo). Mas acho que já dá para te dar uma idéia de como funciona uma matriz desse tipo:
[code]public class Matrix<T> {
private Map<Integer, Map<Integer, T>> map;
private T defaultValue;
public Matrix(T defaultValue) {
if (defaultValue == null)
throw new IllegalArgumentException("Default value cannot be null!");
this.defaultValue = defaultValue;
this.map = new HashMap<Integer, Map><Integer, T>>();
}
public T get(int line, int column) {
Map<Integer, T> columns = map.get(line);
if (columns == null)
return defaultValue;
T tile = columns.get(column);
if (tile == null)
return defaultValue;
return tile;
}
public T put(int line, int column, T value) {
Map<Integer, T> columns = map.get(line);
if (columns == null) {
columns = new HashMap<Integer, T>();
map.put(line, columns);
}
T oldValue = columns.put(column, value);
if (oldValue == null)
return defaultValue;
return oldValue;
}
}[/code]
Pra usar, basta fazer:
[code]Matrix<Tile> tileMap = new Matrix<Tile>(new GrassTile());
RockWallTile rockWall = new RockWallTile();
tileMap.put(5,5, rockWall);
tileMap.put(6,5, rockWall);
tileMap.put(7,5, rockWall);
tileMap.put(5,6, rockWall);
tileMap.put(7,6, rockWall);
tileMap.put(5,7, rockWall);
tileMap.put(6,7, rockWall);
tileMap.put(7,7, rockWall);
if (tileMap.get(player.getTilePos().getX(), player.getTilePos().getY()) == rockWall) {
//O jogador colidiu com a parede? Faz alguma coisa…
}[/code]