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

📄 rabbit_canvas.java

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

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

public class Rabbit_Canvas
    extends GameCanvas
    implements Runnable, CommandListener {

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

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

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

  //存储构成兔子动画的各图像帧
  Image rabbit_img;

  //代表兔子动画的精灵对象
  Sprite rabbit_sp;

  //兔子动画播放序列
  int fs[][] = {
      {
      0, 1, 2, 3}
      , {
      4, 5, 6, 7}
      , {
      8, 9, 10, 11}
      , {
      12, 13, 14, 15}
  };

  //每帧兔子图像的宽高
  int img_rabbit_width = 36;
  int img_rabbit_height = 50;

  //代表兔子所处的方位,0、1、2、3分别代表上下左右方向。
  int dir = 0;

  //存储构成草地背景的各图像帧
  Image grass_img;

  //代表草地背景
  TiledLayer tlg;

  //每帧草图像的宽高
  int img_grass_size = 16;

  //存储构成爆炸的各图像帧
  Image expl_img;

  //代表爆炸动画的精灵对象
  Sprite expl_sp;

  //每帧爆炸图像的宽高
  int img_expl_size = 32;

  //存储子弹图像帧
  Image bullet_img;

  //代表子弹的精灵对象
  Sprite bullet_sp[] = new Sprite[20];

  //子弹图像的宽高
  int img_bullet_size = 6;

  //绘制上下文
  Graphics g = getGraphics();

  //主MIDlet类实例
  Rabbit_MIDlet rm;

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

    try {
      rabbit_img = Image.createImage("/icons/background/rabbit.png");
      grass_img = Image.createImage("/icons/background/grass.png");
      expl_img = Image.createImage("/icons/background/explosion.png");
      bullet_img = Image.createImage("/icons/background/bullet.png");
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
    }
    // 计算横向需要多少图片
    int backcols = win_width / img_grass_size + 1;
    // 计算纵向需要多少图片
    int backrows = win_height / img_grass_size + 1;
    //铺草地
    tlg = new TiledLayer(backcols, backrows, grass_img, img_grass_size,
                         img_grass_size);
    Random r = new Random();
    for (int i = 0; i < backcols * backrows; i++) {
      int n = (r.nextInt() >>> 1) % 5 + 1;
      tlg.setCell(i % backcols, i / backcols, n);
    }
    //初始化兔子
    rabbit_sp = new Sprite(rabbit_img, img_rabbit_width, img_rabbit_height);
    rabbit_sp.setFrameSequence(fs[2]);
    rabbit_sp.setFrame(0);
    rabbit_sp.setPosition( (win_width - img_rabbit_width) / 2,
                          (win_height - img_rabbit_height) / 2);
    rabbit_sp.defineCollisionRectangle(0, 0, 36, 10);
    //初始化爆炸
    expl_sp = new Sprite(expl_img, img_expl_size, img_expl_size);
    //初始化子弹
    for (int i = 0; i < bullet_sp.length; i++) {
      bullet_sp[i] = new Sprite(bullet_img, img_bullet_size, img_bullet_size);
      bullet_sp[i].setPosition( (win_width - img_bullet_size) / 2,
                               (win_height - img_bullet_size) / 2);

    }

    start();

  }

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

  /*
   5.控制进程
   */
  public void run() {
    long st = 0, et = 0, diff = 0;
    //控制每秒帧数,即动画快慢
    int rate = 150;

    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() {
    int KeyState = getKeyStates(); // 获得当前按键状态
    //判断是否超出屏幕边界
    if ( (KeyState & UP_PRESSED) != 0) { // 上
      rabbit_sp.setFrameSequence(fs[0]);
      if (rabbit_sp.getY() - 3 < 0) {
        rabbit_sp.move(0, 0 - rabbit_sp.getY()); //出边界的处理
      }
      else {
        rabbit_sp.move(0, -3); //正常处理
      }
    }
    if ( (KeyState & DOWN_PRESSED) != 0) { // 下
      rabbit_sp.setFrameSequence(fs[2]);
      if (rabbit_sp.getY() + 3 + rabbit_sp.getHeight() > win_height) {
        rabbit_sp.move(0, win_height - rabbit_sp.getY() - rabbit_sp.getHeight());
      }
      else {
        rabbit_sp.move(0, 3);
      }
    }
    if ( (KeyState & LEFT_PRESSED) != 0) { // 左
      rabbit_sp.setFrameSequence(fs[1]);
      if (rabbit_sp.getX() - 3 < 0) {
        rabbit_sp.move(0 - rabbit_sp.getX(), 0);
      }
      else {
        rabbit_sp.move( -3, 0);
      }
    }
    if ( (KeyState & RIGHT_PRESSED) != 0) { // 右
      rabbit_sp.setFrameSequence(fs[3]);
      if (rabbit_sp.getX() + 3 + rabbit_sp.getWidth() > win_width) {
        rabbit_sp.move(win_width - rabbit_sp.getX() - rabbit_sp.getWidth(), 0);
      }
      else {
        rabbit_sp.move(3, 0);
      }
    }

  }

  /*
   7.实现绘制
   */
  private void render(Graphics g) {
    //绘制背景
    g.setColor(0x000000);
    g.fillRect(0, 0, win_width, win_height);
    tlg.paint(g);
    //处理碰撞
    for (int i = 0; i < bullet_sp.length; i++) {
      if (rabbit_sp.collidesWith(bullet_sp[i], true)) {
        expl_sp.setPosition(rabbit_sp.getX() -
                            (img_expl_size - img_rabbit_width) / 2,
                            rabbit_sp.getY() -
                            (img_expl_size - img_rabbit_height) / 2);
        expl_sp.nextFrame();
        expl_sp.paint(g);
      }
      else {
        rabbit_sp.nextFrame();
        rabbit_sp.paint(g);
      }

    }
    //绘制子弹
    Random r = new Random();
    for (int i = 0; i < bullet_sp.length; i++) {
      int n = (r.nextInt() >>> 1) % 4;
      switch (n) {
        case 0:
          bullet_sp[i].move( -10, 0);
          break;
        case 1:
          bullet_sp[i].move(10, 0);
          break;
        case 2:
          bullet_sp[i].move(0, -10);
          break;
        case 3:
          bullet_sp[i].move(0, 10);
          break;
      }
      bullet_sp[i].paint(g);
    }

    flushGraphics();
  }

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

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

}

⌨️ 快捷键说明

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