package com.rzg.zombieland.comunes.misc;
/**
* Representa los movimientos que puede realizar un personaje.
* @author nicolas
*
*/
public class Movimiento implements Comparable<Movimiento> {
/**
* El tipo de movimiento.
* @author nicolas
*
*/
public enum Direccion {
/**
* Movimiento hacia �arriba�.
*/
NORTE(0, -1),
/**
* Movimiento hacia la derecha.
*/
ESTE(1, 0),
/**
* Movimiento hacia �abajo�.
*/
SUR(0, 1),
/**
* Movimiento hacia la izquierda.
*/
OESTE(-1, 0),
/**
* No se mueve.
*/
NINGUNO(0, 0);
private int dX;
private int dY;
private Direccion(int dX, int dY) {
this.dX = dX;
this.dY = dY;
}
public int getDX() {
return dX;
}
public int getDY() {
return dY;
}
}
public static final Movimiento NINGUNO = new Movimiento(0, Direccion.NINGUNO);
// Tiempo en el que se recibe la orden de movimiento, para poder determinar el orden de estos.
private long tiempoDeMovimientoMillis;
// El tipo de movimiento.
private Direccion tipo;
public Movimiento(Direccion tipo) {
this(System.currentTimeMillis(), tipo);
}
private Movimiento(long tiempo, Direccion tipo) {
if (tipo == null)
throw new NullPointerException("El tipo de movimiento no puede ser null");
this.tiempoDeMovimientoMillis = tiempo;
this.tipo = tipo;
}
@Override
public int compareTo(Movimiento o) {
return Long.compare(tiempoDeMovimientoMillis, o.tiempoDeMovimientoMillis);
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ (int) (tiempoDeMovimientoMillis ^ (tiempoDeMovimientoMillis >>> 32));
result = prime * result + ((tipo == null) ? 0 : tipo.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;
Movimiento other = (Movimiento) obj;
if (tiempoDeMovimientoMillis != other.tiempoDeMovimientoMillis)
return false;
if (tipo != other.tipo)
return false;
return true;
}
/**
* @param coordenada - la coordenada que se va a mover.
* @return una nueva coordenada, desplazada seg�n el movimiento.
*/
public Coordenada mover(Coordenada coordenada) {
return new Coordenada(coordenada.getX() + tipo.getDX(), coordenada.getY() + tipo.getDY());
}
}