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

📄 hscanvas.java

📁 一个简单的迷宫类型游戏 一个小女孩在森林里面找独角兽
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.rms.*;
import java.io.InputStream;
import java.io.PrintStream;

public class HSCanvas extends GameCanvas implements Runnable {
  private Random        rand;
  private Display       display;
  private boolean       sleeping;
  private long          frameDelay;
  private LayerManager  layers;
  private int           xView, yView;
  private TiledLayer    waterLayer;
  private TiledLayer    landLayer;
  private int           waterDelay;
  private int[]         waterTile = { 1, 3 };
  private Image         infoBar;
  private Image         screen;
  private Sprite        playerSprite;
  private RunSprite[]   unicornSprite = new RunSprite[2];
  private DriftSprite[] boxlSprite = new DriftSprite[2];
  private DriftSprite[] ballSprite = new DriftSprite[5];
  private DriftSprite[] flowerSprite = new DriftSprite[5];
  private ChaseSprite[] ghostSprite = new ChaseSprite[5];
  private Player        musicPlayer;
  private Player        rescuePlayer;
  private Player        ballPlayer;
  private Player        gameoverPlayer;
  private boolean       gameOver;
  private int           energy, unicornSaved;
  int lastCollide = -1;
  private int            score;
  private int[]          hiScores = new int[5];

  public HSCanvas(Display d)
 
       

{
    super(true);
    display = d;

    // 初始化随机数生成器
    rand = new Random();

    // 设置帧率
    frameDelay = 33;
  }
  
  public void start() {    
    display.setCurrent(this);

    // 读取最高得分
    readHiScores();

    // 新建信息栏图像、水域图层和陆地图层
    try {
      infoBar = Image.createImage("/InfoBar.png");
      waterLayer = new TiledLayer(24, 24, Image.createImage("/Water.png"), 32, 32);
      landLayer = new TiledLayer(24, 24, Image.createImage("/plants.png"), 32, 32);
      screen = Image.createImage("/screen.png");
    } catch (IOException e) {}

    // 初始化水域图层
    waterLayer.createAnimatedTile(1);
    waterLayer.createAnimatedTile(3);
    int[] waterMap = {
      0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   1,  1,  1,  1,  1,  1,  1,  1,  
       1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   1,  1,  1,  1,  1,  1,  1,  1,  
      1,  1, -1,  1, -1,  1,  1, -1, -2,  1, -1,  1,  1, -1,  1,  1, -1,  1,  1, -1,  1, -2,   1,  1,
      1,  1,  1,  1, -1,  1, -1,  1,  1, -1,  1,  1, -2,  1, -1,  1,  1, -2,  1,  1, -1,  1,   1,  1,
       1,  1, -2, -1,  1, -1,  1, -2,  1,  1, -2,  1,  1, -1,  1, -2,  1,  1, -2,  1,  1, -1,   1,  1,
      1,  1,-1,  1, -1,  1, -1,  1,  1, -1,  1,  1, -1,  1, -1,  1, -1, -1,  1,  1, -1,  1,   1,  1,
      1,  1,  1, -1,  1, -1,  1,  1, -1,  1,  1, -1,  1, -2,  1, -1,  1,  1, -1,  1,  1,  1,   1,  1,
      1,  1, -1,  1, -1,  1,  1, -1,  1,  1, -1,  1,  1, -1,  1,  1, -1,  1,  1, -1,  1, -1,   1,  1,
       1,  1, 1, -1, -2,  1,  1,  1, -1,  1,  1, -2, -1,  1,  1, -2,  1,  1, -2,  1, -1, -2,   1,  1,
       1,  1, -2,  1,  1,  1, -1, -2,  1, -1,  1, -1,  1,  1, -1,  1, -1,  1, -1,  1,  1,  1,  1,  1,
       1,  1, 1,  1,  1, -1,  1,  1, -1,  1,  1,  1, -2, -1,  1,  1,  1, -1,  1, -1,  1, -1,   1,  1,
       1,  1, 1, -1, -2,  1, -1, -2,  1, -2, -1,  1, -1,  1, -1, -1, -1,  1, -1,  1, -1,  1,   1,  1,
       1,  1, -2,  1,  1,  1,  1,  1,  1,  1, -1, -1,  1, -1,  1,  1,  1, -2,  1,  1, -2, -1,  1,  1,
      1,  1, -1,  1, -1, -1,  1, -1, -2, -1,  1,  1, -2,  1, -1,  1, -1,  1,  1, -1,  1,  1,   1,  1,
       1,  1,  1, -2,  1,  1, -1,  1,  1,  1, -1, -1,  1, -1,  1,  1,  1,  1, -1,  1,  1, -1,   1,  1,
       1,  1, -1,  1,  1, -2,  1, -2, -1,  1, -1,  1, -1,  1,  1, -1, -2,  1, -1,  1, -2,  1,   1,  1,
      1,  1, -2,  1, -1,  1, -1,  1,  1, -1,  1, -1,  1, -2, -1,  1,  1, -1,  1, -1,  1,  1,  1,  1,
       1,  1,  1,  1, -1,  1,  1, -1,  1,  1, -2,  1, -1,  1,  1,  1, -1,  1, -1,  1, -1, -1,  1,  1,
       1,  1,  1, -1,  1, -2,  1, -2, -1,  1,  1, -1,  1, -1,  1, -1,  1, -1, -2, -1,  1,  1,   1,  1,
      1,  1, -1,  1, -1,  1,  1, -1,  1, -2, -1,  1, -2, -1, -2,  1, -1, -2,  1, -1, -2,  1,   1,  1,
       1,  1,  1, -1,  1, -1,  1, -1,  1, -1,  1,  1, -1,  1, -1,  1, -1,  1, -1,  1,  1, -1,  1,  1,
       1,  1, -2, -1,  1,  1, -2,  1, -1,  1, -1, -2,  1, -2,  1, -1, -2,  1,  1, -2, -1,  1,   1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   1,  1,  1,  1,  1,  1,  1,  1,  
        1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   1,  1,  1,  1,  1,  1,  1,  1, 
    };
    for (int i = 0; i < waterMap.length; i++) {
      int column = i % 24;
      int row = (i - column) / 24;
      waterLayer.setCell(column, row, waterMap[i]);
    }

    // 初始化水域动画延迟
    waterDelay = 0;

    // 初始化陆地图层
    int[] landMap = { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 20, 20, 20, 20, 20, 20, 20 ,
20, 20, 20, 0, 20, 0, 0, 0, 20, 0, 20, 0, 0, 0, 20, 20, 
20, 0, 20, 20, 20, 20, 20, 20 ,
 20, 20, 20, 0, 20, 20, 0, 20, 20, 0, 20, 0, 0, 0, 20, 0, 
0, 0, 20, 0, 0, 20, 20, 20 ,
 20, 20, 20, 0, 0, 20, 0, 0, 0, 0, 20, 0, 20, 20, 20, 20, 
20, 0, 20, 20, 20, 20, 20, 20 ,
 20, 20, 20, 0, 20, 20, 0, 20, 20, 20, 20, 0, 20, 0, 0, 20, 
0, 0, 20, 0, 0, 20, 20, 20 ,
 20, 20, 20, 0, 20, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 20, 20, 20, 20 ,
 20, 20, 20, 0, 20, 20, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 
20, 0, 20, 0, 20, 20, 20, 20 ,
 20, 20, 20, 0, 0, 20, 0, 0, 0, 0, 20, 0, 1, 2, 3, 0, 
0, 0, 20, 0, 20, 0, 0, 20 ,
 20, 20, 20, 0, 0, 20, 0, 20, 0, 0, 0, 0, 5, 6, 7, 0, 
0, 0, 0, 0, 0, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 0, 20, 0, 20, 20, 0, 9, 10, 11, 20, 
20, 0, 0, 20, 0, 20, 20, 20 ,
 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 
20, 0, 0, 20, 0, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 0, 0, 
20, 0, 0, 20, 0, 20, 20, 20 ,
 20, 20, 20, 20, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
20, 0, 0, 20, 0, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 20, 20, 20, 20, 20, 20, 0, 0, 20, 0, 
20, 0, 20, 20, 20, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 20, 0, 
20, 0, 0, 0, 0, 20, 20, 20 ,
 20, 20, 20, 20, 20, 20, 0, 20, 0, 0, 0, 20, 20, 20, 20, 0, 
20, 0, 0, 20, 20, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 0, 20, 0, 20, 0, 0, 0, 0, 0, 0, 
20, 0, 0, 0, 0, 20, 20, 20 ,
 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 
20, 0, 0, 0, 0, 20, 20, 20 ,
 20, 20, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
20, 20, 20, 20, 0, 20, 20, 20,
 20, 20, 20, 0, 20, 20, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 
20, 0, 0, 0, 0, 20, 20, 20 ,
 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 20, 20, 20, 20, 20, 20, 20 ,
 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 20, 20, 20, 20, 20, 20, 20 ,


 };
    for (int i = 0; i < landMap.length; i++) {
      int column = i % 24;
      int row = (i - column) / 24;
      landLayer.setCell(column, row, landMap[i]);
    }

    // 初始化精灵
    try {
      playerSprite = new Sprite(Image.createImage("/Player.png"), 32, 33);
     
      int sequence2[] = { 0, 0, 0, 1, 1, 1 };
      int sequence4[] = { 0, 0, 1, 1, 2, 2, 3, 3 };
      for (int i = 0; i < 2; i++) {
        unicornSprite[i] = new RunSprite(Image.createImage("/unicorn.png"), 35, 35, 3, landLayer, playerSprite, 3);
        unicornSprite[i].setFrameSequence(sequence2);
        placeSprite(unicornSprite[i], landLayer);
	  }
      for (int i = 0; i < 2; i++) {
        boxlSprite[i] = new DriftSprite(Image.createImage("/box.png"), 48, 48, 1, landLayer);
        boxlSprite[i].setFrameSequence(sequence4);
        placeSprite(boxlSprite[i], landLayer);
      }

      for (int i = 0; i < 5; i++) {
        ballSprite[i] = new DriftSprite(Image.createImage("/ball.png"), 40, 40, 1, landLayer);
        ballSprite[i].setFrameSequence(sequence2);
        placeSprite(ballSprite[i], landLayer);
	  }
      for (int i = 0; i < 5; i++) {
        flowerSprite[i] = new DriftSprite(Image.createImage("/flower.png"), 32, 32, 1, landLayer);
        flowerSprite[i].setFrameSequence(sequence4);
        placeSprite(flowerSprite[i], landLayer);
	  }
	  for (int i = 0; i < 5; i++) {
        ghostSprite[i] = new ChaseSprite(
			Image.createImage("/ghost.png"), 
			40, 40, 3, landLayer, playerSprite, 3);
        ghostSprite[i].setFrameSequence(sequence4);
        placeSprite(ghostSprite[i], landLayer);
      }
      
    } catch (IOException e) { }

    // 建立图层管理器
    layers = new LayerManager();
    layers.append(playerSprite);
    for (int i = 0; i < 2; i++) {
      layers.append(unicornSprite[i]);
      layers.append(boxlSprite[i]);
    }
    for (int i = 0; i < 5; i++) {
      layers.append(ballSprite[i]);
      layers.append(ghostSprite[i]);
      layers.append(flowerSprite[i]);
    }
    layers.append(landLayer);
    layers.append(waterLayer);

    // 初始化音乐播放器
  try {
      InputStream is = getClass().getResourceAsStream("Music.mid");
      musicPlayer = Manager.createPlayer(is, "audio/midi");
      musicPlayer.prefetch();
      musicPlayer.setLoopCount(-1);
      is = getClass().getResourceAsStream("1.wav");
      rescuePlayer = Manager.createPlayer(is, "audio/X-wav");
      rescuePlayer.prefetch();
      is = getClass().getResourceAsStream("2.wav");
      ballPlayer = Manager.createPlayer(is, "audio/X-wav");
      ballPlayer.prefetch();
      is = getClass().getResourceAsStream("3.wav");
      gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
      gameoverPlayer.prefetch();
    }catch (IOException ioe) {
    }catch (MediaException me) {}

    // 开始新游戏
    newGame();

    // 开始动画线程
    sleeping = false;
    Thread t = new Thread(this);
    t.start();
  }
  
  public void stop() {
    // 关闭音乐播放器
    musicPlayer.close();
    rescuePlayer.close();
    ballPlayer.close();
    gameoverPlayer.close();

    //停止动画 
    sleeping = true;

    // 记录最高得分
    writeHiScores();
  }
  
  public void run() {
    Graphics g = getGraphics();
    while (!sleeping) {
      update();
      draw(g);
      try {
        Thread.sleep(frameDelay);
      }catch (InterruptedException ie) {}
    }
  }

  private void update() {
    // 查看游戏是否结束
    if (gameOver) {
      int keyState = getKeyStates();
      if ((keyState & FIRE_PRESSED) != 0)
        // 如果按下FIRE键,则开始新游戏
        newGame();

      // 游戏已经结束,不用继续更新
      return;
    }

    // 处理用户输入,计算移动距离,船只进行精灵动画
   int keyState = getKeyStates();
    int xMove = 0, yMove = 0;
     int sequence0[] = { 4, 4,5, 5,6,6,7,  7,};
    int sequence1[] = { 8, 8, 9, 9, 10, 10, 11, 11 };
  int sequence2[] = { 12, 12, 13, 13, 14, 14, 15, 15 };
   int sequence3[] = { 0, 0, 1, 1, 2, 2, 3, 3 };
   
if ((keyState & LEFT_PRESSED) != 0) {
      xMove = -5;
 playerSprite.nextFrame();      
int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence0);
 playerSprite.setFrame(nCurrentFrame);

      
    }else if ((keyState & RIGHT_PRESSED) != 0) {
      xMove = 5;
 playerSprite.nextFrame(); 
         int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence1);
 playerSprite.setFrame(nCurrentFrame);
    }
    if ((keyState & UP_PRESSED) != 0) {
      yMove = -5;
 playerSprite.nextFrame(); 
       int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence2);
 playerSprite.setFrame(nCurrentFrame);
    } else if ((keyState & DOWN_PRESSED) != 0) {
      yMove = 5;
 playerSprite.nextFrame(); 
         int nCurrentFrame = playerSprite.getFrame();
playerSprite.setFrameSequence(sequence3);
 playerSprite.setFrame(nCurrentFrame);
 
}
	// 如果发生移动,重新定位视图窗口
	// 精灵也要随之移动
    if (xMove != 0 || yMove != 0) {
      layers.setViewWindow(xView + xMove, yView + yMove, getWidth(),
        getHeight() - infoBar.getHeight());
      playerSprite.move(xMove, yMove);

⌨️ 快捷键说明

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