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

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

?? gamecanvas.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一区二区三区免费野_久草精品视频
波多野结衣一区二区三区| 亚洲一区二区黄色| 欧美一级二级三级乱码| 色吧成人激情小说| 欧日韩精品视频| 欧美偷拍一区二区| 欧美精品自拍偷拍| 欧美一卡2卡三卡4卡5免费| 在线观看91精品国产麻豆| 欧美丰满高潮xxxx喷水动漫| 欧美美女bb生活片| 欧美成va人片在线观看| 久久综合网色—综合色88| 久久久国际精品| 国产精品全国免费观看高清| 国产精品动漫网站| 亚洲精品五月天| 三级成人在线视频| 国产一区二区三区| 9人人澡人人爽人人精品| 在线观看亚洲专区| 日韩一区和二区| 国产精品网站导航| 一区二区三区在线免费播放| 亚洲第四色夜色| 国产中文字幕精品| 日本韩国一区二区| 日韩精品一区二区三区四区视频| 国产校园另类小说区| 亚洲日本青草视频在线怡红院| 亚洲精品国产高清久久伦理二区| 亚洲成人资源网| 国产精品18久久久久久久网站| 国产91丝袜在线播放九色| 99久久精品情趣| 欧美一级欧美三级在线观看| 国产校园另类小说区| 亚洲一区在线免费观看| 狠狠色丁香九九婷婷综合五月| 91在线视频播放地址| 日韩一区二区电影在线| 中文字幕一区二区三区不卡在线 | 91在线看国产| 这里是久久伊人| 中文字幕亚洲一区二区va在线| 亚洲一区二区三区视频在线| 国产精品一二三在| 欧美久久久一区| 中文字幕中文字幕一区| 激情文学综合丁香| 欧美精品视频www在线观看| 国产欧美精品一区二区三区四区| 性欧美大战久久久久久久久| 99视频精品全部免费在线| 精品国产一区二区三区不卡| 亚洲一级片在线观看| 99re视频这里只有精品| 国产日韩av一区| 精品一区二区三区在线视频| 欧美三级日韩三级| 亚洲精品中文字幕在线观看| 风间由美一区二区av101 | 久久久精品黄色| 日本大胆欧美人术艺术动态 | 在线视频一区二区三| 国产日韩欧美在线一区| 久久99久久久欧美国产| 欧美一区二区在线视频| 香蕉久久夜色精品国产使用方法 | 亚洲国产日韩一级| 日本久久一区二区三区| 亚洲欧美国产高清| 91一区二区三区在线观看| 国产精品久久久久一区二区三区| 国产精品一区二区在线看| 日韩精品一区二区三区视频在线观看 | 国产成人免费在线视频| 久久婷婷久久一区二区三区| 麻豆精品一区二区综合av| 欧美一二三四在线| 狠狠色综合日日| 久久综合九色综合97婷婷女人| 理论电影国产精品| 精品免费日韩av| 国产一区二区三区观看| 欧美国产精品专区| av午夜精品一区二区三区| 亚洲色图都市小说| 欧美午夜一区二区三区 | 久久国产精品色| 久久蜜桃香蕉精品一区二区三区| 国产精品夜夜爽| 亚洲色图欧美激情| 在线播放中文一区| 久久成人麻豆午夜电影| 日本一区二区三区在线观看| 成人免费视频一区| 亚洲国产va精品久久久不卡综合| 91精品午夜视频| 国产suv精品一区二区883| 亚洲日本在线视频观看| 日韩一区二区在线观看视频播放| 老司机精品视频线观看86 | 亚洲美女免费视频| 欧美一区二区三区影视| 国产麻豆精品在线观看| 亚洲精品视频免费看| 欧美一区二区三区小说| 暴力调教一区二区三区| 婷婷成人综合网| 亚洲国产精品99久久久久久久久| 色婷婷激情一区二区三区| 麻豆极品一区二区三区| 国产精品视频一二| 欧美一区二区三区免费观看视频| 丁香婷婷综合网| 婷婷国产v国产偷v亚洲高清| 国产精品理伦片| 精品免费国产二区三区| 在线一区二区视频| 成人性色生活片| 蜜臀久久99精品久久久画质超高清| 国产精品你懂的在线欣赏| 制服丝袜中文字幕一区| 99精品欧美一区| 国产一区二三区好的| 日韩精品亚洲一区二区三区免费| 欧美国产精品一区二区三区| 777xxx欧美| 欧美亚洲国产一区二区三区va| 国产精品18久久久久久久网站| 视频在线在亚洲| 亚洲乱码国产乱码精品精小说| 精品国产123| 日韩一区二区麻豆国产| 欧美日韩国产综合草草| 色就色 综合激情| fc2成人免费人成在线观看播放| 久久99精品久久久久久久久久久久| 一区二区三区不卡视频在线观看| 日本一区二区不卡视频| 2020国产精品自拍| 在线电影一区二区三区| 欧美午夜影院一区| 91九色最新地址| 色婷婷激情综合| 色偷偷一区二区三区| 91香蕉国产在线观看软件| 成人黄色av网站在线| 国产成人精品亚洲日本在线桃色| 久久精品国产亚洲a| 蜜桃免费网站一区二区三区| 日本欧美一区二区三区乱码| 婷婷开心激情综合| 日韩专区在线视频| 日本欧美一区二区| 激情欧美一区二区| 国产精品一区三区| 国产91清纯白嫩初高中在线观看| 国产很黄免费观看久久| 成人免费毛片a| 9色porny自拍视频一区二区| 97成人超碰视| 欧美又粗又大又爽| 在线综合视频播放| 欧美一级二级在线观看| 久久亚洲精品国产精品紫薇| 国产三级三级三级精品8ⅰ区| 日本一区二区免费在线观看视频 | 欧美成人三级在线| 久久久久久久久久久久电影| 国产婷婷精品av在线| 国产精品久久免费看| 亚洲线精品一区二区三区| 麻豆国产精品官网| 国产麻豆成人精品| 91亚洲男人天堂| 欧美日韩免费在线视频| 久久伊人蜜桃av一区二区| 亚洲欧美在线视频观看| 亚洲一二三四在线观看| 麻豆中文一区二区| 成人激情av网| 欧美日韩综合不卡| 国产夜色精品一区二区av| 一区二区三区四区在线播放| 蜜桃视频免费观看一区| 波多野结衣中文一区| 91麻豆精品国产91久久久久久久久 | 综合久久给合久久狠狠狠97色| 亚洲午夜av在线| 国产麻豆精品在线| 欧美另类z0zxhd电影| 国产欧美日韩麻豆91| 亚洲成人在线网站| av电影在线不卡| 日韩久久免费av| 亚洲综合无码一区二区| 成人激情动漫在线观看| 精品免费国产二区三区|