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

📄 gamecanvas.java

📁 几个不错的手机程序例子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * GameCanvas.java
 *
 * Copyright 2001 SkyArts. All Rights Reserved.
 */
import javax.microedition.lcdui.*;
import java.util.*;

/**
 * 游戏的描绘与操作所用的类
 *
 * @author  Hideki Yonekawa
 * @version 1.0
 */
class GameCanvas extends Canvas implements Runnable, CommandListener {
	/** 储存横向长度的变量  */
	private int					screenWidth;
	/** 储存纵向长度的变量 */
	private int					screenHeight;

	/** 储存SpaceShooter对象的变量 */
	private SpaceShooter		spaceShooter;

	/** 储存使用在标题之图像的变量 */
	private Image				titleImg;

	/** 储存自机类别之对象的变量 */
	private MyShip			myShip			= new MyShip();

	/** 储存自机飞弹类别之对象的数组变量 */
	private MyMissile[]		myMissiles		= new MyMissile[] {
		new MyMissile(),
		new MyMissile(),
		new MyMissile(),
		new MyMissile(),
		new MyMissile()
	};
	/** 储存自机之飞弹发射数的变量 */
	private int			myMissileCount;

	/** 储存了UFO类别之对象的数组变量 */
	private UFO[]			ufos           		= new UFO[] {
		new UFO(myShip),
		new UFO(myShip),
		new UFO(myShip),
		new UFO(myShip),
		new UFO(myShip),
		new UFO(myShip),
		new UFO(myShip)
	};
	/** 储存了UFO之使用数的变量 */
	private int			ufoCount;

	/** 储存了UFO之飞弹类别对象的数组变量 */
	private UFOMissile[]		ufoMissiles		= new UFOMissile[] {
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile(),
		new UFOMissile()
	};
	/** 储存了UFO之飞弹发射数的变量 */
	private int			ufoMissileCount;

	/** 用来储存描绘的间隔(INTERVAL)的常量 */
	private static final long	DRAW_INTERVAL		= 100;

	/** 显示暂停状态的标志 */
	private	boolean			isPaused;

	/** 代表游戏循环停止的变量 */
	private boolean			isStopped;

	/** 储存了操作UFO的动态时所使用之计数的变量 */
	private int			tickCount4UFO;

	/** 用来改变UFO的出现之Random变量 */
	private Random			random				= new Random();

	/** Start指令变量 */
	private Command				startCmd		= new Command("Start", Command.SCREEN, 5);
	/** Exit指令变量 */
	private Command				exitCmd			= new Command("Exit", Command.SCREEN, 1);
	/** Pause指令变量 */
	private Command				pauseCmd		= new Command("Pause", Command.SCREEN, 5);
	/** Resume指令变量 */
	private Command				resumeCmd		= new Command("Resume", Command.SCREEN, 5);
	/** Quit指令变量 */
	private Command				quitCmd			= new Command("Quit", Command.SCREEN, 1);

	/** 储存分数的变量 */
	private long				score;

	/** 储存最高分数的变量 */
	private long				highScore		= 0;

	/** 用来储存默认分数的常量 */
	private static final long	        DEFAULT_SCORE		= 100;

	/** 储存生命点数的变量 */
	private int				lives;

	/** 用来储存默认之生命点数的常量 */
	private static final int	DEFAULT_LIVES		= 3;

	/** 储存默认字体的变量 */
	private Font				defFont			= Font.getDefaultFont();

	/** 储存分数显示部分之高度的常量(设定到默认字体高度) */
	private static final int	SCORE_AREA		 = Font.getDefaultFont().getHeight();

	/** 代表标题显示状态的常量 */
	private static final short	TITLE			= 0;
	/** 代表游戏开始显示状态的常量 */
	private static final short	GAME_START		= 1;
	/** 代表游戏中显示状态的常量 */
	private static final short	GAME_PLAYING		= 2;
	/** 代表游戏结束显示状态的常量 */
	private static final short	GAME_END		= 5;
	/** 储存现在显示状态的变量 */
	private short			gameState;

	/** 构造函数 */
	GameCanvas(SpaceShooter spaceShooter) {
		this.spaceShooter = spaceShooter;
		//取得画面的可描绘范围
		screenWidth = getWidth();
		screenHeight = getHeight();

		//取得标题图像
		try {
			titleImg = Image.createImage("/title.png");
		}catch(Exception e) {}

		//登录指令监听
		setCommandListener(this);

		//将游戏的状态变成显示标题
		gameState = TITLE;
	}

	/** 进行游戏之初始化的方法 */
	private void doGameInit() {
		//清除分数
		score = 0;
		//将自机的位置设定于中央
		myShip.setX((screenWidth - myShip.getWidth()) /2);
		myShip.setY(screenHeight - myShip.getHeight());
		myShip.setHit(false);//清除Hit状态
		//将生命点数设为默认值
		lives = DEFAULT_LIVES;

		//清除自机飞弹
		for(int i=0; i < myMissiles.length; i++) {
			myMissiles[i].setAlive(false);
		}
		//清除自机飞弹数
		myMissileCount = 0;

		//清除UFO
		for(int i=0; i < ufos.length; i++) {
			ufos[i].setAlive(false);
		}
		//清除UFO数
		ufoCount = 0;

		//清除UFO飞弹
		for(int i=0; i < ufoMissiles.length; i++) {
			ufoMissiles[i].setAlive(false);
		}
		//清除UFO飞弹数
		ufoMissileCount = 0;

		//清除要让UFO出现时所使用的Tick计数
		tickCount4UFO = 0;

		//清除游戏循环停止标志
		isStopped = false;
		//清除暂停标志
		isPaused = false;
	}

	/** MIDlet的startApp()被调用出来时所调用的方法 */
	void doStartApp() {
		//根据现在的状态来操作运作
		switch(gameState) {
			case TITLE:		//显示标题时
				doTitle();
			break;

			case GAME_START:	//游戏开始时
			case GAME_PLAYING:	//游戏中
				//进行暂停
				isPaused = true;
				//停止游戏循环
				isStopped = true;

				//以防万一删除关卡中的指令
				removeCommand(pauseCmd);
				removeCommand(resumeCmd);
				//新增Resume指令
				addCommand(resumeCmd);
			break;

			default:		//上述情形以外时
				//解除暂停
				isPaused = false;
			break;
		}
	}

	/** MIDlet的pauseApp()方法被调用出来时所调用的方法 */
	void doPauseApp() {
		switch(gameState) {
			case TITLE:				//显示标题时
			break;

			default:				//上述情形以外时
				//暂停
				isPaused = true;
				//停止游戏循环
				isStopped = true;
			break;
		}
	}

	/** 进行标题显示的方法 */
	private void doTitle() {
		//将游戏的状态设为显示标题
		gameState = TITLE;

		//以防万一先将关卡中的指令删除
		removeCommand(pauseCmd);
		removeCommand(resumeCmd);
		removeCommand(quitCmd);

		//显示标题画面
		repaint();
		//新增指令
		addCommand(exitCmd);
		addCommand(startCmd);
	}

	/** 启动描绘线程的方法 */
	private void doThreadStart() {
		new Thread(this).start();
	}

	/** 结束游戏的方法 */
	private void doGameStop() {
		//停止游戏循环
		isStopped = true;
		//设定最高分数
		setHighScore(score);
	}

	/** 进行暂停或是重新开始的方法 */
	private void doPauseOrResume() {
		if(isPaused) {
		//暂停时
			//重新开始
			isPaused = false;
			isStopped = false;
			doThreadStart();
		}else {
		//不是暂停时
			//暂停
			isPaused = true;
			doGameStop();
		}// end if
		repaint();
	}

	/**
	 * 进行描绘的方法,通常不会从自类别来调用
	 * @param	g	Graphics对象
	 */
	protected void paint(Graphics g) {
		//以黑色清除背景
		g.setColor(0x00000000);
		g.fillRect(0, 0, screenWidth, screenHeight);

		g.setFont(defFont);

		String drawSt;
		int drawX, drawY, stWidth;
		int stHeight = defFont.getHeight();

		//根据游戏状态来改变描绘内容
		switch(gameState) {
			case TITLE://显示标题时
				//描绘标题图像
				drawX = (screenWidth - titleImg.getWidth()) /2;
				g.drawImage(titleImg, drawX, 0, Graphics.TOP|Graphics.LEFT);

				//显示最高分数
				g.setColor(0x00FFFFFF);
				g.setFont(defFont);
				drawSt = "High Score";
				drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
				drawY = titleImg.getHeight() -5;
				g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
				drawX = drawX + defFont.stringWidth(drawSt) - defFont.stringWidth(String.valueOf(highScore));
				drawY = drawY + stHeight;
				g.drawString(String.valueOf(highScore), drawX, drawY, Graphics.TOP|Graphics.LEFT);

				//显示着作权
				drawSt = "Copyright 2001";
				drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
				drawY = getHeight() - stHeight *2;
				g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);

				drawSt = "SkyArts.com";
				drawX = (screenWidth - defFont.stringWidth(drawSt)) / 2;
				drawY = drawY + stHeight;
				g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
			return;

			case GAME_START://游戏开始时
				//描绘游戏开始画面
				g.setColor(0x00FFFFFF);
				drawSt = "Ready go !";
				stWidth = defFont.stringWidth(drawSt);
				drawX = (screenWidth - stWidth) / 2;
				drawY = (screenHeight - stHeight) / 2;
				g.drawString(drawSt, drawX, drawY, Graphics.TOP|Graphics.LEFT);
			return;

			case GAME_PLAYING:
			case GAME_END:
			//游戏中或是游戏结束时
				g.setColor(0x00FFFFFF);
				//将分数描绘到左边
				drawSt = "S:" + String.valueOf(score);
				g.drawString(drawSt, 0, 0, Graphics.TOP|Graphics.LEFT);

				//将生命点数描绘到右边
				drawSt = "L:" + String.valueOf(lives);
				g.drawString(drawSt, screenWidth- defFont.stringWidth(drawSt), 0, Graphics.TOP|Graphics.LEFT);

				//描绘自机
				myShip.doDraw(g);

				//描绘UFO
				for(int i=0; i < ufos.length; i++) {
					ufos[i].doDraw(g);
				}

				//描绘自机飞弹
				for(int i=0; i < myMissiles.length; i++) {
					myMissiles[i].doDraw(g);
				}

				//描绘UFO飞弹
				for(int i=0; i < ufoMissiles.length; i++) {
					ufoMissiles[i].doDraw(g);
				}

				//在暂停时等画面中显示文本
				switch(gameState) {
					case GAME_PLAYING://游戏中
						if(isPaused) {
						//显示代表暂停的字符串
							drawSt = "Pause";
						}else {
						//不是暂停时就return
							return;

⌨️ 快捷键说明

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