# Reglas para la clase Player

## Estados

El jugador tiene tres estados diferenciados:
- STANDING
- JUMPING
- FALLING

## Puntos de colision

El jugador tiene un rectabgulo que lo delimita. Se obtiene con getRect()
Tiene ademas dos puntos en un vector de puntos llamado feet_ con el punto inferior izquierdo y el inferior derecho
Tiene otros dos puntos llamados under_feet_ que son los puntos inmediatamente inferiores a los puntos en feet_. Se usan para saber SOBRE qué tipo de superficie esta el jugador o si bajo solo tiene aire
Tiene otros 8 puntos (el jugador ocupa dos tiles en vertical del mapa, los tiles son de 8 pixeles) que son las 4 esquinas de los dos rectangulos de 8px que formarian al jugador. Se usa para comprobar si el jugador está tocando algun tile de los que matan

## Comprobar colisiones con el mapa
Esto es un poco marciano pero, el jugador genera un rectangulo de proyeccion. Digamos que si se va a mover 3 pixeles hacia la derecha, el rectangulo de proyeccion es el rectangulo que cubre la superficie entre donde está el jugador y donde estará el jugador. Se usa para ver si ese rectangulo (que suele ser de ancho o alto 1, ya que el jugador no llega a moverse mas de un pixel cada vez) colisiona con alguna superficie del mapa. En caso de colision se devuelve el punto de colision y se recoloca al jugador en ese punto. Eso para las superficies rectas.

## Reglas
A continuacion las reglas que se han de cumplir para el jugador en todo momento
- Si está STANDING -> vy_ = 0;
- Si no tiene suelo debajo y no está JUMPING -> FALLING
- Si está JUMPING y tropieza contra el techo -> FALLING
- Si está FALLING -> vx_ = 0
- Si está STANDING y tropieza lateralmente con una Slope, se pega a la slope
- Si esta FALLING y tiene una Slope bajo los pies, se pega a la slope
- La unica forma de atravesar una Slope es en estado JUMPING y con vx_ != 0
- Si salta, se guarda la posicion inicial en Y, si durante el salto está mas bajo de Y (es decir, el valor de y pasa a ser superior al inicial) -> FALLING

## Tipos de superficies
Hay tres tipos de superficies:
- Suelo normal
- Suelo tipo conveyor belt
- Rampas

## Reglas explicadas de manera mas abierta
Debido a que las reglas anteriores pueden sonar confusas y ser incompletas, se describen aqui con lenguaje mas natural:
- El jugador camina sobre las superficies
- Si tiene los dos pies sobre el aire -> cae
- El jugador sube y baja por las rampas
- La unica forma de atravesar las rampas es saltando sobre ellas en movimiento
- Un salto recto o una caida (las caidas siempre son rectas) hacen aterrizar al jugador sobre las rampas
- Las conveyor belt desplazan al jugador en la direccion de la conveyor belt
- El jugador cuando esta siendo desplazado por una conveyor belt, no puede cambiar de direccion
- Solo puede saltar y la propia inercia le hace saltar en movimiento
- Hay una excepcion en las conveyor belts y es que cuando el jugador cae sobre ellas, puede mantener la direccion que tenia el jugador. En el momento que el jugador deja de estar pulsando una direccion, ya se acopla al movimiento de la conveyor belt y no puede cambiar de direccion
- El jugador deja de estar ligado al movimiento de la conveyor belt cuando sus dos pies ya no la tienen debajo, bien porque hay suelo o bien porque hay aire -> cae
- El jugador no puede cambiar de direccion en el aire
