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

📄 hscanvas.java

📁 一个简单的迷宫类型游戏 一个小女孩在森林里面找独角兽
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    }


    // 检查船只和陆地图层是否碰撞
    if (playerSprite.collidesWith(landLayer, true)) {
      // 恢复视图窗口位置和船只精灵的位置
      layers.setViewWindow(xView, yView, getWidth(),
        getHeight() - infoBar.getHeight());
      playerSprite.move(-xMove, -yMove);
    }else if(xView + xMove < 0
	  	|| yView + yMove < infoBar.getHeight()
	  	|| landLayer.getWidth() - (xView + xMove) < getWidth()
	  	|| landLayer.getHeight() - (yView + yMove) < (getHeight() - infoBar.getHeight())
	  	) {
	    // 检测视图的边界问题,如果超出边界
        // 恢复最初的视图窗口位置
	    layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());
    } else {
      // 否则,提交对视图窗口位置的改变
      xView += xMove;
      yView += yMove;
    }

     for (int i = 0; i < 2; i++) {
      // 更新海盗精灵
      unicornSprite[i].update();      
      // 检查船只是否和海盗遇上
      if (playerSprite.collidesWith(unicornSprite[i], true)) {
        // 播放营救海盗的声音
        try {
          rescuePlayer.start();
        }catch (MediaException me) {}
        // 递增营救海盗数目
        unicornSaved++;
        score += 100;
        // 随机地将海盗放置在另一个地方
        placeSprite(unicornSprite[i], landLayer);

      }
	}
    for (int i = 0; i < 2; i++) {
      // 更新箱子精灵
	  boxlSprite[i].update();
      // 检查船只是否和箱子遇上
      if (playerSprite.collidesWith(boxlSprite[i], true)) {
        // 播放从浮桶得到能量的声音
        try {
          Manager.playTone(ToneControl.C4 + 12, 250, 100);
        }catch (MediaException me) {}
        // 增加船只的能量
        energy = Math.min(energy + 20, 80);
         
        // 随机地将箱子放置在另一个地方
        placeSprite(boxlSprite[i], landLayer);

      }
    }
    for (int i = 0; i <5; i++) {
      // 更新花精灵
	  flowerSprite[i].update();
      // 检查船只是否和花遇上
      if (playerSprite.collidesWith(flowerSprite[i], true)) {
   
        try {
          Manager.playTone(ToneControl.C4 + 12, 250, 100);
        }catch (MediaException me) {}
      
       
          score += 10;
     
      
     placeSprite(flowerSprite[i], landLayer);
      }
    }

    for (int i = 0; i < 5; i++) {
      // 更新球精灵
      ballSprite[i].update();
      // 检查船只是否和球遇上
      if (playerSprite.collidesWith(ballSprite[i], true)) {
        // 播放碰撞到球的声音
        try {
          ballPlayer.start();
        }catch (MediaException me) {}
        // 减少船只的能量
        energy -= 5;
        // 随机地将球放置在另一个地方
        placeSprite(ballSprite[i], landLayer);
      }
	}
    


 
	for (int i = 0; i < 5; i++) {
  	  // 更新鬼精灵
      ghostSprite[i].update();
	  //如果上次遇到的就是这只鬼则不检测
      if (lastCollide != i){
	    // 检查船只是否和鬼遇上
	    if (playerSprite.collidesWith(ghostSprite[i], true)) {
          // 播放碰撞到鬼的声音
          try {
            Manager.playTone(ToneControl.C4, 250, 100);
          }catch (MediaException me) {}

          // 减少能量
          energy -= 5;
          score -= 15;
		  // 记录遇到的这次鬼的编号
		  lastCollide = i;		  	
        }
	  }
    }

    // 如果能量小于0,则游戏结束
    if (energy <= 0) {
      // 停止背景音乐
      try {
        musicPlayer.stop();
      }catch (MediaException me) {}

      // 播放沉船的音乐
      try {
        gameoverPlayer.start();
      }catch (MediaException me) {}

      // 隐藏船只
      playerSprite.setVisible(false);

      // 更新高分列表
      updateHiScores();

      gameOver = true;
              return;
    }

    // 更新水域动画贴砖
    if (++waterDelay > 3) {
      if (++waterTile[0] > 3)
        waterTile[0] = 1;
      waterLayer.setAnimatedTile(-1, waterTile[0]);
      if (--waterTile[1] < 1)
        waterTile[1] = 3;
      waterLayer.setAnimatedTile(-2, waterTile[1]);
      waterDelay = 0;
    }
  }

  private void draw(Graphics g) {
	// 画状态栏图片,如果屏幕太宽,重复状态栏图片
 
int nBlankLeft = getWidth();
    do {
    	g.drawImage(infoBar, getWidth() - nBlankLeft, 
			0, Graphics.TOP | Graphics.LEFT);
    	nBlankLeft -= infoBar.getWidth();
    }while(nBlankLeft > 0);
	// 输出状态栏上的能量和营救的海盗数目
    g.setColor(0, 0, 0); // black
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
    g.drawString("energe:", 2, 1, Graphics.TOP | Graphics.LEFT);
    g.drawString("unicorn num: " + unicornSaved, 115, 1, Graphics.TOP | Graphics.LEFT);
    g.setColor(32, 32, 255); // blue
    g.fillRect(40, 3, energy, 12);

    // 绘制图层管理器
    layers.paint(g, 0, infoBar.getHeight());
    
    if (gameOver) {
      // 输出游戏结束消息和营救的伙伴数目,绘制闪屏和高分列表
      g.drawImage(screen, 90, 30, Graphics.TOP | Graphics.HCENTER);
      g.setColor(255, 255, 0); // white
      g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
      g.drawString("GAME OVER",95, 50, Graphics.TOP | Graphics.HCENTER);
      g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
      if (unicornSaved == 0)
        g.drawString("你太笨了!", 91, 70, Graphics.TOP | Graphics.HCENTER);
      else if (unicornSaved == 1)
        g.drawString("才找到一个!!", 90, 70, Graphics.TOP | Graphics.HCENTER);
      else
        g.drawString("你找到了 " + unicornSaved + "独角兽", 93, 70, Graphics.TOP |
          Graphics.HCENTER);
      g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
      for (int i = 0; i < 5; i++)
        g.drawString(Integer.toString(hiScores[i]), 90, 90 + (i * 15), Graphics.TOP | Graphics.HCENTER);
    }

    flushGraphics();
  }

  private void newGame() {
    // 初始化游戏变量
    gameOver = false;
    energy = 80;
    score = 0;
    unicornSaved = 0;

    // 显示海盗船
    playerSprite.setVisible(true);

    // 随机地放置海盗,并合理设置视图窗口位置
    placeSprite(playerSprite, landLayer);
    xView = playerSprite.getX() - ((getWidth() - playerSprite.getWidth()) / 2);
    yView = playerSprite.getY() - ((getHeight() - playerSprite.getHeight()) / 2);
    layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());

    // 开始背景音乐
    try {
      musicPlayer.setMediaTime(0);
      musicPlayer.start();
    }catch (MediaException me) {}
  }

  private void placeSprite(Sprite sprite, TiledLayer barrier) {
    // 尝试一个随机位置
    sprite.setPosition(Math.abs(rand.nextInt() % barrier.getWidth()) -
      sprite.getWidth(), Math.abs(rand.nextInt() % barrier.getHeight()) -
      sprite.getHeight());

    // 重新置位直到没有冲突
    // 不要太靠近边界
    int nLeft = (getWidth() - playerSprite.getWidth()) / 2;
    int nTop = (getHeight() - playerSprite.getHeight()) / 2;
    int nRight = landLayer.getWidth() - getWidth() + nLeft;
    int nBottom = landLayer.getHeight() - getHeight() + nTop;
    while (sprite.collidesWith(barrier, true)
    	|| sprite.getX() < nLeft || sprite.getX() > nRight
    	|| sprite.getY() < nTop || sprite.getY() > nBottom) {
      sprite.setPosition(Math.abs(rand.nextInt() % barrier.getWidth()) -
        sprite.getWidth(), Math.abs(rand.nextInt() % barrier.getHeight()) -
        sprite.getHeight());
    }
  }

  private void updateHiScores() {
    // 察看当前得分是否需要进入最高得分列表
    int i;
    for (i = 0; i < 5; i++)
      if (score > hiScores[i])
        break;

    // 把当前得分载入到最高得分列表中
    if (i < 5) {
      for (int j = 4; j > i; j--) {
        hiScores[j] = hiScores[j - 1];
      }
      hiScores[i] = score;
    }
  }

  private void readHiScores()
  {
    // 打开HiScores记录存储
    RecordStore rs = null;
    try {
      rs = RecordStore.openRecordStore("HiScores", false);
    }catch (Exception e) {}

    if (rs != null) {
      // 读出最高得分记录
      try {
        int    len;
        byte[] recordData = new byte[8];

        for (int i = 1; i <= rs.getNumRecords(); i++) {
          // 如果需要,重新分配记录保存变量
          if (rs.getRecordSize(i) > recordData.length)
            recordData = new byte[rs.getRecordSize(i)];

          // 读取记录,并把它保存到hiScores数组中
          len = rs.getRecord(i, recordData, 0);
          hiScores[i - 1] = 
			  (Integer.parseInt(new String(recordData, 0, len)));
        }
      }catch (Exception e) {}

      // 关闭记录存储
      try {
        rs.closeRecordStore();
      }catch (Exception e) {}
    }
    else {
      // 记录存储不存在,初始化最高得分列表
      for (int i = 0; i < 5; i++)
        hiScores[i] = 0;
    }
  }

  private void writeHiScores()
  {
    // 删除HiScore记录存储
    try {
      RecordStore.deleteRecordStore("HiScores");
    }catch (Exception e) {}

    // 创建一个新的HiScore记录存储
    RecordStore rs = null;
    try {
      rs = RecordStore.openRecordStore("HiScores", true);
    }catch (Exception e) {}

    // 写入得分
    for (int i = 0; i < 5; i++) {
      // 格式化每个得分以便写入
      byte[] recordData = 
		  Integer.toString(hiScores[i]).getBytes();

      try {
        // 把得分作为记录写入
        rs.addRecord(recordData, 0, recordData.length);
      }catch (Exception e) {}
    }

    // 关闭记录存储
    try {
      rs.closeRecordStore();
    }catch (Exception e) {}
  }
}

⌨️ 快捷键说明

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