亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gamecanvas.java

?? 《MIDP手機游戲設計》是一本運用MIDP進行J2ME手機游戲編程的JAVA書籍
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/*
 * GameCanvas.java
 *
 * Copyright 2001 SkyArts. All Rights Reserved.
 */
import javax.microedition.lcdui.*;
import java.util.*;

/**
 * 游戲的操作與畫面描繪使用的Canvas類
 *
 * @author  Hideki Yonekawa
 * @version 1.0
 */
class GameCanvas extends Canvas implements Runnable, CommandListener {
	/** 構造函數 */
	private int					screenWidth;
	/** 儲存橫向長度的變量  */
	private int					screenHeight;

	/** 儲存縱向長度的變量 */
	private Cube				cube;

	/** 代表標題顯示狀態的常量 */
	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;
	/** 顯示暫停狀態的標志 */
	private	boolean				isPaused;	

	/** 儲存使用在標題的圖像的變量 */
	private Image				titleImg;

	/** 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);

	/** 成為方塊的置入物的Piece數組變量 */
	private Piece[]				pieces;

	/** 儲存方塊的列(縱向)數目的常量 */
	private static final int	COLUMN_LENGTH		= 8;
	/** 儲存方塊的行(橫向)數目的常量 */
	private static final int	ROW_LENGTH			= 6;

	/** 儲存了落下方塊組的中心點Index的變量 */
	private int					centerPoint;

	/** 儲存了落下方塊組的左側Index的變量 */
	private static final short	FALL_START_INDEX1	= 2;
	/** 儲存了落下方塊組的右側Index的變量 */
	private static final short	FALL_START_INDEX2	= 3;

	//落下方塊的方向常量
	/** 代表落下方塊組的方向為上的常量 */
	private static final short	DIRECTION_UP		= 0;
	/** 代表落下方塊組的方向為右的常量 */
	private static final short	DIRECTION_RIGHT		= 1;
	/** 代表落下方塊組的方向為下的常量 */
	private static final short	DIRECTION_DOWN		= 2;
	/** 代表落下方塊組的方向為左的常量 */
	private static final short	DIRECTION_LEFT		= 3;
	/** 代表落下方塊組之默認方向的常量 */
	private static final short	DIRECTION_DEFAULT= DIRECTION_RIGHT;

	/** 儲存了落下方塊組現在方向的變量 */
	private short				currentDirection;

	/** 儲存下一個方塊資訊的Piece數組變量 */
	private Piece[]				nextPieces;

	/** 在制作下一個方塊組時所使用的Random變量 */
	private Random				random				= new Random();

	/** 代表按鍵輸入是否有效的標志變量 */
	private boolean				isKeyEnable;

	private static final int	DEFAULT_FALL_TICK_COUNT=10;
	/** 儲存用來調整方塊組落下速度用的Tick計數的變量 */
	private int					tickCount4Speed;
	/** 儲存用來計算落下方塊組時機的Tick計數的變量 */
	private int					tickCount4Fall;
	/** 儲存方塊組落下次數的變量 */
	private int					fallCount;
	/** 代表游戲循環是否停止的變量 */
	private boolean				isStopped;
	/** 判斷是否要落下下一個方塊組的標志變量 */
	private boolean				isNextFall;

	/** 存放描繪間隔(INTERVAL)的常量 */
	private static final long	DRAW_INTERVAL		= 100;

	/** 存放默認分數增加值的常量 */
	private static final int	DEFAULT_SCORE_VALUE	= 100;

	/** 存放分數的變量 */
	private long				score;

	/** 存放最高分數的變量 */
	private long				highScore			= 0;

	/** 存放默認字體的變量 */
	private Font				defFont				= Font.getDefaultFont();

	/** 構造函數 */
	GameCanvas(Cube cube) {
		this.cube = cube;

		//取得畫面的可描繪范圍
		screenWidth = getWidth();
		screenHeight = getHeight();

		//取得標題圖像
		try {
			titleImg = Image.createImage("/title.png");
		}catch(java.io.IOException e) {}

		//登錄指令監聽
		setCommandListener(this);

		//將游戲的狀態變成顯示標題
		gameState = TITLE;
	}

	/** 進行游戲初始化的方法 */
	private void doGameInit() {
		//清除分數
		score = 0;
		//取得下一個方塊組
		nextPieces = getNextPieces();
		//清除方塊置入數組
		pieces = new Piece[COLUMN_LENGTH * ROW_LENGTH];

		//將調整方塊組速度用的Tick計數設為默認值
		tickCount4Speed = DEFAULT_FALL_TICK_COUNT;
		//清除用來計算落下方塊組時機的Tick計數
		tickCount4Fall = 0;
		//清除落下方塊組的數目
		fallCount = 0;
		//清除停止循環標志
		isStopped = false;
		//清除暫停標志
		isPaused = false;
		//建立是否落下下一個方塊組的標志
		isNextFall = true;
		//讓按鍵有效
		isKeyEnable = true;
	}

	/** 指令的事件發生時被調用出來的方法 */
	public void commandAction(Command c, Displayable s) {
		if(c == startCmd) {//Start指令
			//初始化游戲以開始游戲
			doGameInit();
			gameState = GAME_START;
			doThreadStart();

		}else if(c == exitCmd) {//EXIT指令
			//調用出Cube類的doExit方法以結束MIDlet本身
			cube.doExit();

		}else if(c == pauseCmd) {//Pause指令
			//交換Pause指令與Resume指令,調用出Pause、Resume處理方法
			removeCommand(pauseCmd);
			addCommand(resumeCmd);
			doPauseOrResume();

		}else if(c == resumeCmd) {//Resume指令
			//交換Resume指令與Pause指令,調用出Pause、Resume處理方法
			removeCommand(resumeCmd);
			addCommand(pauseCmd);
			doPauseOrResume();

		}else if(c == quitCmd) {//Quit指令
			//調用出游戲結束方法
			doGameStop();
			//刪除指令
			removeCommand(pauseCmd);
			removeCommand(resumeCmd);
			removeCommand(quitCmd);
			//顯示標題
			doTitle();
		}
	}

	/** 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;
		}
	}

	/** 進行標題顯示的方法 */
	private void doTitle() {
		//將游戲的狀態設為顯示標題
		gameState = TITLE;

		//以防萬一先將關卡中的指令刪除
		removeCommand(pauseCmd);
		removeCommand(resumeCmd);
		removeCommand(quitCmd);

		//顯示標題畫面
		repaint();
		//新增指令
		addCommand(exitCmd);
		addCommand(startCmd);
	}

	/** MIDlet的pauseApp()方法被調用出來時所調用的方法 */
	void doPauseApp() {
		switch(gameState) {
			case TITLE:					//顯示標題時
			break;

			default:					//上述情形以外時
				//暫停
				isPaused = true;
				//停止游戲循環
				isStopped = true;
			break;
		}
	}

	/**
	 *產生下一個落下方塊組并傳回的方法
	 *在@return	Piece[]	之后落下的Piece數組
	 */
	private Piece[] getNextPieces() {
		//以Random所產生的值為基礎決定種類
		int kindNo= random.nextInt() % 10;
		//負數的時候就將其變為正數
		if(kindNo < 0) kindNo = kindNo * (-1);

		Piece[] retPieces = new Piece[] {
			new Piece(),
			new Piece()
		};

		switch(kindNo) {
			case 0://紅紅
				retPieces[0].currentColor = Piece.RED;
				retPieces[1].currentColor = Piece.RED;
			break;
			case 1://紅綠
				retPieces[0].currentColor = Piece.RED;
				retPieces[1].currentColor = Piece.GREEN;
			break;
			case 2://紅藍
				retPieces[0].currentColor = Piece.RED;
				retPieces[1].currentColor = Piece.BLUE;
			break;
			case 3://紅黃
			retPieces[0].currentColor = Piece.RED;
			retPieces[1].currentColor = Piece.YELLOW;
			break;
			case 4://綠綠
				retPieces[0].currentColor = Piece.GREEN;
				retPieces[1].currentColor = Piece.GREEN;
			break;
			case 5://綠藍
				retPieces[0].currentColor = Piece.GREEN;
				retPieces[1].currentColor = Piece.BLUE;
			break;
			case 6://綠黃
				retPieces[0].currentColor = Piece.GREEN;
				retPieces[1].currentColor = Piece.YELLOW;
			break;
			case 7://藍藍
				retPieces[0].currentColor = Piece.BLUE;
				retPieces[1].currentColor = Piece.BLUE;
			break;
			case 8://藍黃
				retPieces[0].currentColor = Piece.BLUE;
				retPieces[1].currentColor = Piece.YELLOW;
			break;
			case 9://黃黃
				retPieces[0].currentColor = Piece.YELLOW;
				retPieces[1].currentColor = Piece.YELLOW;
			break;
		}
		return retPieces;
	}

	/** 按鍵按下事件發生時被調用出來的方法 */
	protected synchronized void keyPressed(int keyCode) {
		if(	! isKeyEnable || gameState != GAME_PLAYING ||
			(gameState == GAME_PLAYING && isPaused)) {
 			//按鍵為無效、或是不在游戲中、在游戲中暫停時為return
			return;
		}

		//為清除按鍵時不處理
		if(keyCode == 0) return;	//for KDDI

		int gameCode = getGameAction(keyCode);
		switch(gameCode) {
			case UP:	//按下上按鍵時
			case FIRE:	//按下Fire鍵時
				doRotat();
			break;

			case LEFT:	//按下左按鍵時
				doLeft();
			break;

			case DOWN:	//按下下按鍵時
				doFall();
			break;

			case RIGHT:	//按下右按鍵時
				doRight();
			break;
		}
	}

	/** 壓下按鍵狀態時被重復調用的方法 */
	protected void keyRepeated(int keyCode) {
		keyPressed(keyCode);
	}

	/** 壓下上按鍵、決定按鍵時所調用出來的方法 */
	private void doRotat() {
		switch(currentDirection) {
			case DIRECTION_UP:		//方向為上時
				//因為要作順時鐘旋轉,所以要檢查右邊
				if(centerPoint % ROW_LENGTH != ROW_LENGTH -1) {
				//當不是在最右邊時
					if( pieces[centerPoint +1] == null &&
						pieces[centerPoint -ROW_LENGTH +1] == null ) 
					{
					//若在右邊以及右邊上面都沒有東西的話就向右轉動
						pieces[centerPoint +1] = pieces[centerPoint -ROW_LENGTH];
						pieces[centerPoint -ROW_LENGTH] = null;
						//方向轉向右
						currentDirection = DIRECTION_RIGHT;
					}
				}
			break;

			case DIRECTION_RIGHT:	//方向為右時
				//因為要作順時鐘旋轉,所以要檢查下方
				if(centerPoint < (COLUMN_LENGTH -1) * ROW_LENGTH) {
				//當不是在最下面時
					if( pieces[centerPoint +ROW_LENGTH] == null &&
						pieces[centerPoint +1 +ROW_LENGTH] == null)
					{
					//當右下與正下方什么都沒有時向下移動
						pieces[centerPoint +ROW_LENGTH] = pieces[centerPoint +1];
						pieces[centerPoint +1] = null;

						//將方向變為向下
						currentDirection = DIRECTION_DOWN;
					}
				}
			break;

			case DIRECTION_DOWN:	//方向為向下時
				//因為要作順時鐘旋轉,所以要檢查左邊
				if(centerPoint % ROW_LENGTH != 0) {
				//當不在最左邊的時候

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久影院亚瑟| 国产精品久久二区二区| 国模无码大尺度一区二区三区| 国产女主播在线一区二区| 色88888久久久久久影院按摩| 麻豆精品视频在线观看视频| 日韩毛片精品高清免费| 日韩美女在线视频| 91国产视频在线观看| 国产综合一区二区| 亚洲成a人片在线不卡一二三区| 精品粉嫩超白一线天av| 在线精品国精品国产尤物884a| 国产综合色在线| 日韩综合一区二区| 亚洲色图.com| 国产欧美一区二区三区网站 | 中文字幕第一区第二区| 欧美精品九九99久久| 99精品国产热久久91蜜凸| 狠狠色丁香久久婷婷综合_中 | 一区精品在线播放| 亚洲精品一区二区在线观看| 欧美男同性恋视频网站| 91网上在线视频| 岛国av在线一区| 久久国产精品99精品国产| 一区二区三区四区蜜桃| 中文字幕字幕中文在线中不卡视频| 精品sm在线观看| 日韩欧美中文字幕公布| 欧美日韩国产综合久久| 91精品办公室少妇高潮对白| 成人久久18免费网站麻豆| 精品亚洲国产成人av制服丝袜| 日韩av一区二区在线影视| 亚洲综合一区二区精品导航| 日韩美女啊v在线免费观看| 亚洲国产成人在线| 国产欧美一区二区三区在线看蜜臀| 欧美成人精品1314www| 欧美一卡2卡三卡4卡5免费| 欧美人伦禁忌dvd放荡欲情| 精品视频免费看| 欧美午夜精品一区| 欧美性猛交xxxxxxxx| 欧美综合一区二区| 欧美在线视频全部完| 在线免费观看不卡av| 在线精品视频一区二区| 色噜噜狠狠色综合中国| 色香色香欲天天天影视综合网| 91尤物视频在线观看| 一本在线高清不卡dvd| 在线观看www91| 欧美日韩一区高清| 91精品国产综合久久精品 | 91精选在线观看| 日韩三级视频在线看| 精品国产伦一区二区三区观看体验| 欧美成人r级一区二区三区| 日韩视频免费直播| 国产欧美精品一区aⅴ影院| 国产精品电影一区二区三区| 亚洲精品欧美综合四区| 亚洲成人免费观看| 男人的天堂亚洲一区| 加勒比av一区二区| 国产69精品久久久久毛片| av不卡一区二区三区| 91激情五月电影| 欧美疯狂做受xxxx富婆| 日韩欧美久久久| 亚洲国产精品99久久久久久久久| 国产精品电影院| 五月天一区二区| 久久电影国产免费久久电影 | 久久草av在线| 播五月开心婷婷综合| 欧美性感一类影片在线播放| 日韩一区和二区| 国产精品天干天干在观线| 亚洲综合一二区| 极品瑜伽女神91| 91麻豆.com| 精品免费国产一区二区三区四区| 中文字幕精品一区二区精品绿巨人| 一级做a爱片久久| 久久精品72免费观看| 成人h动漫精品一区二区| 欧美日韩电影在线| 久久久www免费人成精品| 亚洲精品国产成人久久av盗摄| 日本午夜精品一区二区三区电影| 国产成人免费av在线| 欧美日韩国产免费一区二区| 久久久精品2019中文字幕之3| 亚洲国产精品欧美一二99| 国产精品一区一区| 欧美剧情片在线观看| 中文字幕国产一区| 免费观看一级特黄欧美大片| 91视频国产观看| 欧美刺激午夜性久久久久久久| 亚洲精品免费播放| 国产一区二区成人久久免费影院| 欧美色窝79yyyycom| 国产日韩欧美麻豆| 美腿丝袜亚洲一区| 91九色02白丝porn| 国产精品三级视频| 国产主播一区二区三区| 欧美日韩激情一区二区| 亚洲欧洲在线观看av| 国产成人在线视频网址| 日韩欧美精品三级| 午夜伦欧美伦电影理论片| av午夜一区麻豆| 久久亚洲精精品中文字幕早川悠里| 亚洲成人动漫在线免费观看| 99精品视频中文字幕| 欧美激情综合五月色丁香小说| 人人狠狠综合久久亚洲| 欧美日韩一区二区三区免费看 | 懂色av一区二区三区免费观看| 欧美一区二区免费观在线| 亚洲国产裸拍裸体视频在线观看乱了| 国产白丝精品91爽爽久久| 精品少妇一区二区三区在线视频| 亚洲成人av福利| 欧美日韩国产综合一区二区 | 国产iv一区二区三区| 欧美电影免费观看高清完整版| 香蕉成人啪国产精品视频综合网 | 一本久道久久综合中文字幕| 国产精品人妖ts系列视频| 国产一区二区三区最好精华液| 日韩欧美中文字幕精品| 免费在线成人网| 日韩一区二区三区免费看| 日本成人在线不卡视频| 欧美一卡二卡三卡四卡| 免费久久精品视频| 日韩欧美二区三区| 国内外精品视频| 久久久777精品电影网影网 | 亚洲精品国久久99热| 91香蕉国产在线观看软件| 玉足女爽爽91| 91福利精品视频| 午夜一区二区三区在线观看| 欧美久久久久久久久久| 日韩1区2区3区| 精品99一区二区| 风间由美一区二区三区在线观看 | 国产精品一区二区不卡| 欧美精彩视频一区二区三区| 成人一区二区三区中文字幕| 一区在线中文字幕| 欧美午夜电影网| 日韩vs国产vs欧美| 久久先锋资源网| 成+人+亚洲+综合天堂| 一区二区三区美女视频| 欧美精品 日韩| 国产主播一区二区| 国产精品拍天天在线| 欧美在线视频全部完| 免费成人美女在线观看| 中文字幕巨乱亚洲| 在线看日本不卡| 精品伊人久久久久7777人| 国产精品麻豆视频| 欧美三级蜜桃2在线观看| 久久99精品网久久| 国产精品女主播在线观看| 欧美亚洲国产一区二区三区va | 色婷婷综合久久久| 日韩激情av在线| 国产日韩欧美高清| 在线观看视频一区二区欧美日韩| 日本视频在线一区| 国产精品久久久爽爽爽麻豆色哟哟| 欧美三级电影在线看| 国产精品99久久久| 亚洲一区二区三区在线看| 久久久三级国产网站| 日本韩国视频一区二区| 精品一区二区三区的国产在线播放 | 日韩三级精品电影久久久| 成人午夜视频网站| 日韩黄色免费网站| 国产精品乱子久久久久| 欧美视频日韩视频在线观看| 国产精品资源网| 丝袜美腿亚洲综合| 亚洲三级在线免费| 2024国产精品视频| 欧美日韩不卡一区二区| 波多野结衣中文字幕一区 |