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

📄 hscanvas.java

📁 J2ME拯救海盗游戏基本功能已实现11111111
💻 JAVA
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

import java.util.*;
import java.io.*;

import javax.microedition.media.*;
import javax.microedition.media.control.*;

public class HSCanvas extends GameCanvas implements Runnable 
{
	private Graphics bg;
	
	private Random rand;

	private int xView, yView;						//视窗坐标
	private TiledLayer waterLayer;					//海水图层
	private TiledLayer landLayer;					//陆地图层
	private LayerManager layers;					//图层管理者
	private int[] waterTile = { 1, 3 };

	private Image infoBar;										//信息条
	private CorsairSprite playerSprite;							//玩家精灵
	private ChaseSprite   enemyShipSprite;						//敌船精灵
	private DriftSprite[] pirateSprite = new DriftSprite[2];	//海盗精灵
	private DriftSprite[] barrelSprite = new DriftSprite[2];	//木桶精灵
	private DriftSprite[] mineSprite = new DriftSprite[5];		//水雷精灵
	private DriftSprite[] squidSprite = new DriftSprite[5];		//章鱼精灵
	
	private Player musicPlayer;				//音效
	private Player rescuePlayer;
	private Player minePlayer;
	private Player gameoverPlayer;

	private boolean gameOver;				//游戏结束标志
	private int energy;						//玩家生命值
	private int piratesSaved;				//救援海盗数量

	public HSCanvas(boolean arg0) 
	{
		super(arg0);

		this.setFullScreenMode(true);
		
		rand = new Random();
		
		try 
		{
			infoBar = Image.createImage("/InfoBar.png");
		} 
		catch (IOException e)
		{
		}
		
		createLandLayer();
		createWaterLayer();
		createSprite();

		// 创建图层管理者
		layers = new LayerManager();
		layers.append(playerSprite);
		layers.append(enemyShipSprite);
		for (int i = 0; i < 2; i++) 
		{
			layers.append(pirateSprite[i]);
			layers.append(barrelSprite[i]);
		}
		for (int i = 0; i < 5; i++)
		{
			layers.append(mineSprite[i]);
			layers.append(squidSprite[i]);
		}
		layers.append(landLayer);
		layers.append(waterLayer);

		// 初始化音效
		try 
		{
			InputStream is = getClass().getResourceAsStream("Music.mid");
			musicPlayer = Manager.createPlayer(is, "audio/midi");
			musicPlayer.setLoopCount(-1);
			
			is = getClass().getResourceAsStream("Rescue.wav");
			rescuePlayer = Manager.createPlayer(is, "audio/X-wav");

			is = getClass().getResourceAsStream("Mine.wav");
			minePlayer = Manager.createPlayer(is, "audio/X-wav");

			is = getClass().getResourceAsStream("GameOver.wav");
			gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
		} 
		catch (Exception e)
		{
		}

		// 开始新游戏
		newGame();

		Thread t = new Thread(this);
		t.start();
	}

	//创建陆地图层
	private void createLandLayer()
	{
		int[][] map={{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,32,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26, 1, 1},
				 {1, 1,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 6, 7, 0,27, 1, 1},
				 {1, 1,31, 0, 0, 0, 0, 0, 0, 0,10,12, 0, 0, 0, 0, 0, 6,14,12, 0,27, 1, 1},
				 {1, 1,31, 0, 6,11,11,11,11,11,14,12, 0, 0, 0, 0, 0,10,16, 8, 0,27, 1, 1},
				 {1, 1,31, 0,10,16, 9, 9, 9, 9, 9, 8, 0, 0, 0, 0, 0, 5, 8, 0, 0,27, 1, 1},
				 {1, 1,31, 0,10,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0,10,15, 7, 0, 0, 6,11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0,10,16, 8, 0, 6,14,16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0,10,12, 0, 0,10, 1,12, 0, 0, 0, 0, 6,11,11, 7, 0, 0,27, 1, 1},
				 {1, 1,31, 0,10,15,11,11,14,16, 8, 0, 0, 0, 0,10, 1, 1,12, 0, 0,27, 1, 1},
				 {1, 1,31, 0, 5, 9, 9, 9, 9, 8, 0, 0, 0, 0, 0,10, 1, 1,12, 0, 0,27, 1, 1},
				 {1, 1,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 9, 8, 0, 0,27, 1, 1},
				 {1, 1,31, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0,19,20,17,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0,27, 1, 1},
				 {1, 1,31, 0, 0, 0,19,20, 0,17,18, 0, 0, 0, 6,11, 7, 0, 5, 8, 0,27, 1, 1},
				 {1, 1,31, 0,17,18, 0, 0, 0,19,20, 0, 0, 0,10, 1,12, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0,19,20, 0,17,18, 0,17,18, 0, 0, 5, 9, 8, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,31, 0, 0, 0, 0,19,20, 0,19,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,27, 1, 1},
				 {1, 1,30,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,28, 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}};
							
		Image img = null;
		try
		{
			img = Image.createImage("/land.png");
		} 
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		landLayer = new TiledLayer(map[0].length, map.length, img, 32, 32);
		
		for (int i = 0; i < map.length; i++) 
		{
			for (int j = 0; j < map[0].length; j++)
			{
				landLayer.setCell(j, i, map[i][j]);
			}
		}
	}
	
	//创建海水图层
	private void createWaterLayer()
	{
		int[][] map={ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
				{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
				{0, 0,-1, 1,-1, 1, 1,-1,-2, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-2, 0, 0},
				{0, 0, 1, 1,-1, 1,-1, 1, 1,-1, 1, 1,-2, 1,-1, 1, 1,-2, 1, 1,-1, 1, 0, 0},
				{0, 0,-2,-1, 1,-1, 1,-2, 1, 1,-2, 1, 1,-1, 1,-2, 1, 1,-2, 1, 1,-1, 0, 0},
				{0, 0,-1, 1,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-1, 1,-1,-1, 1, 1,-1, 1, 0, 0},
				{0, 0, 1,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-2, 1,-1, 1, 1,-1, 1, 1, 1, 0, 0},
				{0, 0,-1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1, 1,-1, 1,-1, 0, 0},
				{0, 0, 1,-1,-2, 1, 1, 1,-1, 1, 1,-2,-1, 1, 1,-2, 1, 1,-2, 1,-1,-2, 0, 0},
				{0, 0,-2, 1, 1, 1,-1,-2, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-1, 1, 1, 1, 0, 0},
				{0, 0, 1, 1, 1,-1, 1, 1,-1, 1, 1, 1,-2,-1, 1, 1, 1,-1, 1,-1, 1,-1, 0, 0},
				{0, 0, 1,-1,-2, 1,-1,-2, 1,-2,-1, 1,-1, 1,-1,-1,-1, 1,-1, 1,-1, 1, 0, 0},
				{0, 0,-2, 1, 1, 1, 1, 1, 1, 1,-1,-1, 1,-1, 1, 1, 1,-2, 1, 1,-2,-1, 0, 0},
				{0, 0,-1, 1,-1,-1, 1,-1,-2,-1, 1, 1,-2, 1,-1, 1,-1, 1, 1,-1, 1, 1, 0, 0},
				{0, 0, 1,-2, 1, 1,-1, 1, 1, 1,-1,-1, 1,-1, 1, 1, 1, 1,-1, 1, 1,-1, 0, 0},
				{0, 0,-1, 1, 1,-2, 1,-2,-1, 1,-1, 1,-1, 1, 1,-1,-2, 1,-1, 1,-2, 1, 0, 0},
				{0, 0,-2, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-2,-1, 1, 1,-1, 1,-1, 1, 1, 0, 0},
				{0, 0, 1, 1,-1, 1, 1,-1, 1, 1,-2, 1,-1, 1, 1, 1,-1, 1,-1, 1,-1,-1, 0, 0},
				{0, 0, 1,-1, 1,-2, 1,-2,-1, 1, 1,-1, 1,-1, 1,-1, 1,-1,-2,-1, 1, 1, 0, 0},
				{0, 0,-1, 1,-1, 1, 1,-1, 1,-2,-1, 1,-2,-1,-2, 1,-1,-2, 1,-1,-2, 1, 0, 0},
				{0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1, 1,-1, 1,-1, 1,-1, 1,-1, 1, 1,-1, 0, 0},
				{0, 0,-2,-1, 1, 1,-2, 1,-1, 1,-1,-2, 1,-2, 1,-1,-2, 1, 1,-2,-1, 1, 0, 0},
				{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
				{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
							
		Image img = null;
		try
		{
			img = Image.createImage("/water.png");
		} 
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		waterLayer = new TiledLayer(map[0].length, map.length, img, 32, 32);
		
		waterLayer.createAnimatedTile(1);
		waterLayer.createAnimatedTile(3);
		
		for (int i = 0; i < map.length; i++) 
		{
			for (int j = 0; j < map[0].length; j++)
			{
				waterLayer.setCell(j, i, map[i][j]);
			}
		}
	}
	
	//创建精灵
	private void createSprite()
	{	
		try 
		{
			//创建玩家精灵
			playerSprite = new CorsairSprite(Image.createImage("/PlayerShip.png"), 43, 45, 3, landLayer);

			//创建敌船精灵
			enemyShipSprite = new ChaseSprite(Image.createImage("/EnemyShip.png"), 86, 70, 1, landLayer);
			
			//创建海盗和木桶精灵
			for (int i = 0; i < 2; i++) 
			{
				pirateSprite[i] = new DriftSprite(Image.createImage("/Pirate.png"), 29, 29, 2, landLayer);
				barrelSprite[i] = new DriftSprite(Image.createImage("/Barrel.png"), 24, 22, 1, landLayer);
			}

			//创建水雷和章鱼精灵
			for (int i = 0; i < 5; i++) 
			{
				mineSprite[i] = new DriftSprite(Image.createImage("/Mine.png"),27, 23, 1, landLayer);
				squidSprite[i] = new DriftSprite(Image.createImage("/Squid.png"), 24, 35, 3, landLayer);
			}
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
	}
	
	private void newGame() 
	{
		// 初始化游戏相关参数
		gameOver = false;
		energy = 45;
		piratesSaved = 0;

		// 设置游戏主角
		playerSprite.setVisible(true);
		playerSprite.RandomPosition();
		
		//设置视窗位置
		xView = playerSprite.getX()-((this.getWidth() - playerSprite.getWidth()) / 2);
		yView = playerSprite.getY()-((this.getHeight() - playerSprite.getHeight()) / 2);
		layers.setViewWindow(xView, yView, getWidth(),getHeight()-infoBar.getHeight());

		// 播放背景音乐
		try 
		{
			musicPlayer.start();
		} 
		catch (MediaException e)
		{
			e.printStackTrace();
		}
	}
	
	public void run() 
	{
		bg = getGraphics();

		while (true) 
		{
			tick();
			input();
			render();
			
			try 
			{
				Thread.sleep(30);
			} 
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}

	private void tick()
	{
		for (int i = 0; i < 2; i++) 
		{
			// 使精灵漂流
			pirateSprite[i].drift();
			barrelSprite[i].drift();

			// 检测玩家与海盗精灵碰撞
			if (playerSprite.collidesWith(pirateSprite[i], true)) 
			{
				try 
				{
					rescuePlayer.start();
				} 
				catch (MediaException e)
				{
					e.printStackTrace();
				}

				piratesSaved++;
				pirateSprite[i].RandomPosition();
			}

			//测玩家与木桶精灵碰撞
			if (playerSprite.collidesWith(barrelSprite[i], true))
			{
				// 增长玩家生命
				energy = Math.min(energy + 5, 45);
				barrelSprite[i].RandomPosition();
			}
		}

		for (int i = 0; i < 5; i++) 
		{
			// 使精漂流
			mineSprite[i].drift();
			squidSprite[i].drift();

			// 检测玩家与水雷精灵碰撞
			if (playerSprite.collidesWith(mineSprite[i], true)) 
			{
				energy -= 10;
				mineSprite[i].RandomPosition();
			}

			// 检测玩家与章鱼精灵碰撞
			if (playerSprite.collidesWith(squidSprite[i], true))
			{
				energy -= 5;
			}
		}
		
	    // 敌人战舰追击玩家 
	    enemyShipSprite.chase(playerSprite);

	    // 检测敌船与玩家碰撞
	    if (playerSprite.collidesWith(enemyShipSprite, true)) 
	    {
	    	try 
	    	{
	    		minePlayer.start();
	    	}
	    	catch (MediaException me)
	    	{
		    }
	    	
	    	energy -= 10;
	    }

		// 检测游戏结束
		if (energy <= 0) 
		{
			try
			{
				musicPlayer.stop();
				gameoverPlayer.start();
			} 
			catch (MediaException me)
			{
			}

			//隐藏玩家精灵
			playerSprite.setVisible(false);
			gameOver = true;
		}
		
		// 设置海水动画效果
		if (++waterTile[0] > 3)
			waterTile[0] = 1;
		
		waterLayer.setAnimatedTile(-1, waterTile[0]);
		
		if (--waterTile[1] < 1)
			waterTile[1] = 3;
		
		waterLayer.setAnimatedTile(-2, waterTile[1]);
	}
	
	private void input() 
	{
		int keyState = getKeyStates();
		
		if ((keyState & LEFT_PRESSED) != 0) 
		{
			playerSprite.moveDirection(MainSprite.LEFT);
			
			xView += playerSprite.getDx();
			yView += playerSprite.getDy();
		} 
		else if ((keyState & RIGHT_PRESSED) != 0) 
		{
			playerSprite.moveDirection(MainSprite.RIGHT);
			
			xView += playerSprite.getDx();
			yView += playerSprite.getDy();
		}
		else if ((keyState & UP_PRESSED) != 0) 
		{
			playerSprite.moveDirection(MainSprite.UP);
			
			xView += playerSprite.getDx();
			yView += playerSprite.getDy();
		} 
		else if ((keyState & DOWN_PRESSED) != 0)
		{
			playerSprite.moveDirection(MainSprite.DOWN);
			
			xView += playerSprite.getDx();
			yView += playerSprite.getDy();
		}
		
		if (!playerSprite.isCollided()) 
		{
			layers.setViewWindow(xView, yView, getWidth(), getHeight() - infoBar.getHeight());
		}
		else
		{
			xView -= playerSprite.getDx();
			yView -= playerSprite.getDy();
		}
		
		// 判断是否重新开始游戏
		if (gameOver) 
		{
			if ((keyState & FIRE_PRESSED) != 0)
			{
				newGame();
			}
		}
	}

	private void render() 
	{
		// 绘制信息条
		bg.drawImage(infoBar, 0, 0, Graphics.TOP | Graphics.LEFT);
		bg.setColor(0, 0, 0);
		bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,Font.SIZE_MEDIUM));
		bg.drawString("生命:", 2, 1, Graphics.TOP | Graphics.LEFT);
		bg.drawString("拯救海盗数量: " + piratesSaved, 88, 1, Graphics.TOP| Graphics.LEFT);
		bg.setColor(32, 32, 255);
		bg.fillRect(40, 3, energy, 12);

		// 绘制图层
		layers.paint(bg, 0, infoBar.getHeight());

		// 绘制游戏结束画面
		if (gameOver) 
		{
			bg.setColor(255, 255, 255); // white
			bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_LARGE));
			bg.drawString("游戏结束", 110, 70, Graphics.TOP | Graphics.HCENTER);
			bg.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_MEDIUM));
			
			bg.drawString("你拯救了 " + piratesSaved + " 个海盗.", 110, 100,Graphics.TOP | Graphics.HCENTER);
		}

		flushGraphics();
	}
}

⌨️ 快捷键说明

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