

import java.util.ArrayList;



import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;



public class Something extends Application{
	//Variables globales a la cual vamos a trabajar 
	double pos_x = 500;
	double pos_y = 400;
	int sentido = 0;
	double giro = 0.0;
	
	public static void main(String[] args){
		Application.launch(args);
	}
	@Override
	public void start(Stage stage)	{
		//Preparamos el escenario
		stage.setTitle("Óyeme Carlos llévame en tu Bicicleta");
		Pane root = new Pane();
		Scene scene = new Scene(root);
		stage.setScene(scene);
		//Preparamos el canvas y agregamos el canvas al escenario
		Canvas canvas = new Canvas(1200,680);
		//Preparamos las escuchadores del teclado, que nos serviran para mover
		//la bicicleta con el teclado
		ArrayList<String> entrada = new ArrayList<String>();
		scene.setOnKeyPressed(
            new EventHandler<KeyEvent>()
            {
                public void handle(KeyEvent e)
                {
                    String codigo = e.getCode().toString();
                    if ( !entrada.contains(codigo) )
                        entrada.add( codigo );
                }
            });
        scene.setOnKeyReleased(
            new EventHandler<KeyEvent>()
            {
                public void handle(KeyEvent e)
                {
                    String codigo = e.getCode().toString();
                    entrada.remove( codigo );
                }
            });
		//Cargamos los dibujos al canvas
		GraphicsContext gc = canvas.getGraphicsContext2D();
		//Obtenemos la imagen
		Image bicicleta = new Image("bici.png",160,100,false,true);
		ImageView mostrarBicicleta = new ImageView(bicicleta);
		mostrarBicicleta.setX(pos_x);
		mostrarBicicleta.setY(pos_y);
		mostrarBicicleta.setRotate(0.0);
		Image fondo = new Image("fondo.png");
		gc.drawImage(fondo, 0, 0, 1200, 680);
		root.getChildren().addAll(canvas,mostrarBicicleta);
		//Aqui es donde realizaremos la animacion 
		new AnimationTimer()
	    {
	        public void handle(long currentNanoTime)
	        {
	        	
	        	if(entrada.contains("LEFT") && entrada.contains("DOWN") ) {
	        		if(pos_x > 0 && pos_y <=430) {
	        			pos_x = pos_x-0.5;
	        			pos_y = pos_y+0.5;
	        			sentido = 0;
	        			giro = Math.PI/4;
	        		}
	        	}else if(entrada.contains("RIGHT") && entrada.contains("DOWN")) {
	        		if(pos_x <= 1060 && pos_y <=430) {
	        			pos_x = pos_x+0.5;
	        			pos_y = pos_y+0.5;
	        			sentido = 1;
	        			giro = -Math.PI/4;
	        		}
	        	}else if(entrada.contains("UP") && entrada.contains("LEFT")) {
	        		if(pos_x<=1060 && pos_x >= 0 && pos_y >=150) {
	        			pos_x = pos_x-0.5;
	        			pos_y = pos_y-0.5;
	        			sentido = 0;
	        			giro = -Math.PI/4;
	        		}
	        	}else if(entrada.contains("UP") && entrada.contains("RIGHT")) {
	        		if(pos_x <= 1060 && pos_y >=150) {
	        			pos_x = pos_x+0.5;
	        			pos_y = pos_y-0.5;
	        			sentido = 1;
	        			giro = Math.PI/4;
	        		}
	        	}else if(entrada.contains("UP")) {
	        		if(pos_y>=150) {
	        			pos_y = pos_y-0.5;
	        			if(sentido == 0) {
	        				giro = -Math.PI/2;
	        			}else {
	        				giro = Math.PI/2;
	        			}
	        		}
	        	}else if(entrada.contains("DOWN")) {
	        		if(pos_y<=430) {//580
	        			pos_y = pos_y+0.5;
	        			giro = Math.PI/2;
	        		}
	        	}else if(entrada.contains("LEFT")) {
	        		if(pos_x>=0) {
	        			pos_x = pos_x-0.5;
	        			sentido = 0;
	        			giro = 0.0;
	        		}
	        	}else if(entrada.contains("RIGHT")) {
	        		if(pos_x<=1060) {
	        			pos_x = pos_x+0.5;
	        			sentido = 1;
	        			giro = 0.0;
	        		}
	        	}else if(entrada.contains("CONTROL")) {
	        		mostrarBicicleta.setRotate(mostrarBicicleta.getRotate()-0.5);
	        	}else if(entrada.contains("ALT")) {
	        		mostrarBicicleta.setRotate(mostrarBicicleta.getRotate()+0.5);
	        	}
	        	double girar = (giro * 180) / Math.PI;
	        	mostrarBicicleta.setX(pos_x);
	        	mostrarBicicleta.setY(pos_y);
	        	gc.drawImage(fondo, 0, 0, 1200, 680);
	        	gc.fillText("Controles:\n" +
	        			"Control: giro antihorario\n" + 
	        			"Alt: giro horario\n"
	        			+ "Fechas del teclado: Mueve a la bicicleta", 300, 600);
	        }
	    }.start();
	    
	stage.show();
	}
}