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

📄 view_canvas.java

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

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

public class View_Canvas
    extends GameCanvas
    implements Runnable, CommandListener {

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

  //存储构成羊动画的各图像帧
  Image sheep_img;

  //存储构成背景的各图像帧
  Image grass_img, fence_img;

  //代表羊群动画的精灵对象
  Sprite sp[];

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

  //代表草地背景
  TiledLayer tlg;

  //代表栅栏背景
  TiledLayer tlf;

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

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

  //每帧羊图像的宽高
  int img_sheep_size = 15;

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

  //每帧栅栏图像的宽高
  int img_fence_size = 16;

  //代表可视窗体移动方向,0、1分别代表左、右
  int dir = 1;

  //代表可视窗体的x坐标
  int x = 0;

  //代表可视窗体的移动跨度
  int span = 5;

  //代表背景是屏幕宽度的倍数。
  int num = 2;

  //背景行、列数
  int backcols, backrows;

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

  //产生随机数
  Random r = new Random();

  //层管理器
  LayerManager lm = new LayerManager();

  //主MIDlet类实例
  View_MIDlet vm;

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

    try {
      sheep_img = Image.createImage("/icons/background/sheep.png");
      grass_img = Image.createImage("/icons/background/grass.png");
      fence_img = Image.createImage("/icons/background/fence.png");
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
    }

    // 计算横向需要多少图片
    backcols = win_width / img_grass_size * num;
    // 计算纵向需要多少图片
    backrows = win_height / img_grass_size + 1;
    //铺草地
    tlg = new TiledLayer(backcols, backrows, grass_img, img_grass_size,
                         img_grass_size);
    for (int i = 0; i < backcols * backrows; i++) {
      int n = (r.nextInt() >>> 1) % 5 + 1;
      tlg.setCell(i % backcols, i / backcols, n);
    }

    //铺栅栏
    tlf = new TiledLayer(backcols, backrows, fence_img, img_fence_size,
                         img_fence_size);
    //铺外上栅栏
    for (int i = 0; i < backcols; i++) {
      tlf.setCell(i, 0, 1);
    }
    //铺外下栅栏
    for (int i = 0; i < backcols; i++) {
      tlf.setCell(i, backrows - 2, 1);
      tlf.setCell(i, backrows - 1, 1);
    }
    //铺外左栅栏
    for (int i = 0; i < backrows; i++) {
      tlf.setCell(0, i, 1);
    }
    //铺外右栅栏
    for (int i = 0; i < backrows; i++) {
      tlf.setCell(backcols - 1, i, 1);
    }

    //初始化羊群
    sp = new Sprite[backrows * backcols];
    for (int i = 0; i < backrows; i++) {
      sp[i] = new Sprite(sheep_img, img_sheep_size, img_sheep_size);
      lm.append(sp[i]);
      sp[i].setFrameSequence(fs[ (r.nextInt() >>> 1) % 3]);
      sp[i].setFrame(0);
      sp[i].setPosition( (r.nextInt() >>> 1) % (backcols - 2) * img_grass_size,
                        (r.nextInt() >>> 1) % (backrows - 2) * img_grass_size);
    }

    //初始化层管理
    lm.append(tlf);
    lm.append(tlg);
    lm.setViewWindow(0, 0, win_width, win_height);
    lm.paint(g, 0, 0);
    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 = 250;

    while (running) {
      st = System.currentTimeMillis();
      render(g);
      et = System.currentTimeMillis();
      //避免刷新过快,暂停线程至要求帧数
      diff = et - st;
      if (diff < rate) {
        try {
          Thread.sleep(rate - diff);
        }
        catch (InterruptedException ex) {
          stop();
        }
      }

    }
  }

  /*
   6.实现绘制
   */
  private void render(Graphics g) {
    //绘制背景
    g.setColor(0x000000);
    g.fillRect(0, 0, win_width, win_height);
    for (int i = 0; i < backrows; i++) {
      sp[i].nextFrame();
    }

    switch (dir) {
      case 0:
        if (x < span) {
          x = 0;
          dir = 1;
        }
        else {
          x = x - span;
        }
        break;
      case 1:
        if (x > backcols / 2 * img_grass_size - span * 2) {
          x = backcols / 2 * img_grass_size - span * 2;
          dir = 0;
        }
        else {
          x = x + span;
        }
        break;
    }
    lm.setViewWindow(x, 0, win_width, win_height);
    lm.paint(g, 0, 0); //坐标相对于绘制上下文原点
    flushGraphics();
  }

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

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

}

⌨️ 快捷键说明

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