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

📄 mangamecanvas.java

📁 该文件主要是为了给要快速度的 了解 java 的 0基础的 人 给予 成功的 快感... 也是 我 对 本站的支持
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package man;

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.rms.RecordStore;

/**
 *主类
 */

public class ManGameCanvas
    extends GameCanvas implements Runnable, CommandListener {

  //--- 定义变量 ----------------------------------------------------------------
  private ManMIDlet manMIDlet; // 应用类对象
  private Command Cmdstart, Cmdrestart, Hsreset; // 开始、重新开始按键
  private int SWidth, SHeight; // 屏幕宽度和高度
  private int KeyState; // 当前按键状态
  private Graphics ManGraphics; // 定义屏幕的画布
  private TiledLayer TLBackground; // 平铺层对象
  private Sprite SpPlane; // 飞机图象
  private ManBullets MBbullets; // 子弹图象
  private NumImgTools TimeFont; // 时间文字
  private Sprite SpExplosion; // 飞机爆炸效果图象
  private Sprite SpBomb; // 炸弹爆炸效果图片
  private Image ImgBombIcon; // 炸弹图标
  private NumImgTools BombFont; // 炸弹个数文字
  private int BombCount; // 炸弹个数
  private Image ImgPowerIcon; // 能量值图标
  private NumImgTools PowerFont; // 能量值个数文字
  private int PowerCount; // 能量值个数
  private boolean useBomb; // 是否使用炸弹
  private Thread ThRunGame; // 线程
  private boolean running; // 当前运行状态
  private boolean gameover; // 程序是否已经结束
  private long GameStartTime; // 游戏开始时间
  private int ExplosionFrame; // 飞机爆炸帧数控制累加器
  private int BombFrame; // 炸弹爆炸帧数控制累加器
  private int gamelevel; // 游戏难度
  private boolean BombOnOff; // 是否屏蔽炸弹
  private boolean gamelevelup; //游戏难度是否增加
  private RecordStore rs; //游戏记录器
  private int hightscore; //游戏最高成绩
  private int GameTime; //游戏时间
  private int TempTime; //临时时间
  private String[] GameOverStr; //结束评语
  private int danger; //危险度
  private int vplane = 3; //飞机速度
  private int BombHortation; //炸弹奖励

  //--- 构造函数 ----------------------------------------------------------------
  protected ManGameCanvas(ManMIDlet manMIDlet) {
    // 调用父类的构造方法,必须这样,否则无法编译
    // 当参数为true则无法重载keyPressed回调
    super(false); //false
    this.manMIDlet = manMIDlet;

    // 添加按键,并开启监听
    addCommand(new Command("退出", Command.EXIT, 1));
    addCommand(Cmdstart = new Command("开始", Command.OK, 1));
    setCommandListener(this);

    SWidth = getWidth(); // 获得设备屏幕宽度
    SHeight = getHeight(); // 获得设备屏幕高度
    running = false; // 当前运行状态
    ThRunGame = null; // 线程初始化

    ManGraphics = getGraphics(); // 获得当前屏幕的画布

    //--- 初始化背景图象 ---
    Image img = ImageTools.getImage("/pic/background.png");
    int backcols = SWidth / img.getWidth() + 1; // 计算横向需要多少图片
    int backrows = SHeight / img.getHeight() + 1; // 计算纵向需要多少图片

    // 初始化平铺层对象,将图象平铺显示
    TLBackground = new TiledLayer(backcols, backrows, img, img.getWidth(),
                                  img.getHeight());

    // 循环平铺操作,x,y为相对坐标
    for (int i = 0; i < backcols * backrows; i++) {
      TLBackground.setCell(i % backcols, i / backcols, 1);
    }

    //--- 初始化小飞机图象 ---
    img = ImageTools.getImage("/pic/plane.png");
    SpPlane = new Sprite(img, 24, 24);

    //--- 初始化记时数字图象 ---
    img = ImageTools.getImage("/pic/numbers_b.png");
    TimeFont = new NumImgTools(ManGraphics, img, 10, 15);

    //--- 初始化子弹图象 ---
    img = ImageTools.getImage("/pic/bullet.png");
    MBbullets = new ManBullets(this, img, SWidth, SHeight);

    //--- 初始化飞机爆炸效果图片 ---
    img = ImageTools.getImage("/pic/explosion.png");
    SpExplosion = new Sprite(img, 32, 32);

    //--- 初始化炸弹爆炸效果图片 ---
    img = ImageTools.getImage("/pic/bomb.png");
    SpBomb = new Sprite(img, 65, 65);

    //--- 初始化炸弹图标 ---
    ImgBombIcon = ImageTools.getImage("/pic/bomb_i.png");

    //--- 初始化炸弹数字图象 ---
    img = ImageTools.getImage("/pic/numbers_s.png");
    BombFont = new NumImgTools(ManGraphics, img, 5, 7);

    //--- 初始化能量值图标 ---
    ImgPowerIcon = ImageTools.getImage("/pic/power_i.png");

    //--- 初始化能量值数字图像 ---
    img = ImageTools.getImage("/pic/numbers_p.png");
    PowerFont = new NumImgTools(ManGraphics, img, 12, 18);

  }

  //--- 线程主运行 --------------------------------------------------------------
  public void run() {
    GameTime = 0;
    TempTime = 0;
    long st = 0, et = 0, diff = 0;
    int rate = 50; // 16-17 帧/每妙
    while (running) {
      st = System.currentTimeMillis();

      ManGraphics.setColor(0, 0, 0); // 清空屏幕
      ManGraphics.fillRect(0, 0, SWidth, SHeight);

      TLBackground.paint(ManGraphics); // 画出背景图象

      if (!gameover) {
        // 画出飞机图象
        SpPlane.paint(ManGraphics);

        // 画出子弹
        MBbullets.paint(ManGraphics, SpPlane.getX(), SpPlane.getY());

        // 游戏操作
        GameKeyInput();

        // 获得游戏时间
        TempTime = (int) (System.currentTimeMillis() - GameStartTime) / 1000;

        // 获得绝妙数,换算成能量值
        PowerCount = (int) MBbullets.getPower() / 5;
        if (GameTime != TempTime) {
          GameTime = TempTime;

          // 每隔20秒奖励一个炸弹
          if (GameTime % 20 == 0 && GameTime != 0 && BombOnOff) {
            ++BombCount;
          }

          // 若有9颗炸弹就强行结束游戏,并难度加1
          if (BombCount == 9) {
            gamelevel++;
            ExplosionFrame = 3;
            gameover = true;
          }

          // 若能量值为9,自动使用炸弹且不减炸弹数
          if (PowerCount >= 9) {
            danger++;
            autoBomb();
          }
        }
        // 若游戏时间达到99秒,强行退出游戏
        if (GameTime == 99) {
          ExplosionFrame = 3;
          gameover = true;
        }
        // 若使用炸弹,显示爆炸效果
        if (useBomb) {
          if (BombFrame < 6) {
            SpBomb.setFrame(++BombFrame);
            SpBomb.paint(ManGraphics);
            MBbullets.BombBullets(SpPlane.getX(), SpPlane.getY());
          }
          else {
            useBomb = false;
          }
        }
      }
      // 如果游戏已经结束
      else {
        if (ExplosionFrame < 3) { // 显示爆炸效果
          SpExplosion.setFrame(++ExplosionFrame);
          SpExplosion.paint(ManGraphics);
        }
        else { // 显示评语

          if (gamelevel == 3) {
            BombHortation = 15;
          }
          else {
            BombHortation = BombCount + 1;
          }
          checkrecord(); // 检查记录

          if (BombCount == 9) {
            GameOverStr = new String[] {
                "这个级别对你没难度", "来更高挑战吧"};
          }
          else if (GameTime < 15) {
            GameOverStr = new String[] {
                "懒得说什么...", ""};
          }
          else if (GameTime < 25) {
            GameOverStr = new String[] {
                "再来一次", "你能做到"};
          }
          else if (GameTime < 40) {
            GameOverStr = new String[] {
                "酷,但还可以更好", "再来"};
          }
          else if (GameTime < 55) {
            GameOverStr = new String[] {
                "非常好", "你是一个真正的勇士"};
          }
          else if (GameTime < 70) {
            GameOverStr = new String[] {
                "你是玩这个游戏的天才", ""};
          }
          else if (GameTime < 85) {
            GameOverStr = new String[] {
                "难以置信", "这个游戏难道是你做的?"};
          }
          else if (GameTime < 99) {
            GameOverStr = new String[] {
                "...... (上帝也无言了) ......", ""};
          }
          else {
            if (gamelevel >= 3) {
              GameOverStr = new String[] {
                  "恭喜你", "可以不用再完这个游戏了"};
            }
            else {
              GameOverStr = new String[] {
                  "棒极了", "重新开始挑战新难度吧"};
              gamelevelup = true;
            }
          }

          // 设置背景颜色为黑色
          ManGraphics.setColor(255, 255, 255);

          // 画出游戏评语
          ManGraphics.drawString(GameOverStr[0], SWidth / 2, SHeight / 2 - 40,
                                 0x10 | 0x1);
          ManGraphics.drawString(GameOverStr[1], SWidth / 2, SHeight / 2 - 20,
                                 0x10 | 0x1);
        }
      }

      // 画出游戏速度文字
      ManGraphics.drawString("V:" + vplane, SWidth / 2 - 8, SHeight - 1,
                             ManGraphics.LEFT | ManGraphics.BOTTOM);

      // 画出游戏难度文字
      ManGraphics.drawString("LV:" + gamelevel, 1, 1,
                             ManGraphics.LEFT | ManGraphics.TOP);

      // 画出游戏最高危险度文字
      ManGraphics.drawString("HI:" + hightscore, SWidth - 4, 1,
                             ManGraphics.RIGHT | ManGraphics.TOP);
      // 画出记时文字
      TimeFont.drawNums(GameTime, (SWidth - 14 * 2) / 2, 10, 2);

      if (BombOnOff) {
        // 画出炸弹图标
        ManGraphics.drawImage(ImgBombIcon, 0, SHeight - 1,
                              ManGraphics.BOTTOM | ManGraphics.LEFT);
        // 画出炸弹个数文字
        BombFont.drawNum(BombCount, ImgBombIcon.getWidth() + 1, SHeight - 8);
      }
      // 画出能量值图标
      ManGraphics.drawImage(ImgPowerIcon, SWidth - 13, SHeight - 1,
                            ManGraphics.BOTTOM | ManGraphics.RIGHT);
      // 画出能量值个数文字
      PowerFont.drawNum(PowerCount, SWidth - 12, SHeight - 19);

      flushGraphics(); // 刷新图象显示,没这句不显示图片

      et = System.currentTimeMillis();
      // 不满足帧数要求,暂停线程至要求帧数
      diff = et - st;
      if (diff < rate) {
        try {
          Thread.sleep(rate - diff);
        }
        catch (InterruptedException ex) {
        }
      }
    }
  }

⌨️ 快捷键说明

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