#ff0000 28  2006 . - #000655  GUI   
   

#def  ,   MIDP     .   ,         (     ).         .  ,     ,        ,     . 
   (   Palm)     .    ,     ,    hasRepeatEvents().      keyRepeated(): 

protected void keyRepeated(int keyCode)
{
   if (hasRepeatEvents())
   {
      keyPressed(keyCode);
   }
}

  ,      ,   ,     keyPressed. 
,        ,      .  ,    .       -        .  ,  : 
 ,   . 
  ,   . 
   . 
 ,   . 

   . 

private KeyRepeat m_repeat = new KeyRepeat(this);
protected void keyPressed(int keyCode)
{
   //     , 
   //   .   .
   if (!hasRepeatEvents())
   {
      m_repeat.startRepeat(getGameAction(keyCode));
   }
}
protected void keyReleased(int keyCode)
{
   //     , 
   //   .   .
   if (!hasRepeatEvents())
   {
      m_repeat.stopRepeat(getGameAction(keyCode));
   }
}

// performAction()    keyPressed(). public void performAction(int gameAction)
{
   //  game action   .
   switch(gameAction)
   {
   case UP:
      if (m_y > 0) m_y--;
      break;
   case LEFT:
      if (m_x > 0) m_x--;
      break;
   case DOWN:
      if (m_y < m_maxY) m_y++;
      break;
   case RIGHT:
      if (m_x < m_maxX) m_x++;
      break;
   }
   //      repaint
   repaint();
}
 KeyRepeat

         KeyRepeater,    .       ,         .      . 
    .     ,       .       : 
private KeyRepeater m_repeat = new KeyRepeater(this);
   (,   Canvas)   KeyRepeater,     performAction(). 

  (    )      startRepeat().        stopRepeat().     "game action"    ?  ,         .       ,       .  stopRepeat()  ,    ( game action)       . 

private int m_gameAction;
private KeyRepeater m_ui;
public KeyRepeat(KeyRepeater ui)
{
   m_ui = ui;
}
public void startRepeat(int gameAction)
{
   m_gameAction = gameAction;
}
public void stopRepeat(int gameAction)
{
   if (gameAction == m_gameAction)
   {
      m_gameAction = 0;
   }
}


    .  startRepeat()  ,   ,  stopRepeat()  .      run().    :   ,     . 

       .  ,     ,       , ,    ,    .   cancel()   . 

public void run()
{
   while (!m_cancel)
   {
      //    ,   .
      while (m_gameAction == 0 && !m_cancel)
      {
         Thread.yield();
      }
      //  ,      .
      m_ui.performAction(m_gameAction);
      //  .
      try
      {
         sleep(10);
      }
      catch (InterruptedException e)
      {
      }
   }
}

      . 
   

  ,          .          
m_repeat.stopRepeat(getGameAction(keyCode)); 
 

 ,             ,        .        ,   .  ,       ,         . 

    ,    .        : 
private int m_horizSpeed = 0;
private int m_vertSpeed = 0;
private int m_horizDir = 0;
private int m_vertDir = 0;

 m_horizSpeed  m_vertSpeed      . m_horizDir  m_vertDir -    .            . 

protected void keyPressed(int keyCode)
{
   int gameAction = getGameAction(keyCode);
   switch(gameAction)
   {
   case UP:
      m_horizDir = -1;
      break;
   case DOWN:
      m_horizDir = 1;
      break;
   case LEFT:
      m_vertDir = -1;
      break;
   case RIGHT:
      m_vertDir = 1;
      break;
   default:
      return;
   }
   m_repeat.startRepeat(gameAction);
}

       0. 

protected void keyReleased(int keyCode)
{
   int gameAction = getGameAction(keyCode);
   if (gameAction == m_repeat.getGameAction())
   {
      switch(gameAction)
      {
      case UP:
      case DOWN:
         m_horizDir = 0;
         break;
      case LEFT:
      case RIGHT:
         m_vertDir = 0;
         break;
      }
   }
} 

      performAction().      ,      .             ( ,        keyPressed()  keyReleased()).    ,      .  ?        .     0,    . 

public void performAction(int gameAction)
{
   //    
   m_horizSpeed += m_horizDir;
   if (m_horizSpeed < -MAX_SPEED)
   {
      m_horizSpeed = -MAX_SPEED;
   }
   else if (m_horizSpeed > MAX_SPEED)
   {
      m_horizSpeed = MAX_SPEED;
   }
   m_y += m_horizSpeed/2;
   //      , 
   //      
   if (m_y > m_maxY) 
   {
      m_y = 0;
   }
   else if (m_y < 0) 
   {
      m_y = m_maxY;
   }
   //    .
   m_vertSpeed += m_vertDir;
   if (m_vertSpeed < -MAX_SPEED)
   {
      m_vertSpeed = -MAX_SPEED;
   }
   else if (m_vertSpeed > MAX_SPEED)
   {
      m_vertSpeed = MAX_SPEED;
   }
   m_x += m_vertSpeed/2;
   //     , 
   //      .
   if (m_x > m_maxX) 
   {
      m_x = 0;
   }
   else if (m_x < 0) 
   {
      m_x = m_maxX;
   }
   //   .
   repaint();
} 

     . 


          ,        .             . 

    repaint()    performAction.     . ,      ,           .