¿Debo hacer que las Células en un Tiledmap sean nulas cuando mi jugador lo golpee?

Estoy haciendo un juego basado en Tile usando Libgdx. Tomé la idea de la demo de plataforms SuperKoalio de Mario Zencher. Cuando quise implementar Collectables en mi juego, simplemente dibujé las monedas usando Tiled Map Editor. Cuando mi jugador golpea eso, uso para establecer esa celda como nula.

Algún día en este sitio me sugirieron que no lo haga … nunca use null. Estuve de acuerdo. ¿Qué puede ser de otra manera? Si estoy usando layer.setCell (x, y) para establecer la celda en cualquier otra celda … incluso si es transparente … mi jugador parece estar detenido por un obstáculo / object invisible.

Este es mi código:

for (Rectangle tile : tiles) { if (koalaRect.overlaps(tile)) { TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(1); try{ type = layer.getCell((int) tile.x, (int) tile.y).getTile().getProperties().get("tileType").toString(); } catch(Exception e){ System.out.print("Exception in Tiles Property"+e); type="nonbreakable"; } //Let us destroy this cell if(("award".equals(type))){ layer.setCell((int) tile.x, (int) tile.y, null); listener.coin(); score+=100; test = ""+layer.getCell(0, 0).getTile().getProperties().get("tileType"); } //DOING THIS GIVES A BAD EFFECT if(("killer".equals(type))){ //player.health--; //layer.setCell((int) tile.x, (int) tile.y, layer.getCell(20,0)); } // we actually reset the player y-position here // so it is just below/above the tile we collided with // this removes bouncing :) if (player.velocity.y > 0) { player.position.y = (tile.y - Player.height); } 

¿Es este un enfoque correcto? O debería crear una class de Sprite separada llamada Coin.

Debes crear una class Sprite separada para Coin. No necesariamente tienes que hacer esto, pero hará que sea mucho más fácil crear otros coleccionables, o sobre otros types de azulejos, mientras que suena como lo estás haciendo ahora, tendrás que crear un mosaico diferente cada vez que lo hagas. los cambios de terreno, como monedas sobre hierba, monedas sobre arena, etc.

Sus mosaicos ahora tendrán un miembro, que es una reference, que rastrea qué tipo de coleccionista hay, si corresponde. Será una reference a un coleccionable, que podría ser una moneda. Si no se puede coleccionar, puede establecerlo como null o como un singleton NullCollectable especial.

 interface Collectable { void collectBy(Listener listener); } class Coin implements Collectable { public void collectBy(Listener listener) { listener.coin(); } } class Tile { private Collectable collectable; public stepOnBy(Listener listener) { if (collectable != null) { collectable.collectBy(listener); collectable = null; } } } 

Es posible que haya escuchado "nunca use null", pero es importante saber el motivo de tales declaraciones. La razón es que null te obliga a search null cada vez que usas ese tipo, porque al no hacerlo, desencadenarás NullPointerException , que suelen ser inútiles porque a menudo no te muestran el origen del problema, donde el object se volvió nulo. . Las personas a menudo usan null como un valor centinela o un marcador de position para activar el comportamiento pnetworkingeterminado. Un buen patrón para usar es el Patrón de Objeto Nulo , donde pone su comportamiento pnetworkingeterminado en una sola class y lo usa en lugar de nulo.

Por ejemplo, en lugar de verificar null en Tile.stepOnBy() , puedo usar NothingCollectable en NothingCollectable lugar:

 class NothingCollectable implements Collectable { private static final NothingCollectable instance = new NothingCollectable(); public static NothingCollectable getInstance() { return instance; } public void collectBy(Listener listener) { // do nothing } } class Tile { private Collectable collectable; public stepOnBy(Listener listener) { collectable.collectBy(listener); collectable = NothingCollectable.getInstance(); } }