2D绘画操作中的坐标系统变换代码

 private translatecanvas canvas;   // canvas 
  public translate()
  {
    display = display.getdisplay(this);
    canvas  = new translatecanvas(this);
  }
  protected void startapp()
  {
    display.setcurrentcanvas );
  }
  protected void pauseapp()
  { }
 
  protected void destroyappboolean unconditional )
  { }
  public void exitmidlet()
  {
    destroyapp(true);
    notifydestroyed();
  }
}
 
/*————————————————–
* class translate
*
* draw image using translated coordinates
*————————————————-*/
class translatecanvas extends canvas implements commandlistener
{
  private command cmexit;  // exit midlet
  private translate midlet;
  private image im = null;
  private int translatex = 0, translatey = 0;
  public translatecanvas(translate midlet)
  {
    this.midlet = midlet;
    // create exit command & listen for events
    cmexit = new command("exit", command.exit, 1);
    addcommand(cmexit);
    setcommandlistener(this);
 
    try
    {
      // create immutable image
      im = image.createimage("/bolt.png");
    }
    catch (java.io.ioexception e)
    {
      system.err.println("unable to locate or read .png file");
    }    
  
 
  protected void paint(graphics g)
  {
    if (im != null)
    {
      // clear the background
      g.setcolor(255255255);
      g.fillrect(00, getwidth(), getheight());
      // translate coordinates
      g.translate(translatex, translatey);      
      // always draw at 0,0
      g.drawimage(im, 00, graphics.left | graphics.top);
    }
  }
 
  public void commandaction(command c, displayable d)
  {
    if (c == cmexit)
      midlet.exitmidlet();
  }
  protected void keypressed(int keycode)
  {
    switch (getgameaction(keycode))
    {
      case up: 
        // if scrolling off the top, roll around to bottom
        if (translatey – im.getheight() 0)
          translatey = getheight() – im.getheight();
        else
          translatey -= im.getheight();          
        break;
      case down:
 
        // if scrolling off the bottom, roll around to top
        if ((translatey + im.getheight() + im.getheight()) > getheight())
          translatey = 0;
        else
          translatey += im.getheight();          
        break;
      case left:
        // if scrolling off the left, bring around to right
        if (translatex – im.getwidth() 0)
          translatex = getwidth() – im.getwidth();
        else
          translatex -= im.getwidth();          
        break;
 
      case right:
        // if scrolling off the right, bring around to left
        if ((translatex + im.getwidth() + translatex> getwidth())
          translatex = 0;
        else
          translatex += im.getwidth();          
        break;
    }        
    repaint();
  }
}