www.pudn.com > TWPlaneGame.rar > PlaneGameCanvas.java


package twplanegame; 
 
import javax.microedition.lcdui.*; 
import java.util.*; 
/* 
 public class PlaneGameCanvas extends Canvas { 
   public PlaneGameCanvas() { 
    try { 
      jbInit(); 
    } 
    catch(Exception e) { 
      e.printStackTrace(); 
    } 
  } 
  /**Component initialization*/ 
//  private void jbInit() throws Exception { 
 // Set up this Displayable to listen to command events 
//    setCommandListener(new PlaneGameCanvas_CommandAdapter(this)); 
 // add the Exit command 
//    addCommand(new Command("Exit", Command.EXIT, 1)); 
//  } 
 
 /**Handle command events*/ 
//  public void this_commandPerformed(Command command, Displayable displayable) { 
 /** @todo Add command handling code */ 
//    if (command.getCommandType() == Command.EXIT) { 
// stop the MIDlet 
 //     PlaneGameMIDlet.quitApp(); 
 //   } 
 // } 
 
 /** Required paint implementation */ 
//  protected void paint(Graphics g) { 
 /** @todo Add paint codes */ 
//  } 
 
//} 
 
 /* 
  class PlaneGameCanvas_CommandAdapter implements CommandListener { 
   private PlaneGameCanvas instance; 
   public PlaneGameCanvas_CommandAdapter(PlaneGameCanvas instance) { 
     this.instance = instance; 
   } 
   public void commandAction(Command command, Displayable displayable) { 
     instance.this_commandPerformed(command, displayable); 
   } 
  } 
  */ 
 
class PlaneGameCanvas 
    extends Canvas 
    implements CommandListener, KeyRepeater, ActionListener 
{ 
    // save some calculated values for speed 
    private int m_maxX = getWidth() - 1; 
    private int m_maxY = getHeight() - 1; 
    private int m_imageWidth; 
    private int m_imageHeight; 
    // values we need for movement 
    private int m_x = m_maxX / 2; 
    private int m_y = m_maxY / 2; 
    // objects necessary for app 
    private AppExiter m_appExiter; 
 
    private KeyRepeat m_repeat = new KeyRepeat(this); 
 
// private Constant cons = new Constant(); //in order to use self-defined constants 
 
    //actionUpDater,draw the screen every interval time 
    private static final ActionUpdater m_updater = new ActionUpdater(0, 10); 
 
    //Back ground mover 
    private final ImageScroller m_scroller; 
 
    boolean painting = false; 
 
    //*****MY PLANE******// 
    private MyPlane myplane; 
    private Image myplaneRed; 
    private Image myplaneExp; 
 
    //*****MY BULLET*****// 
    private Bullet[] mybullet = new Bullet[10]; 
    private final BulletScroller b_scroller; 
    private boolean SendBulletTag; 
 
    //****ENEMY PLANES****// 
    private EnemyPlane[] ePlane = new EnemyPlane[5]; 
    private final ePlaneScroller p_scroller; 
 
    //******ENEMY PLANE BULLET*****// 
    private Bullet[] eBullet = new Bullet[10]; 
 
    //******ENEMY BOSS*******// 
    private EnemyBoss eBoss; 
 
    //******BOSS BULLET******// 
    private Bullet[] bossBullet = new Bullet[15]; 
 
    private Image tempImage; 
 
    /** 
     * The constructor assigns the AppExiter, load the image, and initialies 
     * all the constants.  It also adds the EXIT Command, and registers itself 
     * as a command listener. 
     */ 
 
    public PlaneGameCanvas(AppExiter exiter) 
    { 
        m_appExiter = exiter; 
 
        //**intiate my plane 
        myplane = new MyPlane(10, m_y); 
        try { 
            myplaneRed = Image.createImage("/myplane_red.PNG"); 
        } 
        catch (Exception e) { 
            myplaneRed = null; 
        } 
        try { 
            myplaneExp = Image.createImage("/explosion.PNG"); 
        } 
        catch (Exception e) { 
            myplaneExp = null; 
        } 
 
        //**intiate my plane's bullet array 
         for (int i = 0; i < mybullet.length; i++) { 
             mybullet[i] = new Bullet(0); 
         } 
        SendBulletTag = true; 
 
        //**initiate enemy plane array 
        for (int i = 0; i < ePlane.length; i++) { 
            ePlane[i] = new EnemyPlane(); 
        } 
        //**initiate enemy boss 
         eBoss = new EnemyBoss(1, m_maxX, m_maxY / 2); 
 
        p_scroller = new ePlaneScroller(this, 50); 
 
        //**initiate enemy plane's bullet array 
        for (int i = 0; i < eBullet.length; i++) { 
            eBullet[i] = new Bullet(1); 
        } 
 
        //**initiat boss bullet array 
         for (int i = 0; i < bossBullet.length; i++) { 
             bossBullet[i] = new Bullet(2); 
         } 
 
        b_scroller = new BulletScroller(this, 50); 
 
        //** init back ground scroller 
        m_scroller = new ImageScroller(this, 200); 
 
        register(this); 
 
        //** add the EXIT command to the Canvas 
        addCommand(AppExiter.EXIT); 
 
        // register the Canavas as the listener for Commands, the action for 
        // the Commands will be handled in the commandAction() method 
        setCommandListener(this); 
        m_repeat.setSleepPeriod(20); 
        m_repeat.start(); 
    } 
 
    protected void paint(Graphics g) 
    { 
        painting = true; 
        int x, y; 
        //*****clear the screen 
         g.setColor(0, 0, 0); 
        g.fillRect(0, 0, m_maxX + 1, m_maxY + 1); 
 
        //draw the background 
        m_scroller.paint(g); 
 
        //draw enemy planes 
        p_scroller.paint(g); 
 
        //draw bullets 
        b_scroller.paint(g); 
 
        // draw my plane 
        x = myplane.getXPos(); 
        y = myplane.getYPos(); 
        tempImage = myplane.getImage(); 
        switch (myplane.getState()) { 
            case PlaneGameObject.ALIVE: 
                g.drawImage(tempImage, x, y, 
                            Graphics.VCENTER | Graphics.HCENTER); 
                break; 
            case PlaneGameObject.HIT: 
                g.drawImage(myplaneRed, x, y, 
                            Graphics.VCENTER | Graphics.HCENTER); 
                myplane.SetState(PlaneGameObject.ALIVE); 
                break; 
            case PlaneGameObject.BOMBING: 
                g.drawImage(myplaneExp, x, y, 
                            Graphics.VCENTER | Graphics.HCENTER); 
                // Game Over 
                break; 
        } 
        painting = false; 
    } 
 
    protected void keyRepeated(int keyCode) 
    { 
        if (hasRepeatEvents()) { 
            moveMyPlane(getGameAction(keyCode)); 
            m_repeat.stopRepeat(FIRE); 
        } 
    } 
 
    /** 
     * Called when a key is pressed. 
     * 
     * @param keyCode The key code of the key that was pressed. 
     */ 
    protected void keyPressed(int keyCode) 
    { 
        // if this MIDP implementation does not support repeated keys 
        // then start our own key repeatert 
 
        if (!hasRepeatEvents()) { 
            m_repeat.startRepeat(getGameAction(keyCode)); 
        } 
 
    } 
 
    /** 
     * Called when a key is released. 
     * 
     * @param keyCode The key code of the key that was pressed. 
     */ 
    protected void keyReleased(int keyCode) 
    { 
        // if this MIDP implementation does not support repeated keys 
        // then stop our key repeater 
        if (!hasRepeatEvents()) { 
            m_repeat.stopRepeat(getGameAction(keyCode)); 
        } 
    } 
 
    public boolean sendBullet(int a_x, int a_y, int tag) 
    { 
        int offset = myplane.getImageWidth() / 2; 
 
        switch (tag) { 
            case 0: //my plane Send bullet 
                for (int i = 0; i < mybullet.length; i++) { //find empty space 
                    if (!mybullet[i].IsShow()) { //available space in array 
                        mybullet[i].SetID(myplane.getBulletType()); //set id 
                        mybullet[i].SetSpeed(10, 0); 
                        mybullet[i].ShowTrue(); //take the space 
                        mybullet[i].SetPos(a_x + offset, a_y); 
                        return true; //!!break here if sent one bullet,very important 
                    } 
 
                } 
                return false; 
            case 1: //enemy plane send bullet 
                for (int j = 0; j < eBullet.length; j++) { 
                    if (!eBullet[j].IsShow()) { 
                        eBullet[j].SetSpeed(3, 3); 
                        eBullet[j].ShowTrue(); 
                        eBullet[j].SetPos(a_x, a_y); 
                        return true; 
                    } 
                } //for 
                return false; 
            case 2: //enemy boss send bullet 
                for (int i = 0; i < bossBullet.length; i++) { 
                    if (!bossBullet[i].IsShow()) { 
                        bossBullet[i].ShowTrue(); 
                        bossBullet[i].SetSpeed( -2, i / 3 - 2); 
                        bossBullet[i].SetPos(a_x, a_y); 
                    } 
                } 
                return true; 
        } //switch(tag) 
        return false; 
    } //sendBullet 
 
    public void moveMyPlane(int gameAction) 
    { 
        //change the data of my plane 
        int dx = 0, dy = 0; 
        int x_pos = myplane.getXPos(); 
        int y_pos = myplane.getYPos(); 
        int s = myplane.getSpeed(); 
        switch (gameAction) { 
            case UP: 
                if (y_pos > 0) { 
                    dy -= s; 
                } 
                if (SendBulletTag) { 
                    if (sendBullet(x_pos, y_pos, 0)) { 
                        SendBulletTag = false; 
                    } 
                } 
                break; 
            case LEFT: 
                if (x_pos > 0) { 
                    dx -= s; 
                } 
                break; 
            case DOWN: 
                if (y_pos < m_maxY) { 
                    dy += s; 
                } 
                if (SendBulletTag) { 
                    if (sendBullet(x_pos, y_pos, 0)) { 
                        SendBulletTag = false; 
                    } 
                } 
                break; 
            case RIGHT: 
                if (x_pos < m_maxX) { 
                    dx += s; 
                } 
                break; 
            case FIRE: 
                if (SendBulletTag) { 
                    if (sendBullet(x_pos, y_pos, 0)) { 
                        SendBulletTag = false; 
                    } 
                } 
                break; 
        } 
        myplane.ChangePos(dx, dy); 
        repaint(); 
    } 
 
    //judge whether the two given objects collided 
    public boolean Collision(PlaneGameObject obj1, PlaneGameObject obj2) 
    { 
        int r1 = obj1.getRadius(); 
        int r2 = obj2.getRadius(); 
        int x1 = obj1.getXPos(); 
        int x2 = obj2.getXPos(); 
        int y1 = obj1.getYPos(); 
        int y2 = obj2.getYPos(); 
 
        int distance = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); 
 
        if (distance < (r1 + r2) * (r1 + r2)) { //indicate that collided 
            return true; //return true 
        } 
        else { 
            return false; 
        } 
    } //Collision() 
 
    /** 
     * Called when a game action is to be performed. 
     */ 
 
    public void performAction() 
    { 
        repaint(); 
    } 
 
    /** 
     * Register the DisplayObject with the action updater. 
     * 
     * @param obj The object to be registered. 
     */ 
    public static void register(ActionListener obj) 
    { 
        m_updater.register(obj); 
    } 
 
    public void commandAction(Command c, Displayable d) 
    { 
        if (c == AppExiter.EXIT) { 
            m_repeat.cancel(); 
            m_repeat = null; 
            m_appExiter.exitApp(); 
        } 
    } 
 
    //class BulletScroller controls the movement of my bullets by time 
 
    class BulletScroller 
        extends TimerTask 
    { 
        private final Timer m_updateTimer = new Timer(); 
        private int ClockTag; 
 
        private final int m_screenWidth; 
        private final int m_screenHeight; 
        private int m_x; 
        private int m_y; 
        private Image myBulletImage; 
        private Image eBulletImage; 
        private Image bossBulletImage; 
 
        public BulletScroller(Canvas screen, int interval) 
        { 
 
            m_screenWidth = screen.getWidth(); 
            m_screenHeight = screen.getHeight(); 
 
            myBulletImage = mybullet[0].getImage(); 
            eBulletImage = eBullet[0].getImage(); 
            bossBulletImage = bossBullet[0].getImage(); 
 
            m_updateTimer.schedule(this, 0, interval); 
            ClockTag = 0; 
        } 
 
        public void run() 
        { 
            ClockTag++; 
            if (ClockTag % 2 == 0) { 
                SendBulletTag = true; 
                ClockTag = 0; 
            } 
 
            //my bullets move 
            for (int i = 0; i < mybullet.length; i++) { 
                if (mybullet[i].IsShow()) { 
                    mybullet[i].ChangePos(mybullet[i].GetXSpeed(), 0); //move 
 
                    if (mybullet[i].getXPos() >= m_screenWidth) { //out of the screen 
                        mybullet[i].ShowFalse(); 
                    } 
                } 
            } //for 
 
            //enemy plane bullets move and judge whether hit my plane 
            for (int i = 0; i < eBullet.length; i++) { 
                if (eBullet[i].IsShow()) { 
                    eBullet[i].ChangePos( -eBullet[i].GetXSpeed(), 0); //move 
                    if (eBullet[i].getXPos() <= 0) { //out of screen 
                        eBullet[i].ShowFalse(); 
                    } //if 
                    if (Collision(eBullet[i], myplane)) { //hit my plane? 
                        eBullet[i].ShowFalse(); 
                        myplane.ChangeHP( -1); 
                        myplane.SetState(PlaneGameObject.HIT); 
                        if (myplane.getHP() <= 0) { 
                            myplane.SetState(PlaneGameObject.BOMBING); 
                        } 
                    } 
                } //if 
            } //for 
 
            //enemy boss bullets move 
            for (int i = 0; i < bossBullet.length; i++) { 
                if (bossBullet[i].IsShow()) { 
                    bossBullet[i].ChangePos(bossBullet[i].GetXSpeed(), 
                                            bossBullet[i].GetYSpeed()); 
                    if (bossBullet[i].getXPos() < 0 || 
                        bossBullet[i].getYPos() < 0 || 
                        bossBullet[i].getYPos() >= m_screenHeight) { 
                        bossBullet[i].ShowFalse(); 
                    } 
                    if (Collision(bossBullet[i], myplane)) { //hit my plane? 
                        bossBullet[i].ShowFalse(); 
                        myplane.ChangeHP( -1); 
                        myplane.SetState(PlaneGameObject.HIT); 
                        if (myplane.getHP() <= 0) { 
                            myplane.SetState(PlaneGameObject.BOMBING); 
                        } 
                    } 
                } 
            } //for 
        } //void run() 
 
        void paint(Graphics g) 
        { 
            int x, y; 
            //draw my bullets 
            for (int i = 0; i < mybullet.length; i++) { 
                if (mybullet[i].IsShow()) { 
                    x = mybullet[i].getXPos(); 
                    y = mybullet[i].getYPos(); 
                    g.drawImage(myBulletImage, x, y, 
                                Graphics.VCENTER | Graphics.HCENTER); 
                } //if 
            } //for 
 
            //draw enemy plane bullets 
            for (int i = 0; i < eBullet.length; i++) { 
                if (eBullet[i].IsShow()) { 
                    x = eBullet[i].getXPos(); 
                    y = eBullet[i].getYPos(); 
                    g.drawImage(eBulletImage, x, y, 
                                Graphics.VCENTER | Graphics.HCENTER); 
                } //if 
            } //for 
 
            //draw enmey boss bullets 
            for (int i = 0; i < bossBullet.length; i++) { 
                if (bossBullet[i].IsShow()) { 
                    x = bossBullet[i].getXPos(); 
                    y = bossBullet[i].getYPos(); 
                    g.drawImage(bossBulletImage, x, y, 
                                Graphics.VCENTER | Graphics.HCENTER); 
                } //if 
            } //for 
 
        } //void paint() 
    } //end of class BulletScroller 
 
    //class PlaneScroller controls the move of the enemy planes by time 
    class ePlaneScroller 
        extends TimerTask 
    { 
        private final Timer m_updateTimer = new Timer(); 
        private int ClockTag = 0; 
 
        private Random generator = new Random(); 
 
        private final int m_maxX; //最大的横坐标值 
        private final int m_maxY; //最大的纵坐标值 
        private int m_x; 
        private int m_y; 
 
        private Image ExpImage; 
        private Image BossExpImage; 
        private Image BossRedImage; 
        private Image tempImage; 
 
        public ePlaneScroller(Canvas screen, int interval) 
        { 
            m_maxX = screen.getWidth() - 1; 
            m_maxY = screen.getHeight() - 1; 
            m_updateTimer.schedule(this, 200, interval); 
 
            try { 
                ExpImage = Image.createImage("/explosion.png"); 
            } 
            catch (Exception e) { 
                ExpImage = null; 
            } 
            try { 
                BossExpImage = Image.createImage("/bossexplosion.png"); 
            } 
            catch (Exception e) { 
                BossExpImage = null; 
            } 
            try { 
                BossRedImage = Image.createImage("/Boss01_red.PNG"); 
            } 
            catch (Exception e) { 
                BossRedImage = null; 
            } 
        } 
 
        public void run() 
        { 
            int temp; 
            int i, dx, dy; 
 
            ClockTag++; 
            //generate enemy planes 
            for (i = 0; i < ePlane.length; i++) { 
                if (!ePlane[i].IsShow()) { //generate a radom int 
                    temp = (generator.nextInt() % (3 * m_maxY)); 
 
                    if (temp < m_maxY) { //generate a new enemy plane 
                        ePlane[i].ShowTrue(); 
                        ePlane[i].SetPos(m_maxX, temp); //!SetPos not ChangePos 
 
                        temp = (generator.nextInt() % 3 + 1); 
                        ePlane[i].SetValue(temp); //decide plane type 
                    } 
                } 
 
            } 
            // enemy plane flys(change position) 
            for (i = 0; i < ePlane.length; i++) { 
                if (ePlane[i].IsShow() && 
                    ePlane[i].getState() == PlaneGameObject.ALIVE) { 
                    dx = ePlane[i].getXSpeed(); 
                    dy = ePlane[i].getYSpeed(); 
                    switch (ePlane[i].getFlyType()) { 
                        case 1: 
                            ePlane[i].ChangePos( -dx, 0); 
                            break; 
                        case 2: 
                            ePlane[i].ChangePos( -2 * dx, -dy); 
                            break; 
                        case 3: 
                            ePlane[i].ChangePos( -2 * dx, dy); 
                            break; 
                        default: 
                            ePlane[i].ChangePos( -dx, 0); 
                    } 
                    if (ePlane[i].getXPos() <= 0 || ePlane[i].getYPos() <= 0 || 
                        ePlane[i].getYPos() >= m_maxY) { //dismiss it 
                        ePlane[i].ShowFalse(); 
                    } //end if 
                } 
            } //end for 
 
            //enemy planes send bullets 
            for (i = 0; i < ePlane.length; i++) { 
                if (ePlane[i].IsShow() && 
                    ClockTag * (4 - ePlane[i].getID()) % 240 == 0) { 
                    sendBullet(ePlane[i].getXPos(), ePlane[i].getYPos(), 1); 
                } 
            } //for 
 
            //judge ePlane whether hitten 
            for (i = 0; i < ePlane.length; i++) { 
                if (ePlane[i].IsShow()) { 
                    //whether hitten by the bullets? 
                    for (int j = 1; j < mybullet.length; j++) { 
                        if (mybullet[i].IsShow() && 
                            Collision(ePlane[i], mybullet[j])) { 
                            mybullet[j].ShowFalse(); 
                            ePlane[i].SetState(PlaneGameObject.BOMBING); 
                        } //if 
                    } //for j 
                    //whether collaps with my plane 
                    if (Collision(ePlane[i], myplane)) { 
                        ePlane[i].SetState(PlaneGameObject.BOMBING); 
                        myplane.ChangeHP( -1); 
                        myplane.SetState(PlaneGameObject.HIT); 
                        if (myplane.getHP() <= 0) { 
                            myplane.SetState(PlaneGameObject.BOMBING); 
                        } 
                    } 
                } //if 
            } //for i 
 
            //enemy boss send bullets 
            if (eBoss.IsShow() && ClockTag % 100 == 0) { 
                sendBullet(eBoss.getXPos(), eBoss.getYPos(), 2); 
            } 
            //judge whether boss hitten 
            if (eBoss.IsShow()) { 
                for (i = 1; i < mybullet.length; i++) { 
                    if (mybullet[i].IsShow() && Collision(eBoss, mybullet[i])) { 
                        mybullet[i].ShowFalse(); 
                        eBoss.SetState(PlaneGameObject.HIT); 
                        eBoss.ChangeHP( -1); 
                        if (eBoss.getHP() == 0) { 
                            eBoss.SetState(PlaneGameObject.BOMBING); 
                        } 
                    } //if 
                } //for 
            } //if 
 
        } //void run() 
 
        void paint(Graphics g) 
        { 
            int x, y; 
 
            //draw enmey boss 
            if (eBoss.IsShow()) { 
                x = eBoss.getXPos(); 
                y = eBoss.getYPos(); 
                tempImage = eBoss.getImage(); 
 
                switch (eBoss.getState()) { 
                    case PlaneGameObject.ALIVE: 
                        g.drawImage(tempImage, x, y, 
                                    Graphics.VCENTER | Graphics.HCENTER); 
                        break; 
                    case PlaneGameObject.HIT: 
                        g.drawImage(BossRedImage, x, y, 
                                    Graphics.VCENTER | Graphics.HCENTER); 
                        if (eBoss.getHP() > 10) { 
                            eBoss.SetState(PlaneGameObject.ALIVE); 
                        } 
                        break; 
                    case PlaneGameObject.BOMBING: 
                        g.drawImage(BossExpImage, x, y, 
                                    Graphics.VCENTER | Graphics.HCENTER); 
                        eBoss.ShowFalse(); 
                } 
            } //if 
 
            //draw enemy planes 
            for (int i = 0; i < ePlane.length; i++) { 
                if (ePlane[i].IsShow()) { 
                    x = ePlane[i].getXPos(); 
                    y = ePlane[i].getYPos(); 
                    switch (ePlane[i].getState()) { 
                        case PlaneGameObject.ALIVE: 
                            tempImage = ePlane[i].getImage(); 
                            g.drawImage(tempImage, x, y, 
                                        Graphics.VCENTER | Graphics.HCENTER); 
                            break; 
                        case PlaneGameObject.BOMBING: 
                            g.drawImage(ExpImage, x, y, 
                                        Graphics.VCENTER | Graphics.HCENTER); 
                            ePlane[i].ShowFalse(); 
                            break; 
                    } //switch 
                } //if 
            } //for 
 
        } //void paint() 
    } //class ePlaneScroller 
 
    class ImageScroller 
        extends TimerTask 
    { 
        private final Timer m_updateTimer = new Timer(); 
        private Image m_image; 
        private final int m_screenWidth; 
        private final int m_screenHeight; 
        private final int m_imageWidth; 
        private final int m_imageHeight; 
        private final int m_leftOffset; 
        private final int m_topOffset; 
        private int m_x; 
        private int m_y; 
 
        private int ClockTag = 0; 
//	private BackGround bground = new BackGround(1); 
 
        public ImageScroller(Canvas screen, int interval) 
        { 
 
            //m_image = bground.getImage(); 
 
            try { 
                m_image = Image.createImage("/BackGround01.png"); 
            } 
            catch (Exception e) { 
                m_image = null; 
            } 
 
            // calculate all the necessary constants 
            m_screenWidth = screen.getWidth(); 
            m_screenHeight = screen.getHeight(); 
            m_imageWidth = m_image.getWidth(); 
            m_imageHeight = m_image.getHeight(); 
            m_leftOffset = (m_screenWidth - m_imageWidth) / 2; 
            m_topOffset = (m_screenHeight - m_imageHeight) / 2; 
            m_y = m_screenHeight - m_imageHeight; 
            m_x = m_screenWidth; 
 
            m_updateTimer.schedule(this, 0, interval); 
        } 
 
        /** 
             * For each iteration of the scheduler, it updates the vertical position. 
         */ 
        public void run() 
        { 
            // scroll 
            m_x--; 
            ClockTag++; 
            if (ClockTag == 100) { 
                eBoss.ShowTrue(); 
            } 
        } 
 
        /** 
         * Draws the background on the Graphics object specified. 
         * 
         * @param g The Graphics object on which to draw the background. 
         */ 
        public void paint(Graphics g) 
        { 
            // if we have reached the screen height then move back to bottom 
            if (m_x <= 0) { 
                g.drawImage(m_image, m_screenWidth, m_topOffset, 
                            Graphics.TOP | Graphics.RIGHT); 
                m_x = m_screenWidth; 
            } 
            else if (m_x <= m_imageWidth) { 
                g.drawImage(m_image, m_screenWidth + m_x, m_topOffset, 
                            Graphics.TOP | Graphics.RIGHT); 
            } 
 
            g.drawImage(m_image, m_x, m_topOffset, 
                        Graphics.TOP | Graphics.RIGHT); 
        } 
    } //end of class ImageScroller 
 
} //end of class PlaneGameCanvas