?? maincanvas.java
字號:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.Graphics;
//import com.nokia.mid.ui.FullCanvas;
final class MainCanvas
extends Canvas
implements Runnable {
//______________公用的控制變量及常量__________________________
static private final int MILLIS_PER_TICK = 120;
public a aMidlet = null;
public int screenW = 0, screenH = 0; //屏幕寬高
public final int CHARW = 17, CHARH = 17; //單個字的寬高
public Font font;
public static final byte
STATE_NONE = 0
, STATE_ERROR = 1
, STATE_LODING = 2
, STATE_SPLASH = 3
, STATE_MENU = 4
, STATE_GAMERUN = 5
, STATE_EXIT = 7
, STATE_HELP = 8
, STATE_OPTION = 9
, STATE_ABOUT = 10
;
long timeTaken; //run()的一個周期所用的時間
private volatile Thread self;
//各種不同的按鍵狀態(tài)
static public final byte //在isPressed()中作為參數(shù)使用
MASK_NUM0 = 0
, MASK_NUM1 = 1
, MASK_NUM2 = 2
, MASK_NUM3 = 3
, MASK_NUM4 = 4
, MASK_NUM5 = 5
, MASK_NUM6 = 6
, MASK_NUM7 = 7
, MASK_NUM8 = 8
, MASK_NUM9 = 9
, MASK_LEFT = 10
, MASK_UP = 11
, MASK_RIGHT = 12
, MASK_DOWN = 13
, MASK_FIRE = 14
, MASK_STAR = 15
, MASK_POUND = 16
, MASK_SOFT1 = 17
, MASK_SOFT2 = 18
, MASK_SOFT3 = 19
;
int keyFlag = 0; //用來存放鍵是否被按下,用位來表示,當鍵按下時把相應位置1,直到按鍵釋放才置0
int keyFlagIm = 0;
//_______________用戶自定義的變量及常量_________________________
TicTacToe pg;
//--------------------------------------------------------------------------------------
// 方法
//--------------------------------------------------------------------------------------
/**
* 構造方法
* @param aMidlet a 向當前畫布傳入一個MIDlet實例
*/
public MainCanvas(a aMidlet) {
this.aMidlet = aMidlet;
screenW = this.getWidth();
screenH = this.getHeight();
font = Font.getDefaultFont(); //moto303
//做相應的初始化操作
pg = new TicTacToe(this);
}
/**
* 啟動線程
*/
synchronized public void begin() {
self = new Thread(this);
self.start();
}
/**
* 結(jié)束線程
*/
synchronized public void stop() {
self = null;
}
/**
* 線程體
*/
public void run() {
final Thread currentThread = Thread.currentThread(); //
while (currentThread == self) {
try {
final long startTime = System.currentTimeMillis();
if (isShown()) {
repaint(); //所有游戲的繪制和邏輯均在里面實現(xiàn)
serviceRepaints(); //寫屏
}
timeTaken = System.currentTimeMillis() - startTime;
if (timeTaken < MILLIS_PER_TICK) {
synchronized (this) {
wait(MILLIS_PER_TICK - timeTaken); //使每個周期大致相等
}
}
else {
currentThread.yield(); //讓出控制權,防止餓死其它線程
}
}
catch (Exception ex) {
// won't be thrown
}
}
//release
}
/**
* 繪制方法
* @param g Graphics 系統(tǒng)調(diào)度線程調(diào)度時傳入的圖像句柄
*/
public void paint(Graphics g) { //由此觸發(fā)Canvas的重繪。
try {
g.setColor(0x000000);
g.fillRect(0, 0, screenW, screenH); //清屏
pg.draw(g);
//debug
int drawY = 10;
g.setColor(0x0000ff);
g.drawString("MSPF:" + timeTaken, 0, drawY += 18, g.TOP | g.LEFT);
g.drawString("keyFlag:" + keyFlag, 0, drawY += 18, g.TOP | g.LEFT);
g.drawString("keyFlagIm:" + keyFlagIm, 0, drawY += 18, g.TOP | g.LEFT);
//end debug
}
catch (Exception e) {}
finally {
keyFlagIm = 0; //在每個paint()的最后,把臨時鍵標志強行復位,因為下個周期,他已不再有作用
}
}
//;----------------------------------------------------------------------
//; 按鍵處理機制 a simple key process arch
//;----------------------------------------------------------------------
/**
* 實現(xiàn)的按鍵方法 ,override Canvas keyPressed
* @param keyCode int 系統(tǒng)事件調(diào)度線程傳入的鍵碼
*/
protected void keyPressed(int keyCode) {
switch (keyCode) {
case Canvas.KEY_NUM0:
keyFlag |= (0x00000001 << MASK_NUM0); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM1:
keyFlag |= (0x00000001 << MASK_NUM1); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM2:
keyFlag |= (0x00000001 << MASK_NUM2); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM3:
keyFlag |= (0x00000001 << MASK_NUM3); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM4:
keyFlag |= (0x00000001 << MASK_NUM4); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM5:
keyFlag |= (0x00000001 << MASK_NUM5); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM6:
keyFlag |= (0x00000001 << MASK_NUM6); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM7:
keyFlag |= (0x00000001 << MASK_NUM7); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM8:
keyFlag |= (0x00000001 << MASK_NUM8); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM9:
keyFlag |= (0x00000001 << MASK_NUM9); // 向左移N位后,即該位置1
break;
case Canvas.KEY_STAR:
keyFlag |= (0x00000001 << MASK_STAR); // 向左移N位后,即該位置1
break;
case Canvas.KEY_POUND:
keyFlag |= (0x00000001 << MASK_POUND); // 向左移N位后,即該位置1
break;
}
switch (getGameAction(keyCode)) {
case Canvas.UP:
keyFlag |= (0x00000001 << MASK_UP); // 向左移N位后,即該位置1
break;
case Canvas.DOWN:
keyFlag |= (0x00000001 << MASK_DOWN); // 向左移N位后,即該位置1
break;
case Canvas.LEFT:
keyFlag |= (0x00000001 << MASK_LEFT); // 向左移N位后,即該位置1
break;
case Canvas.RIGHT:
keyFlag |= (0x00000001 << MASK_RIGHT); // 向左移N位后,即該位置1
break;
case Canvas.FIRE:
keyFlag |= (0x00000001 << MASK_FIRE); // 向左移N位后,即該位置1
break;
}
//給即時按鍵標志賦值,用這個變量可在isPressed()中檢測到是否有短時按鍵產(chǎn)生
//set temp key flag value
keyFlagIm = keyFlag;
}
/**
* 釋放鍵的方法, override Canvas keyReleased method
* @param keyCode int
*/
protected void keyReleased(int keyCode) {
switch (keyCode) {
case Canvas.KEY_NUM0:
keyFlag &= ~ (0x00000001 << MASK_NUM0); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM1:
keyFlag &= ~ (0x00000001 << MASK_NUM1); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM2:
keyFlag &= ~ (0x00000001 << MASK_NUM2); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM3:
keyFlag &= ~ (0x00000001 << MASK_NUM3); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM4:
keyFlag &= ~ (0x00000001 << MASK_NUM4); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM5:
keyFlag &= ~ (0x00000001 << MASK_NUM5); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM6:
keyFlag &= ~ (0x00000001 << MASK_NUM6); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM7:
keyFlag &= ~ (0x00000001 << MASK_NUM7); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM8:
keyFlag &= ~ (0x00000001 << MASK_NUM8); // 向左移N位后,即該位置1
break;
case Canvas.KEY_NUM9:
keyFlag &= ~ (0x00000001 << MASK_NUM9); // 向左移N位后,即該位置1
break;
case Canvas.KEY_STAR:
keyFlag &= ~ (0x00000001 << MASK_STAR); // 向左移N位后,即該位置1
break;
case Canvas.KEY_POUND:
keyFlag &= ~ (0x00000001 << MASK_POUND); // 向左移N位后,即該位置1
break;
}
switch (getGameAction(keyCode)) {
case Canvas.UP:
keyFlag &= ~ (0x00000001 << MASK_UP); // 向左移N位后,即該位置1
break;
case Canvas.DOWN:
keyFlag &= ~ (0x00000001 << MASK_DOWN); // 向左移N位后,即該位置1
break;
case Canvas.LEFT:
keyFlag &= ~ (0x00000001 << MASK_LEFT); // 向左移N位后,即該位置1
break;
case Canvas.RIGHT:
keyFlag &= ~ (0x00000001 << MASK_RIGHT); // 向左移N位后,即該位置1
break;
case Canvas.FIRE:
keyFlag &= ~ (0x00000001 << MASK_FIRE); // 向左移N位后,即該位置1
break;
}
}
/**
* 用來標示是否某個鍵被按了,這里采用增加一個標志位,可以有效防止在tick()栓測的過程中,短暫按鍵不能被程序知道的問題 參考岳振的思想
* to determine what key pressed in this game cycle
*
* @param keyLabel int
* @return boolean
*/
public boolean isPressed(byte keyLabel) {
if ( ( (keyFlagIm >>> keyLabel) & 0x00000001) == 1) { //曾按過也返回真
keyFlagIm &= (~ (0x00000001 << keyLabel)); //把相應的位置為0;
// keyFlagIm = 0; //取一次后把所有的位置0,這種處理方式不支持多鍵同按的系統(tǒng),否則應使用上面一句
return true;
}
if ( ( (keyFlag >>> keyLabel) & 0x00000001) == 1) { //如果此標志位為1則返回真
return true;
}
return false;
}
/**
* 復位鍵狀態(tài),在使用這個鍵后,有時候,我們并不想這個鍵值在下一個循環(huán)中仍有效,因此我們將其復位,防止后
* 面的操作也被這個鍵值所作用。
*
* reset all key flags
*/
public final void resetKey() {
keyFlag = keyFlagIm = 0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -