import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import java.util.*; 

public class TinyAnimation extends MIDlet { 

   private Display display; 
   private AnimCanvas canvas; 
   private Timer tm; 
   private PlayTimer pt; 

public TinyAnimation() { 

   display=Display.getDisplay(this); 
   canvas=new AnimCanvas(this); 
   } 

public void startApp() { 

   display.setCurrent(canvas); 
   } 

public void pauseApp() { 
   } 

public void destroyApp(boolean unconditional) { 
   } 

public void exitMIDlet() { 

       destroyApp(true); 
       notifyDestroyed(); 
   } 

public void startTimer() { 

   tm=new Timer(); 
   pt=new PlayTimer(canvas); 
   tm.schedule(pt,0,50); 
   } 
} 

class PlayTimer extends TimerTask { 

  private AnimCanvas canvas; 

public PlayTimer (AnimCanvas canvas) { 

   this.canvas=canvas; 
   } 

public final void run() { 

   canvas.doTinyAnimation(); 
   canvas.repaint(); 
   } 
} 

class AnimCanvas extends Canvas implements CommandListener { 

  private Command cmExit; 
  private Command cmStart; 
  private TinyAnimation midlet; 
  
  private int pos; 
  private int animPhase; 
  private int animChg; 
  private int direction; 
  private int deltaX; 
  private int animCount=5; 
  
  private Image pacman; 

public AnimCanvas(TinyAnimation midlet) { 

   this.midlet=midlet; 
   cmExit=new Command("Exit",Command.EXIT, 1); 
   cmStart=new Command("Start",Command.SCREEN, 1); 
   addCommand(cmExit); 
   addCommand(cmStart); 
   setCommandListener(this); 
   pacman=loadImages(); 
   pos=getWidth()+8; 
   } 
    
private Image loadImages() { 

   Image img=null; 
   try { 
      img=Image.createImage("/pacfamily.png"); 
      } 
   catch(Exception e) { 
      e.printStackTrace(); 
      } 
   return(img); 
   } 

protected void paint(Graphics g) { 

   g.setColor(255,255,255); 
   g.fillRect(0,0,getWidth(),getHeight()); 
   g.setClip(pos,getHeight()/2-7,15,15); 
   g.drawImage(pacman,pos-15*animPhase,getHeight()/2-7-15*direction,Graphics.LEFT|Graphics.TOP); 
   } 

public void doTinyAnimation() { 

   pos+=deltaX; 
   if ((pos>getWidth()+3)||(pos<-18)) { 
       deltaX*=-1; 
       pos+=deltaX; 
       toggleDirection(); 
       } 
   animPhase+=animChg; 
   if ((animPhase>=animCount)||(animPhase<0)) { 
       animChg*=-1; 
       animPhase+=animChg; 
       } 
   } 
    
private void toggleDirection() { 

   if (direction==0) 
       direction=1; 
   else 
       direction=0; 
   } 

private void startAnim() { 

   animPhase=0; 
   animChg=1; 
   pos=getWidth()+2; 
   direction=0; 
   deltaX=-2; 
   midlet.startTimer(); 
   } 

public void commandAction(Command c, Displayable d) { 

   if (c==cmExit) 
       midlet.exitMIDlet(); 
   else if (c==cmStart) 
       startAnim(); 
   } 
} 
