
// LocationBeh.java
// Thana Konglikhit, October 2003, s4310170@maliwan.psu.ac.th
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Postavou lze pohybovat a otáčet pomocí kurzorových kláves:
     dopředu, dozadu, doleva, doprava, nahoru, dolů,
     otočení o 90 stupňů vlevo či vpravo.

   Jde o stejné klávesy jako v případě aplikace Tour3D.

   Směry se zpracovávají z pohledu postavy
   (např. levá strana postavy, ne uživatele).

   Uživatel může zadávat příkazy posty do textového pole
   objektu typu CommandsPanel a míchat operace pro postavu a končetinu.
*/

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;


public class LocationBeh extends Behavior 
{
  // pohybové konstanty
  private final static int FWD = 0;
  private final static int BACK = 1;
  private final static int LEFT = 2;
  private final static int RIGHT = 3;
  private final static int UP = 4;
  private final static int DOWN = 5;

  private final static int CLOCK = 0;   // ve směru 
  private final static int CCLOCK = 1;  // a proti směru hodinových ručiček turn

  // konstanty kláves
  private final static int forwardKey = KeyEvent.VK_DOWN;
  private final static int backKey = KeyEvent.VK_UP;
  private final static int leftKey = KeyEvent.VK_LEFT;
  private final static int rightKey = KeyEvent.VK_RIGHT;

  private Figure figure;
  private WakeupCondition keyPress;


  public LocationBeh(Figure fig)
  { figure = fig;
    keyPress = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
  }


  public void initialize()
  {  wakeupOn(keyPress);  }


  public void processStimulus(Enumeration criteria)
  {
    WakeupCriterion wakeup;
    AWTEvent[] event;

    while( criteria.hasMoreElements() ) {
      wakeup = (WakeupCriterion) criteria.nextElement();
      if( wakeup instanceof WakeupOnAWTEvent ) {
        event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
        for( int i = 0; i < event.length; i++ ) {
          if( event[i].getID() == KeyEvent.KEY_PRESSED )
            processKeyEvent((KeyEvent)event[i]);
        }
      }
    }
    wakeupOn( keyPress );
  } // konec metody: processStimulus()


  private void processKeyEvent(KeyEvent eventKey)
  {
    int keyCode = eventKey.getKeyCode();
    // System.out.println(keyCode);    
    if( eventKey.isAltDown() )
      altMove(keyCode);
    else
      standardMove(keyCode);
  } // konec metody: processKeyEvent()



  private void standardMove(int keycode)
  // přesune postavu dopředu či dozadu nebo ji otoči doleva nebo doprava
  {
    if(keycode == forwardKey)
      figure.doMove(FWD);
    else if(keycode == backKey)
      figure.doMove(BACK);
    else if(keycode == leftKey)
      figure.doRotateY(CLOCK);   // ve směru hodinových ručiček
    else if(keycode == rightKey)
      figure.doRotateY(CCLOCK);    // proti směru hodinových ručiček
  } // konec metody: standardMove()


  private void altMove(int keycode)
  // přesune postavu nahoru, dolů, doleva či doprava
  {
    if(keycode == backKey )
      figure.doMove(UP);
    else if(keycode == forwardKey)
      figure.doMove(DOWN);
    else if(keycode == leftKey)
      figure.doMove(LEFT);
    else if(keycode == rightKey)
      figure.doMove(RIGHT);
  }  // konec metody: altMove()


} //end of třídy: class