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

📄 gamecanvas.java

📁 一个不错的学习游戏,很适合初学者! 希望大家喜欢!
💻 JAVA
字号:
package qian;

import javax.microedition.lcdui.*;
import java.util.*;
import javax.microedition.rms.*;
import java.io.*;

/**
 */

public class GameCanvas
    extends Canvas {
  Graphics g;
  public Graphics bg = null; //双缓存画布
  private Qianmain mainScreen; //主屏幕
  private int width, height; //屏幕宽高
  String[] mu = {
      "开始游戏", "退出游戏", "玩家战绩", "游戏说明", "开发小组"};
  int curMenu;
  QianTing temp;
  Image back, img, mjl, mjr;
  int score;
  int status = 1; //菜单状态
  private Image bufferImg = null; //双缓存图片
  private Ship sp = null; //船
  Vector qts = new Vector();
  private Timer timer;
  RecordStore rs;
  Vector playerList = new Vector();

  public GameCanvas(Qianmain mainScreen) {
    this.mainScreen = mainScreen;
    width = this.getWidth();
    height = this.getHeight();
System.out.println(""+width);
    System.out.println(""+height);
    bufferImg = Image.createImage(width, height);

    try {
      bg = bufferImg.getGraphics();
      back = Image.createImage("/res/bac.png");
      img = Image.createImage("/res/cover.png");
      mjl = Image.createImage("/res/jl.png");
      mjr = Image.createImage("/res/jr.png");
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    sp = new Ship(this, width, height);
    openDb("qianting");
    getPlayerList();
  }

  public void startGame() {
    timer = new Timer();
    score = 0;
    sp.booms.removeAllElements();
    qts.removeAllElements();
    timer.schedule(new QianTingCreator(), 300, 105 * 30);
    timer.schedule(new QianTingSetter(), 5, 50);

  }

  public void stopGame() {
    timer.cancel();
    timer = null;

  }

  public void gameOver() {
    stopGame();
    status = 3;
    repaint();
  }

  protected void paint(Graphics g) {
    switch (status) {
      case 1: //菜单
        g.drawImage(img, 0, 0, Graphics.TOP | Graphics.LEFT);
        g.drawImage(mjl, 30, 120, Graphics.TOP | Graphics.LEFT);
        g.drawImage(mjr, 110, 120, Graphics.TOP | Graphics.LEFT);
        g.setColor(255, 0, 0);
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                               Font.SIZE_LARGE));
        g.drawString(mu[curMenu], 65, 140, Graphics.TOP | Graphics.LEFT);
        break;
      case 2: //游戏
        showGameCanvas(g);
        break;
      case 3: //game over
        bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
        bg.setColor(255, 0, 0);
        bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                                Font.SIZE_LARGE));
        bg.drawString("Game Over", width / 2, 25,
                      Graphics.HCENTER | Graphics.TOP);
        bg.drawString("得分:" + score, width / 2, 45,
                      Graphics.HCENTER | Graphics.TOP);
        g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);

        break;
      case 4: //说明
        g.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                               Font.SIZE_LARGE ));
        g.setColor(255, 0, 0);
        g.drawString("军舰以左右键控制方向", 5, 50, Graphics.LEFT | Graphics.TOP);
        g.drawString("当军舰被击中游戏结束", 5, 65, Graphics.LEFT | Graphics.TOP);
        break;
      case 5: //玩家战绩
        bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
        bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                                Font.SIZE_LARGE ));
        int yw = 10;
        bg.setColor(255, 0, 0);
        for (int i = 0; i < playerList.size(); i++) {
          String s = (String) playerList.elementAt(i);

          bg.drawString(s, width / 2, yw + i * 15,
                        Graphics.TOP | Graphics.HCENTER);
        }
        g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);
        break;
      case 6: //开发小组
        g.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                               Font.SIZE_LARGE ));
        g.setColor(255, 0, 0);
        g.drawString("监制:陈万飞", 5, 50, Graphics.LEFT | Graphics.TOP);
        g.drawString("主程序:王昉铭", 5, 65, Graphics.LEFT | Graphics.TOP);
        g.drawString("主美工 :张晓磊", 5, 80, Graphics.LEFT | Graphics.TOP);
        g.drawString("程序:王宇 李国栋", 5, 100, Graphics.LEFT | Graphics.TOP);
        break;

    }

  }

  public void showGameCanvas(Graphics g) {
    g.setColor(255,255,255) ;
    g.fillRect(0,0,this.width ,this.height ) ;
    bg.drawImage(back, 0, 0, Graphics.TOP | Graphics.LEFT);
    sp.reShip();

    for (int i = 0; i < qts.size(); i++) {
      QianTing temp = (QianTing) qts.elementAt(i);
      temp.paint(bg);

    }
    bg.drawString("得分:" + score, 0, 0, Graphics.LEFT | Graphics.TOP);

    g.drawImage(bufferImg, 0, 0, Graphics.TOP | Graphics.LEFT);

  }

  public void closeDb() {

    try {
      rs.closeRecordStore();
    }
    catch (Exception ex) {

    }

  }

  public void openDb(String rsname) {
    try {
      rs = RecordStore.openRecordStore(rsname, true);

    }
    catch (Exception e) {
      return;
    }

  }

  public void getPlayerList() {

    try {
      for (int i = 1; i <= rs.getNumRecords(); i++) {
        byte[] data = rs.getRecord(i);
        DataInputStream doSteam = new DataInputStream(new ByteArrayInputStream(
            data));
        String name = doSteam.readUTF();
        int record = doSteam.readInt();

        playerList.addElement(name + ":" + record);
        doSteam.close();
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void addPlayer(String name, int sc) {

    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    DataOutputStream doSteam = new DataOutputStream(bo);
    try {
      doSteam.writeUTF(name);
      doSteam.writeInt(sc);
      byte data[] = bo.toByteArray();
      rs.addRecord(data, 0, data.length);
      doSteam.close();

    }
    catch (Exception e) {
      e.printStackTrace();
    }

    if (playerList.size() < 5) {
      playerList.addElement(name + ":" + score);
    }
    else {
      playerList.setElementAt(name + ":" + score, 4);
    }

  }

  /**
   * keyPressed
   *
   * @param keyCode int
   * @todo Implement this javax.microedition.lcdui.Canvas method
   */
  protected void keyPressed(int keyCode) {
    int k = this.getGameAction(keyCode);
    switch (status) {
      case 1: //主菜单
        switch (k) {
          case Canvas.LEFT:
            curMenu--;
            if (curMenu < 0) {
              curMenu = 4;
            }
            break;
          case Canvas.RIGHT:
            curMenu++;
            if (curMenu > 4) {
              curMenu = 0;
            }
            break;
          case Canvas.FIRE:
            switch (curMenu) {
              case 0: //新游戏
                startGame();
                status = 2;

                break;
              case 1: //退出游戏
                Qianmain.quitApp();
                break;
              case 2: //玩家战绩
                status = 5;


                break;
              case 3: //说明
                status = 4;
                break;

              case 4: //开发小组
                status = 6;
                break;

            }

        }
        repaint();
        break;
      case 2: //控制船
        switch (k) {
          case Canvas.LEFT:

            sp.MoveShip(0);
            break;
          case Canvas.RIGHT:

            sp.MoveShip(1);
            break;

          case Canvas.FIRE:
            sp.fire();
            break;
        }

        break;
      case 3: //game over
        InputForm iform = new InputForm(this);
        Qianmain.instance.setScreen(iform);
        if (k == Canvas.FIRE) {
          status = 1;
        }

        break;
      case 4:
      case 6:
      case 5:
        if (k == Canvas.FIRE) {
          status = 1;
        }
        repaint();

    }

  }

  /**
   * keyReleased
   *
   * @param keyCode int
   * @todo Implement this javax.microedition.lcdui.Canvas method
   */
  protected void keyReleased(int keyCode) {
    sp.StopShip();
  }

  class QianTingCreator
      extends TimerTask {
    public void run() {
      qts.addElement(new QianTing(GameCanvas.this));
    }
  }

  class QianTingSetter
      extends TimerTask {
    public void run() {

      for (int i = 0; i < qts.size(); i++) {
        QianTing temp = (QianTing) qts.elementAt(i);
        if (temp.direct == 0) {
          temp.x += 2;
        }
        else {
          temp.x -= 2;
        }

        if(temp.isBoomed){
          temp.fireCount++;
          if(temp.fireCount>2){
             temp.type=-100;
          }
        }

        //发射boom
        if (GameCanvas.this.sp.x < temp.x && temp.x < GameCanvas.this.sp.x + 50) {
          if (temp.isBoomed == false&&temp.type==1) {
            temp.addBoom(temp);
          }

        }

        //移动发射的boom
        for (int j = 0; j < temp.booms.size(); j++) {
          Boom2 b2 = (Boom2) temp.booms.elementAt(j);
          b2.y -= 2;
          if (b2.y < GameCanvas.this.sp.y + 10) {
            temp.booms.removeElement(b2);
          }

          if (b2.crash(GameCanvas.this.sp)) {
            gameOver();
          }

        }



        if (temp.x > GameCanvas.this.getWidth() || temp.x < -temp.pic1.getWidth()) {
          qts.removeElement(temp);

        }


      }
      GameCanvas.this.repaint();
    }

  }

}

⌨️ 快捷键说明

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