import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import java.util.Enumeration;


public class gsTimer extends Behavior {
        WakeupOnElapsedTime m_timer;
        TransformGroup          m_objTrans;
        Transform3D m_t3d = new Transform3D();

        double m_angle = 0.0;
        Vector3f m_vTranslate = new Vector3f();

        String[] m_commands = { "FORWARD",
                                                        "FORWARD",
                                                        "FORWARD",
                                                        "LEFT",
                                                        "FORWARD",
                                                        "LEFT",
                                                        "FORWARD",
                                                        "RIGHT",
                                                        "REVERSE",
                                                        "REVERSE" };
        int m_counter = 0;



        public gsTimer (TransformGroup tg) {
                m_objTrans = tg;
                tg.getTransform(m_t3d);
        }

        // this sets up the type of bahaviour (timed)
        public void initialize() {
                m_timer = new WakeupOnElapsedTime(1000);
                this.wakeupOn(m_timer);
        }


        // This method is called everytime a timeout finishes
        public void processStimulus(Enumeration criteria) {
                WakeupCriterion wakeup = null;
                AWTEvent[] event = null;

                // Process all pending wakeups
                while( criteria.hasMoreElements( ) ) {
                        wakeup = (WakeupCriterion)criteria.nextElement( );
                        if ( wakeup instanceof WakeupOnElapsedTime )
                                evTimer();
                }

                ++m_counter;
                if (m_counter < m_commands.length)
                     this.wakeupOn( m_timer );
     }


        void evTimer () {

                String s = m_commands[m_counter];
                System.out.println(s);

                if ( s.equals("FORWARD") ) {
                        m_vTranslate.x -= Math.sin(m_angle);
                        m_vTranslate.z -= Math.cos(m_angle);
                }
                else if ( s.equals("REVERSE") ) {
                        m_vTranslate.x += Math.sin(m_angle);
                        m_vTranslate.z += Math.cos(m_angle);
                }
                else if ( s.equals("RIGHT") )
                        m_angle -= Math.PI/2;
                else if ( s.equals("LEFT") )
                        m_angle += Math.PI/2;


                m_t3d.rotY( m_angle );
                m_t3d.setTranslation( m_vTranslate );
                m_objTrans.setTransform( m_t3d );

        }
}
