程序中去除了部分API,沒有線程組的概念,也沒有daemon線程。今天,我們從一個例子出發,來學習J2ME當中的線程的概念。我們選取的例子是俄羅斯方塊。首先,有一些要注意的事項:1.注意一點,要注意在J2me中不要使用浮點" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何使用J2ME中的線程(1)

系統 1602 0

線程在 J2ME 開發中是不可或缺的一部分, J2ME 繼承了 J2SE 中關于 java.lang 中的 Runnable 接口,以及 Thread 類。但是,由于 J2ME 應用的特殊性, J2ME<o:p></o:p>

程序中去除了部分 API ,沒有線程組的概念,也沒有 daemon 線程。 <o:p></o:p>

今天,我們從一個例子出發,來學習 J2ME 當中的線程的概念。我們選取的例子是俄羅斯方塊。首先,有一些要注意的事項: <o:p></o:p>

1. 注意一點,要注意在 J2me 中不要使用浮點數,這樣可以通過編譯,但是不能通過預驗證。因為一般手持設備都無法負擔浮點運算的高負荷。 <o:p></o:p>

2. J2ME 程序當中,絕大多數的空間為圖片所占有,我們可以看到,今天我們的例子沒有任何圖片,僅僅 5k ,如果是開發產品,不可避免的要使用圖片, <o:p></o:p>

? 但是盡量使用壓縮率高的 png 圖片,而且不要太過復雜,因為復雜的圖片會使得圖片變得很大。 <o:p></o:p>

3. 在程序中盡量使用常量特別是位置信息 , 這樣當作修改的時候只要改一個量就可以了 , 而且當移植到其他平臺的時候也會減少很多工作量 . 還有就是顏色 <o:p></o:p>

? 信息等 . 不用每次記憶 , 重新構造 , 因為 J2me 中的顏色和 j2se 的不太一樣 . 沒有常量定義 .<o:p></o:p>

4. 游戲產品經常需要保護版權 , 而當今的很多反編譯工具可以輕而易舉地把 jar 文件的內容反編譯過來 , 因此可以對程序進行模糊化處理 , 使得無法反編譯 <o:p></o:p>

? 或者反編譯后無法理解 . 可以右鍵點擊項目 , 在屬性中選擇 Build|Obfuscating, 選擇模糊化級別 .<o:p></o:p>

5. 講解中我們都使用 NetBeans 作為開發平臺,有關安裝事宜請訪問 www.netbeans.org.<o:p></o:p>

? <o:p></o:p>

好,我們開始吧。 <o:p></o:p>

A. 首先,建立一個新的移動應用程序項目,取名 Tetris, 不要自動創建 Hello 程序,選取 MIDP1.0 CLDC1.0.<o:p></o:p>

B. 新建一個包,方法是右鍵點擊項目,選取 New|Java Package, 取名 Tetris.<o:p></o:p>

C. 新建一個 Midlet ,同上,選取 New|Java Midlet, 取名 TetrisMidlet.<o:p></o:p>

D. 我們需要一個能夠顯示游戲的 Canvas, 因此新建一個 Class 名叫 TetrisCanvas, TetrisMidlet.java 中將 TetrisCanvas 作為當前可以顯示的元素 :<o:p></o:p>

?? 現在的 TetrisMidlet.java 如下 :<o:p></o:p>

????????????? package Tetris;<o:p></o:p>

????????????? <o:p></o:p>

????????????? import javax.microedition.midlet.*;<o:p></o:p>

????????????? import javax.microedition.lcdui.*;<o:p></o:p>

????????????? <o:p></o:p>

????????????? /**<o:p></o:p>

????????????? ? *<o:p></o:p>

????????????? ? * @author ? lin<o:p></o:p>

????????????? ? * @version<o:p></o:p>

????????????? ? */<o:p></o:p>

????????????? public class TetrisMidlet extends MIDlet {<o:p></o:p>

????????????? ??? public void startApp() {<o:p></o:p>

????????????? ??????? Display display = Display.getDisplay( this );<o:p></o:p>

????????????? ??????? // TetrisCanvas extends Canvas which extends Displayable so it can<o:p></o:p>

????????????? ??????? // be displayed directly<o:p></o:p>

????????????? ??????? display.setCurrent( new TetrisCanvas());<o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? public void pauseApp() {<o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? public void destroyApp(boolean unconditional) {<o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? }<o:p></o:p>

????????????? <o:p></o:p>

????????????? 由于 TetrisCanvas 繼承了 Canvas, 所以可以被 TetrisMidlet 所顯示 .<o:p></o:p>

E. ? 這里,我們需要將 TetrisCanvas 繼承 Canvas ,并且實現 Canvas 的接口函數 paint(), 我們現在有了一個 TetrisCanvas 的框架了。 <o:p></o:p>

????????????? package Tetris;<o:p></o:p>

????????????? <o:p></o:p>

????????????? import javax.microedition.lcdui.*;<o:p></o:p>

????????????? public class TetrisCanvas extends Canvas {<o:p></o:p>

????????????? ??? /** Creates a new instance of TetrisCanvas */<o:p></o:p>

????????????? ??? public TetrisCanvas() {<o:p></o:p>

????????????? <o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? <o:p></o:p>

????????????? ??? protected void paint(Graphics g){<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? }<o:p></o:p>

????????????? <o:p></o:p>

????????????? 下面我們需要使得 TetrisCanvas 具有 Thread 的特性,這里有兩種方法,一種是讓 TetrisCanvas 繼承 Thread 類,然后生成它的實例,但是由于它已經 <o:p></o:p>

????????????? 繼承了 Canvas 類,而 Java 中不允許多重繼承,因此,我們在編程當中通常采取第二種做法,也就是讓它實現 Runnable 接口,在成員中聲明一個 Thread<o:p></o:p>

????????????? 成員,實例生成指向自己,然后實現 run 方法。 <o:p></o:p>

????????????? <o:p></o:p>

?????? ?????? 也就是這樣: <o:p></o:p>

????????????? public class TetrisCanvas extends Canvas implements Runnable {<o:p></o:p>

???????????????????? private Thread Blocker = null;<o:p></o:p>

???????????????????? ...<o:p></o:p>

???????????????????? public TetrisCanvas(){<o:p></o:p>

???????????????????? ??? Blocker = new Thread(this);<o:p></o:p>

?????? ??????? Blocker.start();<o:p></o:p>

?????? ??? }<o:p></o:p>

?????? ??????? <o:p></o:p>

???????????????????? ...<o:p></o:p>

???????????????????? public void run(){<o:p></o:p>

?????????????????????????????????? while (Blocker != null) {<o:p></o:p>

?????????????????????????????????? <o:p></o:p>

?????????????????????????????????? }<o:p></o:p>

???????????????????? <o:p></o:p>

???????????????????? }<o:p></o:p>

???????????????????? ...<o:p></o:p>

<o:p>?</o:p>

????????????? }<o:p></o:p>

F. 程序邏輯:下面給出程序清單。程序中我們使用一個數組來存儲方塊的信息 , 一共有十九種 , 還有一個數組來存儲當前的畫面方格的內容 . 在程序中 <o:p></o:p>

?? 有一個 paint 方法來實現重畫 , 注意繪制的先后次序 , 當程序規模變得很大的時候 , 重畫的效率就非常重要 , 需要進行優化 . 我們在程序中使用了背景 ,<o:p></o:p>

?? 在沒有背景的情況下 , 程序僅 5k, 采用背景后 , 程序 47k, 可見對圖片的優化至關重要 .<o:p></o:p>

<o:p>?</o:p>

????????????? /*<o:p></o:p>

????????????? ? * TetrisCanvas.java<o:p></o:p>

????????????? ? *<o:p></o:p>

????????????? ? * Created on 2005 7 13 , 上午 11:31<o:p></o:p>

????????????? ? *<o:p></o:p>

????????????? ? * To change this template, choose Tools | Options and locate the template under<o:p></o:p>

????????????? ? * the Source Creation and Management node. Right-click the template and choose<o:p></o:p>

????????????? ? * Open. You can then make changes to the template in the Source Editor.<o:p></o:p>

????????????? ? */<o:p></o:p>

????????????? <o:p></o:p>

????????????? package Tetris;<o:p></o:p>

????????????? <o:p></o:p>

????????????? import java.util.*;<o:p></o:p>

????????????? import java.lang.Math;<o:p></o:p>

????????????? import javax.microedition.lcdui.*;<o:p></o:p>

????????????? <o:p></o:p>

????????????? <o:p></o:p>

????????????? /**<o:p></o:p>

????????????? ? *<o:p></o:p>

????????????? ? * @author lin<o:p></o:p>

????????????? ? */<o:p></o:p>

????????????? public class TetrisCanvas extends Canvas implements Runnable{<o:p></o:p>

????????????? ??? private Thread Blocker = null;<o:p></o:p>

????????????? ??? private Random generator;<o:p></o:p>

????????????? ??? private int FutureBlockType, BlockType,LastType,LastX,LastY,BlockX,BlockY ;<o:p></o:p>

????????????? ??? private int BlockLines,BlockScore;<o:p></o:p>

????????????? ??? private int BlockSpeed,CurSpeed;<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? private static final int COLOR_GRAY ????? = 0x00eeeeee;<o:p></o:p>

????????????? ??? private static final int COLOR_RED ?????? = 0x00ff0000;<o:p></o:p>

????????????? ??? private static final int COLOR_BLACK ???? = 0x00000000;<o:p></o:p>

????????????? ??? private static final int COLOR_WHITE ???? = 0x00ffffff;<o:p></o:p>

????????????? ??? private static final int COLOR_BLUE ????? = 0x000000ff;<o:p></o:p>

????????????? ??? private static final int COLOR_LIGHT_BLUE= 0x0089a5d1;<o:p></o:p>

????????????? ??? private static final int COLOR_DARK_GRAY = 0x00808080;<o:p></o:p>

????????????? ??? private static final int COLOR_BACKGROUND= COLOR_LIGHT_BLUE;<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? private static final int BLOCK_SIZE = 7;<o:p></o:p>

????????????? ??? private static final int CANVAS_SIZE_WIDTH = 12;<o:p></o:p>

????????????? ??? private static final int CANVAS_SIZE_HEIGHT = 22;<o:p></o:p>

????????????? ??? private static final int CANVAS_OFFSET_X = 5;<o:p></o:p>

????????????? ??? private static final int CANVAS_OFFSET_Y = 7;<o:p></o:p>

????????????? <o:p></o:p>

????????????? ??? /**<o:p></o:p>

????????????? ???? * The paint status.<o:p></o:p>

????????????? ???? */<o:p></o:p>

????????????? ??? boolean ISCLEAR = false;<o:p></o:p>

????????????? ??? boolean ISDOWN = false;<o:p></o:p>

????????????? ??? boolean ISDEL = false;<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? /**<o:p></o:p>

????????????? ???? * the block information matrix.<o:p></o:p>

????????????? ???? */<o:p></o:p>

????????????? ??? int BlockInfo[][]={{1,0,1,1,1,2,1,3,0xff0000,2},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,1,2,1,3,1,0xff0000,4},<o:p></o:p>

??????????????????????????? ?????? {0,0,0,1,1,1,1,2,0x0000ff,2},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,0,1,1,2,0,0x0000ff,3},<o:p></o:p>

??????????????????????????? ?????? {0,1,0,2,1,0,1,1,0x00ff00,2},<o:p></o:p>

??????????????????????????? ?????? {0,0,1,0,1,1,2,1,0x00ff00,3}, ???????? <o:p></o:p>

??????????????????????????? ?????? {0,0,0,1,1,0,1,1,0xffff00,2},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,0,1,1,1,2,0x00ffff,2},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,0,1,1,2,1,0x00ffff,3},<o:p></o:p>

??????????????????????????? ?????? {1,0,1,1,1,2,2,1,0x00ffff,3},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,1,1,2,2,1,0x00ffff,3},<o:p></o:p>

??????????????????????????? ?????? {0,1,0,2,1,1,2,1,0xff00ff,3},<o:p></o:p>

??????????????????????????? ?????? {0,0,1,0,1,1,1,2,0xff00ff,3},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,1,2,0,2,1,0xff00ff,3},<o:p></o:p>

??????????????????????????? ?????? {1,0,1,1,1,2,2,2,0xff00ff,3},<o:p></o:p>

??????????????????????????? ?????? {0,0,0,1,1,1,2,1,0xffffff,3},<o:p></o:p>

??????????????????????????? ?????? {1,0,1,1,1,2,2,0,0xffffff,3},<o:p></o:p>

??????????????????????????? ?????? {0,1,1,1,2,1,2,2,0xffffff,3},<o:p></o:p>

??????????????????????????? ?????? {0,2,1,0,1,1,1,2,0xffffff,3},<o:p></o:p>

??????????????????????????? ?????? };<o:p></o:p>

????????????? ??? // Gridmatrix 中只存儲顏色信息 <o:p></o:p>

????????????? ??? int Gridmatrix[][]=new int[CANVAS_SIZE_HEIGHT][CANVAS_SIZE_WIDTH];<o:p></o:p>

????????????? <o:p></o:p>

????????????? ??? /**<o:p></o:p>

????????????? ???? * Initialize the applet. Resize and load images.<o:p></o:p>

????????????? ???? */<o:p></o:p>

????????????? ??? public void init() {<o:p></o:p>

????????????????????????????????????????? BlockType=Math.abs(generator.nextInt()%19);<o:p></o:p>

????????????????????????????????????????? FutureBlockType=Math.abs(generator.nextInt()%19);<o:p></o:p>

????????????????????????????????????????? LastType=BlockType;<o:p></o:p>

?????????????????????????????????? ??????? <o:p></o:p>

????????????????????????????????????????? BlockLines=0;<o:p></o:p>

????????????????????????????????????????? BlockScore=0;<o:p></o:p>

????????????????????????????????????????? BlockSpeed=1;<o:p></o:p>

????????????????????????????????????????? CurSpeed=BlockSpeed;<o:p></o:p>

????????????? ??????? BlockX=4; ??? ? LastX=BlockX;<o:p></o:p>

????????????????????????????????????????? BlockY=0; ???? LastY=BlockY;<o:p></o:p>

????????????? ??????? <o:p></o:p>

????????????? ??????? // 初始化 Gridmatrix 矩陣,內容為帶邊框的主繪圖區。 <o:p></o:p>

????????????????????????????????????????? for(int i=0;i<CANVAS_SIZE_HEIGHT;i++)<o:p></o:p>

????????????????????????????????????????? ??? for(int j=0;j<CANVAS_SIZE_WIDTH;j++)<o:p></o:p>

????????????????????????????????????????? ??? Gridmatrix[i][j]=0;<o:p></o:p>

????????????????????????????????????????? for(int i=0;i<CANVAS_SIZE_WIDTH;i++) <o:p></o:p>

????????????? ??????????? Gridmatrix[CANVAS_SIZE_HEIGHT-1][i]=COLOR_DARK_GRAY;<o:p></o:p>

????????????????????????????????????????? for(int i=0;i<CANVAS_SIZE_HEIGHT;i++) {<o:p></o:p>

??????????????????????????? ???? ??????????? Gridmatrix[i][0]=COLOR_DARK_GRAY;<o:p></o:p>

??????????????????????????? ???? ??????????? Gridmatrix[i][11]=COLOR_DARK_GRAY;<o:p></o:p>

????????????????????????????????????????? } ? <o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? ??? <o:p></o:p>

????????????? ??? /** Creates a new instance of TetrisCanvas */<o:p></o:p>

????????????? ??? public TetrisCanvas() {<o:p></o:p>

????????????? ??????? generator = new Random( System.currentTimeMillis() );<o:p></o:p>

????????????? ??????? init();<o:p></o:p>

????????????? ??????? Blocker = new Thread(this);<o:p></o:p>

????????????? ??????? Blocker.start();<o:p></o:p>

????????????? ??? }<o:p></o:p>

????????????? <o:p></o:p>

如何使用J2ME中的線程(1)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月天婷婷缴情五月免费观看 | 幻女bbwxxxxyounu | 国产精品成人一区二区 | 搡女人免费的视频 | 日韩欧美国产成人 | 亚洲欧美国产精品久久久 | 四虎国产精品成人永久免费影视 | 另类图片综合 | 天天射狠狠干 | 日产国产精品久久久久久 | 亚洲三级在线免费观看 | 综合欧美日韩 | 在线看日韩 | 日韩一区二区三区在线 | 国产日韩欧美亚洲 | 欧美综合图区亚欧综合图区 | 久久精品免看国产 | 欧美日本黄色片 | 久久久噜久噜久久gif动图 | 亚洲区中文字幕 | 9984四虎永久免费网站 | 国产理论视频 | 亚洲最大免费视频网 | 久99久精品视频免费观看v | se94se亚洲欧美在线 | 三中文乱码视频 | 久草欧美视频 | 夜夜爽夜夜操 | 三级西施| 92福利网 | 996热精品视频在线观看 | 大色综合色综合资源站 | 男人你懂的网站 | 91在线免费观看网站 | 国产精品亚洲欧美一区麻豆 | 夜夜摸天天操 | 欧美最猛的24k毛片视频 | 在线观看自拍视频 | 国产亚洲精品一区二区 | 国内女高中生一级毛片 | 伊人婷婷色香五月综合缴缴情 |