⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cloud_canvas.java

📁 本光盘是《J2ME无线移动游戏开发》一书的配套光盘
💻 JAVA
字号:
package ch08;

import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class Cloud_Canvas
    extends GameCanvas
    implements Runnable, CommandListener {

  //代表程序是否运行的状态
  boolean running;

  //代表是否碰撞的状态
  boolean ishit;

  //屏幕宽度
  int win_width = getWidth();

  //屏幕高度
  int win_height = getHeight();

  //存储构成飞机动画的各图像帧
  Image plane_img;

  //代表飞机动画的精灵对象
  Sprite plane_sp;

  //飞机每帧图像的宽度
  int img_plane_size = 24;

  //存储构成炸弹动画的各图像帧
  Image bomb_img;

  //代表炸弹动画的精灵对象
  Sprite bomb_sp;

  //炸弹每帧图像的宽度
  int img_bomb_size = 65;

  //存储云的图像对象
  Image cloud_img;

  //存储背景的图像对象
  Image back_img;

  //主MIDlet类实例
  Cloud_MIDlet cm;

  /*
   3.构造器
   */
  public Cloud_Canvas(Cloud_MIDlet cm) {
    super(true);
    this.cm = cm;
    Command exitCommand = new Command("退出", Command.EXIT, 0);
    addCommand(exitCommand);
    setCommandListener(this);

    try {
      plane_img = Image.createImage("/icons/background/plane.png");
      bomb_img = Image.createImage("/icons/background/bomb.png");
      cloud_img = Image.createImage("/icons/background/cloud.png");
      back_img = Image.createImage("/icons/background/cloudbackground.png");
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
    }
    plane_sp = new Sprite(plane_img, img_plane_size, img_plane_size);
    plane_sp.setFrame(0);
    int x = (win_width - img_plane_size) / 2;
    int y = (win_height - img_plane_size) / 2;
    plane_sp.setPosition(x, y);

    bomb_sp = new Sprite(bomb_img, img_bomb_size, img_bomb_size);
    bomb_sp.setFrame(0);

    start();
  }

  /*
   4.启动线程
   */
  public void start() {
    running = true;
    Thread t = new Thread(this);
    t.start();
  }

  /*
   5.控制进程
   */
  public void run() {
    Graphics g = getGraphics();
    long st = 0, et = 0, diff = 0;
    //控制每秒帧数,即动画快慢
    int rate = 50;
    while (running) {
      st = System.currentTimeMillis();
      GameKeyInput();
      render(g);
      et = System.currentTimeMillis();
      //避免刷新过快,暂停线程至要求帧数
      diff = et - st;
      if (diff < rate) {
        try {
          Thread.sleep(rate - diff);
        }
        catch (InterruptedException ex) {
          stop();
        }
      }

    }
  }

  /*
   6.响应按键
   */
  private void GameKeyInput() {
    //保证左右移动停止后,恢复正向图像帧
    plane_sp.setFrame(0);
    int KeyState = getKeyStates(); // 获得当前按键状态
    // 根据按键状态,飞机图象做相对移动,并判断是否超出屏幕边界
    if ( (KeyState & UP_PRESSED) != 0) { // 上
      if (plane_sp.getY() - 3 < 0) {
        plane_sp.move(0, 0 - plane_sp.getY()); //出边界的处理
      }
      else {
        plane_sp.move(0, -3); //正常处理
      }
      plane_sp.setFrame(0);
    }
    if ( (KeyState & DOWN_PRESSED) != 0) { // 下
      if (plane_sp.getY() + 3 + plane_sp.getHeight() > win_height) {
        plane_sp.move(0, win_height - plane_sp.getY() - plane_sp.getHeight());
      }
      else {
        plane_sp.move(0, 3);
      }
      plane_sp.setFrame(0);
    }
    if ( (KeyState & LEFT_PRESSED) != 0) { // 左
      if (plane_sp.getX() - 3 < 0) {
        plane_sp.move(0 - plane_sp.getX(), 0);
      }
      else {
        plane_sp.move( -3, 0);
      }
      plane_sp.setFrame(1);
    }
    if ( (KeyState & RIGHT_PRESSED) != 0) { // 右
      if (plane_sp.getX() + 3 + plane_sp.getWidth() > win_width) {
        plane_sp.move(win_width - plane_sp.getX() - plane_sp.getWidth(), 0);
      }
      else {
        plane_sp.move(3, 0);
      }
      plane_sp.setFrame(2);
    }

  }

  /*
   7.实现绘制
   */
  private void render(Graphics g) {
    g.setColor(0xffffff);
    g.fillRect(0, 0, win_width, win_height);
    g.drawImage(back_img, 0, 0, 0);
    g.drawImage(cloud_img, 20, 20, 0);
    g.drawImage(cloud_img, 90, 50, 0);
    g.drawImage(cloud_img, 30, 120, 0);
    g.drawImage(cloud_img, 120, 110, 0);
    //处理碰撞
    ishit = plane_sp.collidesWith(cloud_img, 20, 20, true) ||
        plane_sp.collidesWith(cloud_img, 90, 50, true) ||
        plane_sp.collidesWith(cloud_img, 30, 120, true) ||
        plane_sp.collidesWith(cloud_img, 120, 110, true);
    if (ishit) {
      bomb_sp.setPosition(plane_sp.getX() -
                          (img_bomb_size - img_plane_size) / 2,
                          plane_sp.getY() -
                          (img_bomb_size - img_plane_size) / 2);
      bomb_sp.nextFrame();
      bomb_sp.paint(g);
    }
    else {
      plane_sp.paint(g);
    }

    flushGraphics();
  }

  /*
   8.结束线程
   */
  public void stop() {
    running = false;
  }

  /*
   9.响应按钮事件
   */
  public void commandAction(Command c, Displayable s) {
    if (c.getCommandType() == Command.EXIT) {
      cm.quitApp();
    }
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -