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

📄 fight_canvas.java

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

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

public class Fight_Canvas
    extends GameCanvas
    implements Runnable, CommandListener {

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

  //存储构成动画的各图像帧
  Image img0, img1;

  //代表动画的精灵对象
  Sprite sp0, sp1;

  //动画播放序列
  int s0[] = {
      0, 1};
  int s1[] = {
      0, 1};

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

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

  //每帧图像的宽度
  int img_width0 = 115;
  int img_width1 = 122;

  //每帧图像的高度
  int img_height0 = 85;
  int img_height1 = 85;

  //图像X坐标
  int x0, x1;

  //图像Y坐标
  int y0, y1;

  //打中标志
  boolean hit;

  //是否采用象素级判断
  boolean pixelLevel = true;

  //主MIDlet类实例
  Fight_MIDlet fm;

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

    try {
      img0 = Image.createImage("/icons/background/man0.png");
      img1 = Image.createImage("/icons/background/man1.png");
    }
    catch (IOException e) {
      System.out.println(e.getMessage());
    }
    sp0 = new Sprite(img0, img_width0, img_height0);
    sp0.setFrameSequence(s0);
    sp0.defineReferencePixel(img_width0 / 2, 0);
    x0 = img_width0 / 2;
    y0 = (win_height - img_height0) / 2;
    sp0.setRefPixelPosition(x0, y0);
    sp0.move( -20, 0);

    sp1 = new Sprite(img1, img_width1, img_height1);
    sp1.setFrameSequence(s1);
    sp1.defineReferencePixel(img_width1 / 2, 0);
    x1 = win_width - img_width1 / 2;
    y1 = (win_height - img_height1) / 2;
    sp1.setRefPixelPosition(x1, y1);
    sp1.move(20, 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 = 120;
    while (running) {
      st = System.currentTimeMillis();
      render(g);
      GameKeyInput();
      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);
    sp0.nextFrame();
    if (!hit) {
      sp1.nextFrame();
    }
    sp1.paint(g);
    sp0.paint(g);

    flushGraphics();
  }

  /*
   7.响应按键
   */
  private void GameKeyInput() {
    int KeyState = getKeyStates();

    if ( (KeyState & LEFT_PRESSED) != 0) {
      //恢复行走序列
      sp0.setFrameSequence(null);
      int temp[] = {
          0, 1};
      s0 = temp;
      sp0.setFrameSequence(s0);
      //翻转图像
      sp0.setTransform(Sprite.TRANS_MIRROR);
      //处理超出屏幕左边界
      if (sp0.getRefPixelX() - sp0.getWidth() / 2 < 0) {
        sp0.move(0 - sp0.getX() - 20, 0);
      }
      else {
        sp0.move( -5, 0);
      }
    }
    if ( (KeyState & RIGHT_PRESSED) != 0) {
      //恢复行走序列
      sp0.setFrameSequence(null);
      int temp[] = {
          0, 1};
      s0 = temp;
      sp0.setFrameSequence(s0);
      //恢复翻转图像
      sp0.setTransform(Sprite.TRANS_NONE);
      //处理超出屏幕右边界
      if (sp0.getRefPixelX() + sp0.getWidth() / 2 - 20 > win_width) {
        sp0.move( -0, 0);
      }
      else {
        sp0.move(5, 0);
      }
    }
    if ( (KeyState & FIRE_PRESSED) != 0) {
      //设置打拳序列
      sp0.setFrameSequence(null);
      int temp[] = {
          2, 3, 4};
      s0 = temp;
      sp0.setFrameSequence(s0);
      //检测是否打到士兵
      if (sp0.collidesWith(sp1, pixelLevel)) {
        hit = true;
        sp1.setFrameSequence(null);
        sp1.setFrame(5);
      }
    }
    if ( (KeyState & DOWN_PRESSED) != 0) {
      if (pixelLevel) {
        pixelLevel = false;
      }
      else {
        pixelLevel = true;
      }
    }

  }

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

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

}

⌨️ 快捷键说明

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