package com.rzg.zombieland.comunes.comunicacion;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.List;
import java.util.Map;
import javax.swing.ImageIcon;
import com.rzg.zombieland.comunes.misc.Avatar;
import com.rzg.zombieland.comunes.misc.Coordenada;
/**
* Proyecta la parte del tablero que un personaje puede ver.
*
* @author nicolas
*
*/
public class ProyeccionTablero extends Enviable {
/**
* Identifica una entidad de la proyecci�n.
*
* @author nicolas
*
*/
public static class POJOEntidad {
// El nombre de esta entidad. Puede ser, por ejemplo, el nombre del
// jugador que controla al
// personaje.
private String etiqueta;
// La coordenada de la entidad.
private Coordenada coordenada;
// El avatar de la misma.
private Avatar avatar;
/**
* Crea un POJO de entidad a trav�s de los par�metros b�sicos.
*
* @param etiqueta
* @param coordenada
* @param avatar
*/
public POJOEntidad(String etiqueta, Coordenada coordenada, Avatar avatar) {
this.etiqueta = etiqueta;
this.coordenada = coordenada;
this.avatar = avatar;
}
/**
* @return la coordenada de la entidad.
*/
public Coordenada getCoordenada() {
return coordenada;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((avatar == null) ? 0 : avatar.hashCode());
result = prime * result
+ ((coordenada == null) ? 0 : coordenada.hashCode());
result = prime * result
+ ((etiqueta == null) ? 0 : etiqueta.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
POJOEntidad other = (POJOEntidad) obj;
if (avatar != other.avatar)
return false;
if (coordenada == null) {
if (other.coordenada != null)
return false;
} else if (!coordenada.equals(other.coordenada))
return false;
if (etiqueta == null) {
if (other.etiqueta != null)
return false;
} else if (!etiqueta.equals(other.etiqueta))
return false;
return true;
}
public Avatar getAvatar() {
return avatar;
}
}
// Tama�o total del tablero - Ancho/largo de la matriz en casilleros
private int casilleros;
// Las esquina que esta proyecci�n revela del mapa.
private Coordenada esquinaSuperiorIzquierda;
private Coordenada esquinaInferiorDerecha;
// Entidades visibles del tablero.
private List<POJOEntidad> entidades;
// El tiempo, en milisegundos, para que arranque el pr�ximo paso.
private int tiempoParaElSiguientePaso;
/**
* @param casilleros
* ancho / largo en casilleros
* @param esquinaSuperiorIzquierda
* de la proyeccion
* @param esquinaInferiorDerecha
* de la proyeccion
* @param entidades
* @param tiempoParaElSiguientePaso
*/
public ProyeccionTablero(int casilleros,
Coordenada esquinaSuperiorIzquierda,
Coordenada esquinaInferiorDerecha,
List<POJOEntidad> entidades,
int tiempoParaElSiguientePaso) {
this.casilleros = casilleros;
this.esquinaSuperiorIzquierda = esquinaSuperiorIzquierda;
this.esquinaInferiorDerecha = esquinaInferiorDerecha;
this.entidades = entidades;
this.tiempoParaElSiguientePaso = tiempoParaElSiguientePaso;
}
/**
* @return las entidades que figuran en la proyecci�n.
*/
public List<POJOEntidad> getEntidades() {
return entidades;
}
public int getCasilleros() {
return casilleros;
}
/**
* Dibuja una proyecci�n de tablero.
*
* @param g
* @param img
* @param anchoTablero
* @param margenIzquierdo
* @param margenSuperior
* @param fondo
*/
public void paint(Graphics g, Map<Avatar, Image> img, int anchoTablero,
int margenIzquierdo, int margenSuperior, ImageIcon fondo) {
int anchoCasillero = anchoTablero / casilleros;
int anchoReal = getAnchoEfectivo(anchoTablero);
Graphics2D g2D = (Graphics2D) g;
g2D.setColor(Color.BLACK);
// La cuadr�cula y el fondo -- ESTA ES LA SOLUCION --
g.drawImage(fondo.getImage(), margenIzquierdo, margenSuperior,
getAnchoEfectivo(anchoTablero), getAnchoEfectivo(anchoTablero),
null);
for (int i = 0; i <= casilleros; i++) {
g2D.drawLine(margenIzquierdo + anchoCasillero * i, margenSuperior,
margenIzquierdo + anchoCasillero * i, margenSuperior
+ anchoReal);
g2D.drawLine(margenIzquierdo, margenSuperior + anchoCasillero * i,
margenIzquierdo + anchoReal, margenSuperior
+ anchoCasillero * i);
}
for (POJOEntidad entidad : entidades) {
g.drawImage(img.get(entidad.getAvatar()), entidad.getCoordenada()
.getX() * anchoCasillero + margenIzquierdo, entidad
.getCoordenada().getY() * anchoCasillero + margenSuperior,
anchoCasillero, anchoCasillero, null);
}
// La famosa 'Proyeccion'
// Primero ajustamos la transparencia, a pedido de Iv�n.
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
0.8f);
g2D.setComposite(ac);
// Son 4 rectangulos. Uno arriba, uno abajo y 2 a cada lado.
g2D.fillRect(margenIzquierdo, margenSuperior, anchoReal,
esquinaSuperiorIzquierda.getY() * anchoCasillero);
g2D.fillRect(margenIzquierdo, (esquinaInferiorDerecha.getY() + 1)
* anchoCasillero + margenSuperior, anchoReal, anchoReal
- (esquinaInferiorDerecha.getY() + 1) * anchoCasillero);
g2D.fillRect(margenIzquierdo, esquinaSuperiorIzquierda.getY()
* anchoCasillero + margenSuperior,
esquinaSuperiorIzquierda.getX() * anchoCasillero,
esquinaInferiorDerecha.getY() * anchoCasillero
- (esquinaSuperiorIzquierda.getY() - 1)
* anchoCasillero);
g2D.fillRect((esquinaInferiorDerecha.getX() + 1) * anchoCasillero
+ margenIzquierdo, esquinaSuperiorIzquierda.getY()
* anchoCasillero + margenSuperior, anchoReal
- (esquinaInferiorDerecha.getX() + 1) * anchoCasillero,
esquinaInferiorDerecha.getY() * anchoCasillero
- (esquinaSuperiorIzquierda.getY() - 1)
* anchoCasillero);
}
/**
* @param dimension
* @return el ancho necesario del tablero para que los casilleros entren
* justo (elimina los excedentes)
*/
public int getAnchoEfectivo(int dimension) {
return dimension - dimension % casilleros;
}
public int getTiempoParaElSiguientePaso() {
return tiempoParaElSiguientePaso;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + casilleros;
result = prime * result
+ ((entidades == null) ? 0 : entidades.hashCode());
result = prime
* result
+ ((esquinaInferiorDerecha == null) ? 0
: esquinaInferiorDerecha.hashCode());
result = prime
* result
+ ((esquinaSuperiorIzquierda == null) ? 0
: esquinaSuperiorIzquierda.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ProyeccionTablero other = (ProyeccionTablero) obj;
if (casilleros != other.casilleros)
return false;
if (entidades == null) {
if (other.entidades != null)
return false;
} else if (!entidades.equals(other.entidades))
return false;
if (esquinaInferiorDerecha == null) {
if (other.esquinaInferiorDerecha != null)
return false;
} else if (!esquinaInferiorDerecha.equals(other.esquinaInferiorDerecha))
return false;
if (esquinaSuperiorIzquierda == null) {
if (other.esquinaSuperiorIzquierda != null)
return false;
} else if (!esquinaSuperiorIzquierda
.equals(other.esquinaSuperiorIzquierda))
return false;
return true;
}
}