
// KeyBehavior.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Zachytává stisky kláves a předává je pro zpracování 
   objektu typu Animator.

   Zachytáváné stisky kláves:
     * kurzorové klávesy pro pohyb     
     * 'a' pro přepnutí příznaku spritu isActive
     * 'p' pro bouchnutí
*/

import java.awt.event.*;
import java.awt.AWTEvent;
import java.util.Enumeration;
import javax.media.j3d.*;
import java.awt.GraphicsDevice;


public class KeyBehavior extends Behavior
{
  private WakeupCondition keyPress;

  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 final static int activeKey = KeyEvent.VK_A;
  private final static int punchKey = KeyEvent.VK_P;

  private final static int inKey = KeyEvent.VK_I;   // pro pohyb pozorovatele
  private final static int outKey = KeyEvent.VK_O;


  private Animator animBeh;     // animátor spritu


  public KeyBehavior(Animator ab)
  { animBeh = ab;
    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 sprite dopředu či dozadu, otočí jej vlevo či vpravo.
     klávesy 'i' a 'o' ovlivňují pozici pozorovatele.   
     klávesa 'a' přepíná aktivovanost spritu, 'p' slouží k úderu;
  */
  {
    if(keycode == forwardKey )
      animBeh.moveForward();
    else if(keycode == backKey)
      animBeh.moveBackward();
    else if(keycode == leftKey)
      animBeh.rotClock();
    else if(keycode == rightKey)
      animBeh.rotCounterClock();

    else if(keycode == activeKey)
      animBeh.toggleActive();
    else if(keycode == punchKey)
      animBeh.punch();

    else if(keycode == inKey)
      animBeh.shiftInViewer();
    else if(keycode == outKey)
      animBeh.shiftOutViewer();
  } // konec metody: standardMove()


  private void altMove(int keycode)
  // pohyb vlevo či vpravo
  { if(keycode == leftKey)
      animBeh.moveLeft();
    else if(keycode == rightKey)
      animBeh.moveRight();
  }  // konec metody: altMove()


} // konec třídy: KeyBehavior
