//GEN-BEGIN:header
import chess.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import javax.swing.event.MouseInputAdapter;

/**
 * DriveCar2.java
 *
 * Created on June 19, 2006, 9:53 AM by Jeremy
 */
public class DriveCar2 {
    public static void main(String[] args) {//GEN-END:header
        double heading;
        double steerAngle;
        double speed;
        double x;
        double y;
        char key;
        int collisions;
        
        final double dtor= Math.PI / 180; //degrees to radians conversion factor
        
        Screen gameScreen= Chess.newScreen(600,600);
        gameScreen.setLineThickness(20);
        gameScreen.drawLine( 300, 100, 300, 500 );
        
        Sprite car= gameScreen.newSprite("/sprites/miniCooper.png",150,300);
        final Sprite targetSprite= 
                gameScreen.newSprite("/sprites/crosshair.png");
        
        MouseInputAdapter mia= new MouseInputAdapter() {
            public void mouseDragged( MouseEvent me ) {
                targetSprite.setPosition(me.getX(),me.getY());
            }
            public void mousePressed( MouseEvent me ) {
                targetSprite.setPosition(me.getX(),me.getY());
            }
        };
        gameScreen.addMouseInputAdapter(mia);
        
        
        speed= 0;
        heading= car.getOrientation() +90;
        steerAngle= 0;
        
        x= car.getPositionX();
        y= car.getPositionY();
        
        DecimalFormat format= new DecimalFormat("0.00");
        
        gameScreen.waitForMouseClick();
        
        collisions= 0;
        
        while ( true ) {
            
            int targetX= targetSprite.getPositionX();
            int targetY= targetSprite.getPositionY();
            
            // angle to target. 0 is straigh ahead, 
            // <0 left, >0 is right in radians.
            double ta= Math.atan2( targetY - y , targetX - x );  
            steerAngle= ta/dtor - heading;
            
            while ( steerAngle < 0 ) steerAngle = steerAngle + 360;
            while ( steerAngle > 180 ) steerAngle = steerAngle - 360;
            double targetAngle= steerAngle * dtor;
            
            
            // forward distance to target.
            double dist= 
                 Math.sqrt((  targetY - y ) * ( targetY - y ) 
                    + ( targetX - x ) * ( targetX - x ) );
            double parallelDist= Math.cos( targetAngle ) * dist;
                                
            // massive cheat doesn't include accelleration
            speed= parallelDist / 10;
            
            if ( parallelDist < 0 ) {
                if ( steerAngle<0 ) steerAngle= -180 - steerAngle;
                if ( steerAngle>=0 ) steerAngle= 180 - steerAngle;
                
            }
            gameScreen.report("speed: "+format.format(speed)+
                    "  steerAngle:"+format.format(steerAngle)+ 
                    "  collisions:"+collisions );
            
            if ( speed > 10 ) speed=10;  // pixels/frame
            if ( speed < -10 ) speed=-10;
            
            if ( steerAngle > 80 ) steerAngle=80; // degrees
            if ( steerAngle < -80 ) steerAngle=-80;
            
            //speed= speed * 0.98;  // friction
            steerAngle= steerAngle * 0.9;  // wheel wants to straighten out
            
            heading+= steerAngle * speed / 100;
            
            double oldX= x;
            double oldY= y;
            x+= speed * Math.cos( heading * Math.PI / 180 );
            y+= speed * Math.sin( heading * Math.PI / 180 );
            
            if ( gameScreen.getPixelColor(x,y).equals(Color.black) ) {
                collisions= collisions+1;
            }
            
            gameScreen.setColor( Color.gray );
            gameScreen.setLineThickness(1);
            gameScreen.drawLine( (int)oldX, (int)oldY, (int)x, (int)y );
            
            car.setOrientation( heading-90 );
            car.setPosition(x,y);
            
            if ( x < 0 ) x=0;
            if ( x > gameScreen.getWidth() ) x=gameScreen.getWidth();
            
            if ( y < 0 ) y=0;
            if ( y > gameScreen.getHeight() ) y=gameScreen.getHeight();
            
            Chess.waitForNextFrame(30);
        } //while   
            
    } //main//GEN-BEGIN:footer
    
} //class
//GEN-END:footer
