Tetris 3D

Description 
Este es un juego de 3d Tetris en threejs. Hay una cámara orbital alrededor del centro y un área cúbica en la cual caen los bloques formados diferentes y ocupan sub áreas cúbicas. Cuando una capa está completamente ocupada, los bloques de la capa desaparecen y la izquierda se reorganiza correctamente.
Game Structure
Las estructuras del juego: 
	- GameBox
  		El área en la que tiene lugar el juego. Consiste en varios `Capas '.
	- Layer
		Una matriz 2D de área cúbica cuántica.
	- Quanto
		El área cúbica más pequeña está hecha de.
	- Shape 
		Clase abstracta para extender y crear algunos bloques dropables. Las propiedades son una matriz de posiciones (definición de bloque), posición, rotación y un material.
Object Logic
	Quanto
	Quanto es una clase que tiene sólo un nodo threejs como propiedad y algunas variables auxiliares como flag ocupado.
	Shapes
	Habrá varias formas y su información se almacenará como un conjunto de posiciones relativas a su origen y con relación a su posición y rotación. De acuerdo con la información, se creará una escena gráfica parcial para el bloque con la posición y rotación correctas. Shape no tiene lógica sino la precomputación mientras se utiliza principalmente como una estructura para el almacenamiento de datos.
	Layers
	Capas consiste en una matriz 2D de Quanto que están desocupados en el principio. Estos Quantos pueden ser ocupados por una forma.
	GameBox
	GameBox es la principal clase del juego que realiza toda la lógica. Tiene la función de progreso que mueve el juego un paso como en tetris normales, atravesando el conjunto de Capas hasta Quantos y reorganizando apropiadamente. En cada llamada de progreso la escena es manipulada por esta clase.

Class Diagram
Quanto
- node : ThreeJS Entity
- occupied : bool
- temporary : bool
Layer
- quantos : Array [][]
- isOccupied() : bool function 
- clear() : void
GameBox
- scene  : ThreeJS Scene
- layers : Array []
- currentShape : Shape
- checkState() : short // gamestate 0: in progress,  1: winning,  -1:losing
- progress() : void
- isTime()  : bool // returns whether STEPTIME has passed
- setup( SizeX, SizeY ) : void 
- move(x,y) : void // moves current Shape 
- rotate(degrees) : void // rotates current Shape
- checkColisions() : void // check collisions 
 Shape (abstract)
- geometry : array[positions]
- position  : Vector3
- rotation  : Degrees
- node : ThreeJS Entity
Precomputing/Initializing
- La inicialización se inicia en GameBox que inicializará una matriz de instancias de capa que inicializará una matriz de Quantos. 
- La cámara debe ser creada con controles orbitales
- Creación de la escena con un avión y un skybox
- Evento de configuración Oyentes para jugar el juego
- Inicialización de escena
- Adjuntar Gamebox Scene a la escena principal
Gameloop
El gameloop es el siguiente: 
Every frame : 
	if box.isTime() then box.progress() // internal scene update
On Event : 
	box.move(event) 
	or 
	box.rotate(event)