久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手机游戏毕业设计论文

發布時間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手机游戏毕业设计论文 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1? 緒論

1.1 手機軟件現狀

在信息社會中,手機及其他無線設備越來越多的走進普通百姓的工作和生活,隨著信息網絡化的不斷進展,手機及其他無線設備上網絡勢在必行。但是傳統手機存在以下弊端:

1.? 傳統手機出廠時均由硬件廠商固化程序,程序不能增加、刪除,有了錯誤也不能更新、修改,若要增加新功能必須另換一部手機。

2.? 傳統手機訪問互聯網是通過WAP(Wireless Application Protocal),所有網絡資源必須接通網絡才能在線訪問,非常耗時、費用亦很高。

而Java技術在無線應用方面的優勢非常明顯:

1.? 應用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大。

2.? Java技術提供了一個類庫,它使的應用開發商可以創建更為直覺、豐富的用戶界面(GUI);

3.? Java技術使網絡帶寬的應用更為有效,因為應用程序可以下載到器件上,并在本地運行,僅僅是在連接到服務器時才會占用網絡帶寬。

基于以上分析,Java手機將是未來手機的發展方向,是業界的熱點。

1.2 J2ME介紹

雖然 Java 已經被用到許多企業級軟體上,可是其實骨子里面還是非常適合用在嵌入式系統之中。Java平臺演進到Java2后,Java平臺分別針對不同領域的需求被分成四個版本,亦即J2EE、J2SE、J2ME以及JavaCard。其中J2ME定位在消費性電子產品的應用上。這個版本針對資源有限的電子消費產品的需求精簡核心類庫,并提供了模塊化的架構讓不同類型產品能夠隨時增加支持的能力。這個版本的應用層面相當廣泛,會是未來Java平臺發展的重點項目。

J2ME在1999年的JavaOne開發人員大會上初次亮相,它的目標是面向智能無線設備和小型計算機設備的開發人員。J2ME的一個關鍵優點是,J2ME與所有支持Java的設備都是兼容的。支持Java的設備就是任何運行Java虛擬機器的計算機。Motorola、Nokia等生產廠商都生產支持Java的設備。、

J2ME平臺是由配置(Configuration)和簡表(Profile)構成的。配置是提供給最大范圍設備使用的最小類庫集合,在配置中同時包含Java虛擬機。簡表是針對一系列設備

提供的開發包集合。在J2ME中還有一個重要的概念是可選包(Optional Package),它是針對特定設備提供的類庫,比如某些設備是支持藍牙的,針對此功能J2ME中制定了JSR82(Bluetooth API)提供了對藍牙的支持。

目前,J2ME中有兩個最主要的配置,分別是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。

作為第一個面對小型設備的Java應用開發規范,CLDC是由包括Nokia,Motorola和Siemens在內的18家全球知名公司共同協商完成的。CLDC是J2ME核心配置中的一個,可以支持一個或多個profile。其目標主要面向小型的、網絡連接速度慢、能源有限(主要是電池供電)且資源有限的設備,如手機、PDA等。

而CDC則是主要用于運算能力相對較佳、在電力供應上相對比較充足的嵌入式裝置 (比方說冷氣機、電冰箱、電視機機頂盒 (set-top box))

1.3 手機游戲應具有的特征

??? 一個手機游戲應該具有以下特征:

易于學習: 既然手機游戲面向的是普通消費者而不是計算機專家,那么他們不可能深入的學習游戲技巧。消費者不會花幾個小時去研究一個3元的手動操作的游戲。保持游戲的簡單是最基本的要求。

可中斷性: 多任務處理是手機生活方式的基本特征。手機用戶常常在任務(如等一個電子郵件或者等車)之間有一小段時間。而游戲、日歷管理、通訊和工作數據訪問使用的是同一個設備。所以一個好的手機游戲應該提供短時間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換。

基于訂閱:手機游戲的盈利成功取決于他們巨大的使用量。一開始開發和設計每個游戲都是昂貴的。如果一個手機游戲開發者要贏利的話,重要的是:同一個游戲引擎,多個標題,基本的故事情節類似。基于訂閱的游戲是不斷產生收入的最好方法。

豐富的社會交互: 不管一個游戲設計得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別的玩家合作以增強所玩游戲的智力和隨機性。在今天紛繁復雜的多玩家游戲中具有豐富社會交互的游戲證明是成功的。

利用手機技術的優點: 巨額的手機技術研發費用都花在提高設備和網絡的可用性和可靠性上面。因此,手機設備硬件和網絡協議與桌面/控制臺世界(如全球定位系統(GPS)擴展、條形碼掃描儀、和短消息服務(SMS)/多媒體信息服務(MMS)通訊)有著非常大的差別。好的手機游戲應該利用那些更新的設備特征和網絡基礎設備的優點。

1.4 本游戲背景介紹

在抗戰中,由國民政府領導的中國空軍是所有國民黨軍隊中抗戰最為徹底,也最為英勇的部隊,雖然開戰之初力量懸殊,但是面對窮兇極惡的日本侵略者,他們毫不畏懼,視死如歸,全力以赴投身到民族救亡的偉業中去,用自己的鮮血和生命譜寫了中華民族最為豪邁的詩篇。自一九三二年二月五日“一·二八”事件始,至一九四五年八月十四日止,抗戰期間,共出動飛機一千一百二十八批,八千八百四十七架次,擊落敵機五百二十九架,擊傷敵機一百一十架,炸毀敵機二百二十七架。同時,中國空軍空戰中一共犧牲空勤人員六百六十一名。

我至今仍然清楚的記得,在抗日戰爭即世界反法西斯戰爭勝利50周年的時候,我在一本描述抗戰空軍的書里第一次看到閻海文烈士那年青的面孔時所帶來的震撼,第一次看到高志航、沈崇海等空軍烈士的事跡時所帶來的感動,第一次聽說碧山空戰時的無奈。

時至今日,已經很少有人能夠記得在中國的天空獻身的抗日英雄們,我只能引用下面這句話來表達我的心情:“你們的名字無人知曉,你們的業績與世長存! ”

我的這款游戲取名為《覽橋風光》,以紀念從覽橋中央航校走出的英雄們。

1.5 本章小結

引言和第一章中介紹了手機在無線應用方向的當今概況,J2ME的相關內容,分析了J2ME在手機軟件開發中起的重要作用,描述了本論文的相關背景。

?

?

?

?

?

?

?

?

?

?

2? 開發環境及相關技術的介紹

2.1? 開發環境

操作系統:Microsoft Windows XP

程序語言:Java 2

開 發 包:Java(TM) 2 Standard Edition (5.0)

??????? Sun Micro. J2ME?? Wireless Tool Kit 2.2

IDE:??? Eclipse 3.01

2.2? Java語言特點

1. 平臺無關性

Java引進虛擬機原理,并運行于虛擬機,實現不同平臺之間的Java接口。Java的數據類型與機器無關。

2. 安全性

Java的編程類似C++,但舍棄了C++的指針對存儲器地址的直接操作,程序運行時,內存由操作系統分配,這樣可以避免病毒通過指針入侵系統。它提供了安全管理器,防止程序的非法訪問。

3. 面向對象

??? Java吸收了C++面向對象的概念,將數據封裝于類中,實現了程序的簡潔性和便于維護性,使程序代碼可以只需一次編譯就可反復利用。

4. 分布式

Java建立在TCP/IP網絡平臺上,提供了用HTTP和FTP協議傳送和接收信息的庫函數,使用其相關技術可以十分方便的構建分布式應用系統。

5. 健壯性

Java致力與檢查程序在編譯和運行時的錯誤,并自動回收內存,減少了內存出錯的可能性。Java取消了C語言的結構、指針、#define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動回收不用的內存空間。

2.3? 關于ECLIPSE

??? Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發環境。幸運的是,Eclipse 附帶了一個標準的插件集,包括 Java 開發工具(Java Development Tools,JDT)。

雖然大多數用戶很樂于將 Eclipse 當作 Java IDE 來使用,但 Eclipse 的目標不僅限于此。Eclipse 還包括插件開發環境(Plug-in Development Environment,PDE),這個組件主要針對希望擴展 Eclipse 的軟件開發人員,因為它允許他們構建與 Eclipse 環境無縫集成的工具。由于 Eclipse 中的每樣東西都是插件,對于給 Eclipse 提供插件,以及給用戶提供一致和統一的集成開發環境而言,所有工具開發人員都具有同等的發揮場所。

這種平等和一致性并不僅限于 Java 開發工具。盡管 Eclipse 是使用 Java 語言開發的,但它的用途并不限于 Java 語言;例如,支持諸如 C/C++、COBOL 和 Eiffel 等編程語言的插件已經可用,或預計會推出。Eclipse 框架還可用來作為與軟件開發無關的其他應用程序類型的基礎,比如內容管理系統。Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發環境。

2.4 關于Wireless Tool Kit

WTK(Wireless Tool Kit)是Sun公司針對J2ME推出的用于手機和Palm等移動設備的開發包,是除手機廠商的專用開發包外唯一的手機模擬器開發包。它通用性高,開發出的應用程序可保證能運行在大部分設備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強大的功能和完善的調試手段,但它提供運行模擬器的最基本組件,是其他IDE需集成采用的必備元素。

2.5 Java Appication Manager

手機中負責調配程序運行資源的管理后臺是Java Application Manager。它所使用的傳輸媒體可以是紅外線、網絡、以及其他可用來傳輸的媒體。Java Application Manager 會從網絡上下載代表該Application Suite 的JAR 檔,接著在手機上安裝此MIDlet Suite,然后在手機開始執行該應用程序。

2.6 本章小結:

第二章介紹了Java語言的特點、本程序的開發環境及其相關工具的原理和使用。

?

3? 程序結構、思想和相關技術

3.1 本程序需要解決的主要技術問題

1.? 游戲程序是一項精度要求很高的程序系統,因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應,若有絲毫的差別都將很容易導致程序在運行不久后可能出現嚴重錯誤,甚至死循環。因此,其邏輯設計應當相當嚴謹,需將所有可能發生的事件及意外情況考慮在設計中。

2.? 游戲中為了美觀,適用性強,可能需要采用外部文件引入的圖片貼圖,有關貼圖,在MIDP2.0中提供了用于增強游戲功能的game包,使得解決靜態或動態、畫面背景、屏幕刷新的雙緩沖等都有較好的解決方案。

3. 玩家飛機的運行可以通過鍵盤響應事件控制,但敵方則因為是自動運行,就需要有一定的智能性;敵人飛機的運行算法也要進行相關的設置,已免游戲過于簡單。

4.對于雙方發射的子彈應該賦予不同的速度,同時,程序應該設定敵人飛機的子彈不與敵人的飛機進行碰撞檢測,已增加游戲的可玩性。

5. 雙方的飛機在前進時也需要考慮到是否碰撞到對方飛機,以免重疊運行,造成許多物理上不可能的情況,缺乏真實感。每一次刷新頁面、每前進一步都需要進行相關的碰撞檢測。

6.為了增加界面的美觀,在程序中添加了白云。由于手機屏幕大小有限,所以白云的數量和出現的位置要經過相關的設置,才能實現白云不規則出現的效果。

7.? 游戲的地圖不可能通過繪圖來解決。否則,不僅難于控制和處理過多的元素,也會因過多的大型圖片而不能限制程序的大小,失去手機上程序的原則和Java的優勢。

8.? Java是基于虛擬機的半解釋型編譯系統,其執行效率較C++等完全編譯后的程序會低很多,程序如果不進行精簡和優化,將可能導致運行的不流暢。除開發過程中對結構上的控制、變量的使用、算法的優化等優化外,還可以使用混淆器(Obfuscator)進行程序打包后的優化。

9.? 游戲的結束、開始、動態信息畫面作為構成一個程序都是必不可少的重要部分。良好的用戶界面更是吸引用戶的硬指標,相關的美術構圖和人性化設置也需要有一定的考慮。

以上相關技術細節和整體流程將分別在以下小節闡述。

3.2? 程序流程

消減狀態

(Destroyed)

停止狀態

(Paused)

運行狀態

(Active)

StartApp()

DestroyApp()

呼叫MIDlet的構造函數

DestroyApp()

PauseApp()

圖3-1? MIDlet的流程

MIDlet suite是MIDP應用程序的最小單位,JAM負責將手機內的MIDlet suite以圖形化的方式呈現,讓用戶能夠選取欲執行的MIDlet suite,一旦選取了某個MIDlet suite,操作系統就會激活KVM執行里面的MIDlet。MIDlet及相關的支持類組成了MIDP應用程序的實際內容。而

每個MIDlet都必須繼承javax.microedition.midlet.MIDlet這個抽象類。在MIDP規范中定義了MIDlet的生命周期,以及可以存在的三種狀態,包括Paused、Active以及Destroyed,每一個MIDlet在任何時刻只可能處于其中的一個狀態。這三種狀態的轉換關系如圖3-1所示:MIDlet有三個狀態,分別是pause、active和destroyed。在啟動一個MIDlet的時

候,應用管理軟件會首先創建一個MIDlet實例并使得他處于pause狀態,當startApp()方法被調用的時候MIDlet進入active狀態,也就是所說的運行狀態。在active狀態調用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet進入destroyed或者pause狀態。值得一提的是destroyApp(boolean unconditional)方法,事實上,當destroyApp()方法被調用的時候,AMS通知MIDlet進入destroyed狀態。在destroyed狀態的MIDlet必須釋放了所有的資源,并且保存了數據。如果unconditional為false的時候,MIDlet可以在接到通知后拋出MIDletStateChangeException而保持在當前狀態,如果設置為true的話,則必須立即進入destroyed狀態。

本程序采用面向對象的設計模式,對游戲中的所有物體賦予對象的概念和屬性。運行程序后允許用戶選擇執行選項菜單,在開始游戲后將先從外部文件載入地圖文件,對背景的所有物體進行繪圖。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術對屏幕重繪,實時反映整個游戲的進行狀態。

游戲開始后先繪制地圖,并將各個對象實例化。在主程序運行的線程中,游戲中所有的對象都應該運行在同一個線程下。當敵人或者用戶的子彈達到射程范圍后,并不刪除子彈對象,而是使用setVisable(false)使其不能顯示,當用戶或敵人在次發射子彈時,只需使用setVisable(true)設置成可以顯示即可。在屏幕重繪的主程序中,將在每次的循環中判斷若干事件,以便程序進入相關的分支執行相關的反應代碼。如:玩家剩余飛機數是為0、敵人、玩家飛機是否被擊中、屏幕上相關信息的繪制等。

程序為需要完成獨立功能的模塊設置了單獨的類。lzhhdm類繼承自Midlet,gameScrenn類、MenuScreen類繼承自GameCanvas,mybullets繼承自Sprite類。載入程序后首先啟動的是程序介紹的信息畫面。點擊ok后調用MenuScreen類實現菜單。

如果選擇進入游戲,則調用gameScreen類,并且中止MenuScreen類中的線程運行,已提高運行速度。

Mybullets類為玩家子彈類。

3.3 Canvas類

為了能有程序開發人員控制接口的外觀和行為,需要使用大量的初級用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽象類進行繪圖。從程序開發的觀點看,Canvas類可與高級Screen類交互,程序可在需要時在Canvas中摻入高級類的組件。Canvas提供了鍵盤事件、指點桿事件(如果設備支持),并定義了允許將鍵盤按鍵映射為游戲控制鍵的函數。鍵盤事件由鍵代碼指定,但這樣控制游戲會導致缺乏通用性,并不是每個設備的鍵盤布局都適合游戲的操作。應當將鍵代碼轉換為游戲鍵的代碼,以便硬件開發商能定義他們自己的游戲鍵布局。

3.4 Graphics類

Graphics類提供了簡單的2D繪圖功能。它具有24位深度色彩的繪制能力,以三原色分別各占一個字節表示其顏色。程序只能在paint()函數中使用Graphics繪制,GameCanvas可調用getGraphics()函數直接繪制在緩沖區上,可以在任何時間請求傳輸到前臺。其對象會被傳給Canvas的paint()函數,以便最終顯示。

3.5 MIDP1.0技術下的繪制背景技術

在沒有MIDP2.0前,進行游戲繪圖一般需要手動編程使用雙緩沖。需要在paint()方法內將所想要畫的圖形畫在一張預先準備好的背景上,等所有繪圖操作都完成后再將背景的數據拷貝到實際的屏幕上。Image類提供了一個建立背景的靜態方法createImage(int width, int height),再利用getGraphics()方法取得屬于這個背景的Graphics對象,所進行的繪圖操作都會作用在背景上,等到全部的繪圖操作完成后,再調用drawImage()方法將背景的數據復制到實際顯示的屏幕上。

這樣的技術在繪制動畫時特別有用。繪制動畫時經常需要不斷地更新畫面,而更新畫面的操作就是先將屏幕以fillRect()的方式清除,再將下一張圖片畫在屏幕上,然而反復的清除及重繪會造成屏幕的閃爍現象(flicker),因此使用雙重緩沖的好處就是在背景進行這個清除及重繪的操作,再將完成的繪圖拷貝到屏幕上,由于用戶看不到清除的操作,因此就不會出現閃爍的現象了。不過在某些MIDP的實現上已經加上了雙重緩沖的支持,因此在處理前應先利用Canvas類的isDoubleBuffer()方法來判斷。

3.6 MIDP2.0新增的GameCanvas包

??? J2ME的流行促進幾個運營商和制造商開發了一些支持游戲的類,但是,這卻造成了游戲缺乏可移植性的問題,例如,很難將使用Siemens的Sprite類的游戲移植到Nokia上。

??? 在MIDP2.0版本發布后,這些游戲移植性問題初步得到了解決。MIDP2.0新加入了

GameCanvas、Sprite、Layer、LayerManager、TiledLayer五個與游戲開發相關的類。其中 Layer類一般不會直接用到。

??? Game類的出現不僅降低了錯誤出現的幾率,也使游戲代碼變的更小,因為開發者不需要自己編寫象Sprite這種例子。下面將簡要介紹Game類。

?? ?GameCanvas類繼承自Canvas,所以具有Canvas所具有的功能,還額外增加了一些便于游戲設計的功能。比如: GameCanvas類直接提供了getKeyStates(),使程序員可以在同一個線程自己偵測按鍵的狀態。GameCanvas類提供了flushGraphics()的功能,實現了雙緩沖技術。

??? 所謂的Sprite,就是畫面上獨立移動的圖形。

Sprite類是繼承自Layer的用于存儲多楨的基本可視元素。不同的frame可交相顯示,構成動態的效果。圖片可翻轉、顛倒、由一個主角圖片就可以方便的得到所有方向的顯示狀態,相比原先只能使用Canvas繪圖,需要將所有方向的主角圖象都繪制在png圖象中簡化了許多。Sprite也可以從整合的圖象中讀圖,讀圖時將把大圖分解為若干等寬等高的小圖。每個小圖按照其排列順序有相應的序號,在程序中調用其序號,就可以繪制出相應的圖片。本程序中的雙方飛機、子彈、白云都由Sprite繼承得到。

LayerManager提供控制整體畫面層的控制。它包括了一系列自動獲取了代號和位置的層,簡化了各層加入游戲畫面的過程,提供了自動排序和繪制的能力。

LayerManager存儲了一個層的列表,新的層可以用函數附加、刪除和插入。層的序號相當于坐標的Z軸,0層表示最接近用戶視覺,層數越高,離用戶越遠。層號總是連續的,即使有中間的層被移除,其他層的序號會作相應的調整以保持整體的完整性。LM中的View Window控制著與LM相對坐標的可視區域。改變View Window的位置可以制造出滾動屏幕的效果。

TiledLayer是有一組圖象格元素組成的整塊虛擬圖象。該類使不需要高分辨率的圖象就能創建大幅圖面成為可能。這項技術通常應用在2D游戲平臺的滾動背景的繪圖。一塊整圖可被分割成等大小的圖象格,每塊格有其對應的序號,按照行列遞增。多塊小格可由大塊同時替換組合而模擬動態的背景,這不需要逐塊替換所有的靜態圖象格而顯得非常方便。

3.7 PNG圖片格式

PNG(Portable Network Graphics)格式是MIDlet唯一支持的圖象格式,PNG具體格式由PNG Specification,Version 1.0定義的。PNG格式提供透明背景的圖象,這對繪制游戲畫面和被操縱主角極有幫助。飛機之間或與白云碰撞時就不會因為背景有特定的顏色,顯示出的效果像貼上的圖片而缺乏真實感,物體之間輕微重疊時最上層圖片也不會覆蓋超過其有效象素外的部分。

PNG格式圖片中包含許多定義其圖片特性的冗余部分(Chunks)。這些代碼包含在每一個單獨的png格式圖象中,然而如果將多個png圖象合并在一張幅面稍大一些的整圖中,多個chunks就可以得到精簡,圖片的大小可以得到控制。使用Image類中的createImage函數可從整圖中分割出所需要的元素。在Game包中的TiledLayer和Sprite類都整合了這樣的功能。本程序中的地圖元素都集成在一張beijing.png圖片中,實現了方便的管理和程序體積的精簡。

3.8 玩家飛機的控制方式和敵人方的智能運行

??? GameCanvas提供getKeyStates函數可獲取當前鍵盤上的信息。將以位的形式返回鍵盤上所有鍵的按與釋放的狀態,當bit為1時,按鍵就是被按下的狀態,為0時則為釋放狀態。只需要此一個函數的返回值就可以返回所有鍵的狀態。這保證了快速的按鍵和釋放也會被循環所捕捉。同時,這樣的機制也可檢測到幾個鍵同時按下的狀態,從而提供斜向運行等相應功能(本程序沒有實現斜上運行功能)。

??? 程序運行時應該對玩家飛機是否飛出屏幕的范圍進行檢測,如果飛出屏幕,就應該重新設定玩家飛機的位置。

??? 玩家飛機被擊中后,為了平衡游戲的可玩性,玩家飛機將有短暫時間無敵,即不進行碰撞檢測,同時在屏幕右上角顯示無敵時間。

??? 根據游戲設定,敵人飛機。不能與玩家飛機重合,則他每走一步都需要檢測一下是否與玩家飛機碰撞。Sprite類中提供了collidesWith函數,用于判斷是否與某個Sprite、TiledLayer、Image的對象有圖象上的重合(即游戲中的碰撞)。同理,還需要檢測玩家子彈與敵機、敵機與玩家子彈是否碰撞。如果發生碰撞,將相關精靈圖片替換為爆炸圖片。

敵人飛機需要具有一定的智能性,以便對玩家攻擊,使游戲具有一定的可玩性。敵人可以在適當時候轉向或者開炮火,同時,程序應該檢測敵機是否飛出了界外。

在普通敵機中,有一組敵機的其中一架具有跟蹤功能,其原理為:當其進入屏幕后,根據玩家飛機的X、Y坐標不斷調整自己的X、Y坐標,已達成跟蹤的效果。由于線程的關系,敵機器的改變方向有時并不是實時的,這就可以使玩家有躲開撞擊的可能,增強了游戲的可玩性。

在游戲進行中出現的大型飛機,由于其不可能立即被擊落,所以應該設置其的運行方法,理論上講還是根據玩家飛機的坐標,但是,在此設置一個標志位,使得敵人在取的玩家位置后即開始玩家方向運動,這期間,將不執行取得玩家飛機位置重設飛行方向的步驟。這樣做,即防止了大飛機變成跟蹤飛機,又使得大飛機的運行具有不確定性。

在關尾出現的BOSS,其在屏幕上方左右移動并發射子彈。實際上,此時BOSS應該通過玩家在游戲運行中的習慣性的運行方向,使用遺傳算法,來動態判斷玩家下一步的運行方向,并且指揮普通飛機出現在預測的位置上。可惜由于時間關系沒有實現。

3.9 子彈的運行和控制

??? 玩家的子彈是個精靈數組,有9個元素,表示玩家一次最多可以發射3組9發子彈,對于一個完整的游戲來講,應該根據關卡的不同而給予玩家不同的飛機,飛機性能的差別在于子彈的射程不同。由于本游戲僅有一關,所以子彈速度設定的差別沒有體現出來。

??? 當玩家一次發射了3組子彈,而這3組子彈并沒有消失時,玩家將無法發射子彈。

??? 使用每組子彈的第一發作為與敵人進行碰撞檢測的精靈,同時相關的標志位也設在第一發子彈中。如果玩家子彈與敵機相撞,則敵機消失時,子彈精靈的圖片替換為爆炸圖片,直到第二次發射該組子彈時,才將圖片替換為子彈圖片。

3.10 內存的優化

手機內存空間小,所以在程序設計時應該注意以下幾點,以盡量減少內存的使用:

??? (1)盡量縮短命名的長度。在應用程序內,對于所建立的類、接口、方法及變量名而言,都需要賦予一個識別的名稱,所命名的名稱每多一個字符就會在類文件內多產生一個字節,對于一個較復雜的應用程序而言就會增加為數不小的數據量。所有這些可以借助混淆器來幫助實現

??? (2)所有代碼寫為一個類。

??? (3)只使用一個線程。

??? (4)盡量不使用靜態變量。

??? (5)將PNG圖片合并成一張,減少圖形數據的大小。

將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了頭文件的大小,將比合并前的總大小減少許多。

3.11 內存檢測器

Wireless Tool Kit提供了許多在運行時監視運行狀態的工具。 包括內存狀況的檢測(手機上的內存空間十分有限,必須時刻關注機載內存是否大于程序所能使用到的最大可能的內存空間),網絡狀況的檢測,運行函數的跟蹤等。內存檢測器是內存跟蹤測試隨時間變化的調試器。其中,允許強制垃圾回收(Garbage Collection)。由于Java語言中,不像許多其他的如C++語言,不需要指定回收函數中特定不使用的資源,資源回收機制將自動清空無效變量占用的空間。在程序運行中也可以調用System類的gc()函數手動收回廢棄的內存。

3.12 關于混淆器

Java 語言并沒有完全編譯成二進制可執行文件,編譯出的.class文件是一種介于源程序和二進制之間的一中基于半解釋的字節碼,需要虛擬機來執行。它包括了所有的信息。然而這樣會導致.class很容易被反編譯為源代碼,從而不能保護作者的知識成果。目前流行的如decode,JAD等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴重的后果。

由此引入混淆器的概念。混淆器將代碼中的所有變量、函數、類的名稱變為簡短的英文字母代號,如果缺乏相應的函數名指示和程序注釋,即使被反編譯,也將難以閱讀。

??? 混淆器的作用不僅僅是保護代碼,它也有精簡編譯后程序大小的作用。由于以上介紹的減少變量、函數的命名長度的關系,編譯后也會從.class文件中減少這些冗余的信息。混淆后,體積大約能減少25%,這對當前費用較貴的無線網絡傳輸是有一定意義的。

3.13 本章小結

第三章中介紹了程序的流程、相關技術的思想及其在本程序中的應用。對游戲基本算法等做了詳細敘述。具體算法的代碼實現和詳細流程將在下章介紹。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

4? 程序分析和具體實現

4.1 游戲進入前的選擇

每個MIDlet程序都必須有一個主類,該類必須繼承自MIDlet。它控制著整個程序的運行,并且可以通過相應函數從程序描述文件中獲取相關的信息。該類中擁有可以管理程序的創建、開始、暫停(手機中很可能有正在運行程序卻突然來電的情況,這時應進入暫停狀態。)、結束的函數。本程序主類為lzhhdm,并實現接口CommandLIstener。

首先顯示的是游戲的背景介紹(圖4-1),為此,在類lzhhdm定義Form類對象a,在startApp()函數中判斷isSplash是否為真,如果為真的話,將創建Form類的實例a,并且調用append()方法在表單上放置StringItem類的實例以顯示游戲背景信息。使用語句ok=new ?Command("ok",Command.OK,1);實例化Command類對象ok。調用addCommand()命令建立ok命令與Form之間的關聯,調用setCommandListener()命令使Form與CommandListener建立關聯。調用Displayable的

圖4-1游戲背景介紹??????????????????

?? seturrent()函數顯示背景介紹窗口。

???? 當玩家點擊ok后將調用display.setCurrent(menuscreen)??

以顯示游戲菜單menuscreen(圖4-2)。?

??? 類menuscreen繼承自Canvas類,并實現接口Runnable

和CommandListener。在類menuscreen中定義了lowColor和

highColor、highBGColor三個整型變量及布爾型變量co。其

中lowColor賦值為0x000000FF,代表蘭色,higColor賦值為

0x00FF0000,代表紅色,highBGColor賦值為0x00CCCCCC,代表

圖4-2 游戲的菜單

蘭灰色,即背景條。當玩家按住上或下鍵時,在函數keyPressed

(int code)中的整型變量menuIndex相應的減1或加1,相應的,在paint()函數中會根據menuIndex繪制選項是否被選中。在函數run()中,如果co為真,則不停的repaint(),設置co的意義在于,當進入游戲主畫面后,co賦值為false,以終止繪制選項的repaint(),提高游戲速度。???????????????????????????????????? ?????

??? 當移動選項條到某項,并點擊ok時,在commandAction()方法中根據 menuIndex??????????????????????????????????????????????????????????

進入游戲

y1>-1550

pzbzover==0

?

顯示敵人

玩家被擊落了嗎 ?

玩家是否還有機會?

繼續游戲

是否過關

返回主界面

Y

Y

N

?

Y

Y

N

圖4-4 gameScreen類主要關系流程圖

N

的值判斷選擇了哪個選項,列如當選擇“關于”時,將調用lzhhdm類中的renwuShow()方法以顯示”關于”界面(圖4-3),在renwuShow()方法中,Form類對象a=null,表示清空Form,并重新調用用append()方法在表單上放置StringItem類的實例以顯示游戲關于信息,“幫助“界面的顯示與”關于“界面相同,只不過調用的是helpShow()方法。

???????????

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

????

?

???????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

?

??

?

圖4-3關于界面

?


4.2 mybullets類??

在介紹游戲主類gameScreen類之前,應該先簡要說明一下玩家子彈類mybullets類,實際上,mybullets類是應該刪除的,其要實現的功能應該放在gameScreen類中,但是由于設計游戲的過程也是一個學習的過程,而在當時,我并沒有意識到這一點。???????????????????????????????????????????

???? Mybullets類繼承自Sprite類,以實現玩家子彈的相關功能。首先,創建子彈狀態數組private int[][] bullets,其中,[i][0]代表子彈的X坐標,[i][1]代表子彈的Y坐標,[i][2]代表子彈Y方向速度,[i][3]代表子彈存活狀態(由于此類是在早期設計的,而之后子彈存活狀態使用了子彈射程作為標志位,所以其并沒有起到作用)。類中定義的方法setfirstposition()起到定義玩家子彈發射坐標的作用(此方法在設計時起到的作用是消除每按一次開火玩家子彈位置就重新定位這個BUG,但是,這個BUG完全可以用設置標志位的方法消除)。方法newposition()實現的功能為更新玩家的子彈位置,并且檢測玩家子彈與普通敵人的碰撞及記錄玩家戰果(更新子彈位置的功能可以由使用move()加設置標志位的方法取代;由于設計這個類的時候并沒有考慮到添加BOSS等,所以在此檢測碰撞,但添加BOOS等功能后,此處的檢測完全可以和飛機對飛機等的碰撞檢測封裝在同一個方法中)。

mybullets類在gameScreen中建立了對象數組huokebullet[9],代表玩家所能發射的9發子彈。

4.3 游戲邏輯及gameScreen類

??? gameScreen類是游戲的主類,決定著敵人何時出現,控制著敵人出現的方法,判斷敵人及玩家是否被擊中等。它運行在獨立的線程中,以恒定的頻率刷新畫面。本程序設置為1/20秒。其主邏輯如圖4-4所示。?????

4.3.1 gameScreen類所實現的功能

gameScreen類要實現地圖的滾動、敵人飛機的相關屬性、玩家的相關屬性等功能。

gameScreen類包括了LayerManager,這樣所有靜態和動態的圖象都不需要手動刷新,只需要在LayerManager中加入所有的需要控制的精靈,在統一由LayerManager刷新即可, 因此,在gameScreen中創建LayerManager的對象lm,并在構造函數中實例子化。

其他精靈類的對象如敵人飛機、玩家飛機、玩家飛機的子彈、敵人的子彈、BOSS及BOSS所屬的子彈都需在gameScreen()類中建立相應的對象,并在構造喊數中實例化,且由lm.appned()方法添加到LayerManager類對象lm中。

4.3.2 地圖的創建

?? 由于手機存儲空間的限制,不可能將整張地圖完整地存儲在手機中,為了節約空間,往往提出地圖中相同的圖片組成一張PNG格式的圖片,然后象拼圖一樣拼出地圖來,專業的游戲設計者往往自己寫一個地圖編輯器,以使拼圖過程不是那么痛苦。

創建地圖就需要使用TiledLayer。TiledLayer指的是由一塊一塊類似用瓷磚拼湊起來的畫面。地圖實際即為TiledLayer的一個對象。先利用TiledLayer的構造函數建立TiledLayer,根據構造函數的參數可以給定Cell數組 的大小,并且地圖圖片切割成等尺寸的畫面,并調用setCell()設置具體的圖象格內容。地圖

圖4-5 地圖

圖片如圖4-5所示。

??? 因此,創建一個返回TtiledLayer的方法createBackGround(),以便在gameScreen()的構造函數中調用。在方法中,定義整型數組map1[]以存儲Cell的索引值。并使用tiledLayer.setCell(column,row,map1[i])設定TtiledLayer的內容,以形成地圖。其中i的值由循環for(int i=0;i<map1.length;i++)取得,column由語句column=i%15取得、行由row=(i-column)/15取得。

??? 畫出地圖后,由lm.append()將地圖添加到LayerManager類對象lm中。由于地圖位于Layer的最低層,即離用戶視線最遠的層,所以Tiledlayer最后一個被添加到lm中。

4.3.3地圖的移動??

?? ?根據游戲的設定,游戲中地圖是向下移動的,實現此功能的方法如下:

??? 首先,在使用createBackGround()函數創建地圖數組時,用(row+1)*16-getHeight()??????????????????????????? ????????????????????????

語句對整型變量row2賦值,其中row+1代表地圖有多少列,16為地圖片的高度,而減去getHeight()是因為要留出一個屏幕的可視區域,由于J2ME規定坐標系中下方向為正,所以使用語句y1=-row2將row2的數值變為負數。

??????

? (0,y1)

?????????????????? ??????y1=y1+1;

?????????????????? View Window????????????

??????????????????? 向下移動??????????????

? (0,0)??? ???????????????????????????????????????????????????????????????????????

?

????????

圖4-6?

?????????

??? ????????圖4-6?

?

?????????????????????? ?????????????????????????????????????????????

??? 其次,render()函數中,使用lm.setViewWindow(0,0,getWidth(),getHeight()+10000)設定可視區域的范圍,(0,0)表示View Window的起始坐標,(getWidth() ,getHeight()+10000)?

使用lm.paint(g,0,y1)決定

View? Window從屏幕的哪里畫起。

在run()函數中的while(conti)中,

屏幕

使用語句y1=y1+1使得每次繪圖都使

地圖下移1個象素。(參考圖4-6)

4.3.4 gameScreen類的構造函數

gameScreen類的構造函數要將游戲中出現的所有精靈都實例化,實際上,這種方法

嚴重的占用了內存,但在當時,我并沒有意識到這一點。

由于敵人要求不停的出現,但是不可能設置過多的精靈,解決的辦法是設定6個Sprite類對象j0、j1、j2及jbullet1、jbullet1、jbullet2,分別代表三架敵機及其配屬的子彈。所以在gameScreen類的構造函數分配這6個Sprite類的存儲空間,并且使用new Sprite(Image img, int width,int height)實例化這6個類變量。同關尾cboss與游戲進行中的大飛機其他的Sprite類對象都需要使用相同的方法實例化。同樣處于節約內存的考慮,sboss與cboss同用3個Sprite類對象bossbullet0,1,2。

??? 在構造函數中,定義boolean型變量conti=true。conti的作用在于控制是否進行游戲畫面的重繪及其他需要在畫面重繪前進行的運算。

??? 在構造函數中,將mybullets類里的no和score初始化,現在看來no的初始化沒有必要,但是score的初始化是必須的,因為這個變量存儲著玩家每次游戲的成績,如果不在此進行初始化,則玩家重新開始游戲后score并不歸0。

4.3.5 關于commandAction()方法

每個創建Command實例的J2ME的應用程序也必須創建實現CommandListener接口的實例。每當用戶通過commandAction()方法的方式與命令進行交互的時候,就會通過CommandLIstener.所以實現CommandListener的類必須實現commandAction()方法。

在commandAction()方法中,使用getabel()方法獲取命令的標簽。如果getLabel()=“暫停”時,表示玩家點擊了暫停鍵,此時,conti賦值為false,游戲畫面的繪制及游戲相關的運算暫停,并且,使用removeCommand(c)語句將“暫停”移除,使用addCommand(new Command("繼續",Command.OK,2));將”繼續“按紐”添加進來。當玩家點擊“繼續“時,conti賦值為true,并且,一定要調用start()方法,否則繼續功能不可用。必須調用start()方法的原因是:J2ME的線程已stop()方法拿掉,如果想停止線程的運做,就必須依靠一個旗標(flag),在本程序中,flag就是boolean型變量conti。所以一旦此標識變量被設為false,那么while(conti)循環就會結束,線程也會跟著結束。當用戶按下“繼續”的時候,start()將重新產生一個線程繼續執行相關的運算和畫面繪制。

當玩家通關時或者任務失敗時,將顯示相應信息,并使用上面的方法將“暫停”鍵變為“返回”鍵盤,當點擊“返回”鍵時,將返回主菜單選項,調用類lzhhdm里的方法menuscreensecond(),在此方法中,實例化一個MenuScreen類對象,并且使選項“新游戲”改變為”重新開始“(圖4-7)。完成此項功能的語句子為MenuScreen.mainmenu[0]=”重新開始”。當選擇”重新開始“時,使用gamescreen=new gameScreen(this)將使所有變量重新被初始化,如地圖的繪制、敵人出現位置的重置、敵人的數量、玩家飛機的當前位置等。使用gamescreen.start()重新開始程序的循環。

4.3.6 Sprite類對象的碰撞檢測及相關屬性

??? 游戲進行中,即在while(conti){ }中,需要進行玩家飛

機、子彈與敵機及敵機子彈與玩家飛機的碰撞檢測,即使用函

數collidesWith(Sprite,boolean)。由于設計的問題,玩家發

射的子彈與普通敵機的碰撞檢測被寫在了mybullets類中,并

且只檢測第一發子彈是否與敵人相碰撞,如果碰撞為真時,則

使用setVisible(false)函數將敵機隱藏,使用setImage()函

數將子彈精靈的三張圖片置換為爆炸圖片( 圖4-8 )。當敵人剩

圖4-7

余飛機消失后,即所有的敵人都飛出了屏幕后,使用函數

setVisible(true)將敵機重新設置為可見。在按“開火”鍵時,使用setImage()函數將huokebullets重新設定為子彈圖片(每次擊落敵機后屏幕上的爆炸效果有3團,并且按“開火”后爆炸圖片就消失了,實際上setVisavle(false)的應該是子彈數組,而對敵人精靈使用setImage(),這樣效果會好一些)。

敵機與玩家的碰撞檢測原理同上,都是使用的collidesWith()函數,遺憾的是,我在寫這段代碼的時候,并沒有考慮設置玩家有4次機會,所以對敵人飛機setVisable(fasle)了,而將玩家的飛機換成了爆炸圖片,之后,添加了玩家4次機會這個功能,由于玩家被擊落后會重新從屏幕下方進入屏幕,所以爆炸的圖片一閃而過,效果不是很好。

4.3.7 玩家4次游戲機會的實現方法????????

?? ?根據游戲設置,玩家在每關中有共四次機會,當玩家飛機被擊中或撞擊爆炸后,程序首先檢測整型變量playerno的值,并根據playerno的值決定屏幕右上角所畫玩家飛機標志的數量(參考圖4-8),playerno的初始值設為3,因為碰撞后才減1,所以玩家共有4次機會,當playerno<0時,游戲結束,同時將變量pver賦值為1,render()或renderboss()函數中,over=1代表在屏幕上GAMEOVER等相關信息,同時,將整型變量inputno賦植為1,以使手機的方向鍵失效,以消除玩家可以控制爆炸圖像移動這個BUG。同時整型變量pzbz賦植為1,以消除玩家爆炸圖像繼續與敵人進行碰撞檢測這個BUG。

??? 當playerno>0時,碰撞后,將變量planert賦值為1,在之后的if(planert==1)判斷語句中,重新設定玩家飛機的圖片和可視狀態,同時使用setPosition()函數設定玩家非的位置在屏幕下方。設定pzbz=1,即不檢測碰撞,玩家有短暫時間無敵,無敵時間由屏幕右上角進度條表示。設定inputno=1,即飛入屏幕的過程中手機鍵盤是不可以用的。設置planert=2,即以上這些設置只執行一便。

???? 在if(planert==2)判斷語句中,使用語句move(

0,-2)使飛機自己向上運動,使用if(c1.getY()<(

planepo-24))判斷飛機是否到達屏幕最下方(planepo

是屏幕下邊緣的坐標),如條件為真,則將inputno

設置為1,表示鍵盤可用,將planert賦值為3,使

其不再執行以上各步。

4.3.8 input()

?input()函數的作用是檢測用戶的輸入。

首先使用if(inputno==0)判斷用戶的輸入是否

被禁止,如為真,則用戶輸入不被禁止。

圖4-8 游戲界面

其次,調用getKeyStates()查詢按鍵的狀態。

當玩家按方向鍵時,玩家飛機就向不同的方向運行,這需要使用c1.move(int x,int y)函數,當玩家控制飛機向左或右飛時,需要使c1.setFrame()函數改變飛機的圖形(參見圖4-7,此時飛機右飛)。同時,還需要判斷飛機是否飛出屏幕,如,當飛機右飛時,用if(c1.getX()>(getWidth()-c1.getWidth()))

語句判斷(getWith()為屏幕的寬度,c1.getWidth()為玩家飛機c1的寬度),如果條件為真,則使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())語句將飛機設置在緊靠屏幕右邊的位置。上、下、左的設置原理同上。

??? 語句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右飛后在上、下飛時飛機的形態不變的BUG。如果為真,則執行語句c1.setFrame(0),表示只要左鍵松開飛機的形態都是平飛。

根據游戲設定,玩家一次最多只能發三組子彈,并且子彈有射程限制(在類mybullets中使用整型變量no表示),而當玩家按下“開火“鍵時,即if((keystate&FIRE_PRESSED)!=0)中判斷條件為真時,首先執行循環語句for(int i=0;i<=6;i=i+3),即檢測3組子彈中每組的第一發,即0,3,6。其次,檢測huokebullet[i].no是否等于1,當等于1時使用語句for( int z=i;z<i+3;z++)初始化該組子彈中的3發子彈,而設置子彈位置的函數應該在if(huokebullet[i].no==1)語句外設置,因為當初設計的時候mybullets類里的函數寫成了一次設置三組子彈的形式。

huokebullet[z].no=huokebullet[z].bulletheight賦予子彈射程。當程序循環運行時no--,當一次發射了三組子彈后,只有某一組子彈消失,即no等于1后才能繼續發射子彈。

現在看來,玩家發射子彈的設置是完全失敗的,降低了效率。

4.3.9 render()和renderboss()

在方法render()過程中,除了要重繪飛機、地圖、子彈外還要在上方繪制關卡信息、戰果、玩家飛機數、及無敵狀態時的無敵時間、大飛機生命條等。

首先使用lm.setViewWindow()和lm.paint()設定可視范圍ViewWindow和從哪里畫起(見4.3.3)。

其次,使用g.drawString()繪制屏幕上方的關卡信息、戰績、玩家剩余生命標志。

drawString()中使用String.valueOf(huokebullet[0].rscore()+huokebullet[3].

rscore()+huokebullet[6].rscore())返回玩家成績score的字符串表示。

其中根據playerno的值繪出玩家的飛機標志數(應該有更好方法,但是沒有想到 )當每次刷新繪圖頁面時,應使用GameCanvas的flushGraphics()將屏幕后臺的緩沖區內的圖像刷新到前臺來(flushGraphics()應該寫在render(){ }的最后)。

renderboss()方法重繪的是關尾的精靈cboss、相關信息等,與render()的區別在與于函數lm.paint(g,0,0),起始坐標是不可變的,即,關尾的地圖背景是不可變的。實際上,renderboss()是完全不需要的,只要在render()函數中設置相關標志位就可以解決關尾的繪圖問題。

玩家飛機的生命標志使用drawImage()就可以繪制在屏幕上了。

4.4 游戲中的獎勵及相關飛機的行為

? ??根據游戲設定,當y1=-1000時,會出現如圖4-8

所示的飛機(sboss),當玩家擊落他后,屏幕會顯示“

援軍到達“,并且玩家剩余飛機數加1。

??? 使用 if((y1==-1000)&&(sbz==0)){ }設定sboss的

初始位置,根據游戲設定,sboos從屏幕上方倒飛入屏幕,

所以sboss設定的初始位置(50,planepoup-65),其中

planepoup為屏幕上邊緣的標志位。

圖4-9

最后,要將sbz賦值為1,消除sboos不停設置初始位置的BUG。

??? 當sboss飛入屏幕后,將sbz賦值為2,以執行下面

的if(sbz==2)語句。

圖4-10

? ??在判斷語句if(sbz==2)里,將根據玩家的位置自動飛

行。首先,根據玩家飛機的位置對sbmove賦值,當c1在sboos的上、下、左、右時,其對應的值為1、2、3、4在這4個if語句中,要設置標志位(smovebz==0)。設置這個

標志位的目的是防止sboos根據c1的位置不停的改變運行狀態,即防止sboos成為跟蹤飛機。當sboos根據c1的位置改變一次運行方向后,smovebz賦值為1,即不檢測c1

的位置。只有sboss運行到屏幕的邊緣時,才將smovebz重新賦值為0,使其可以再次通過c1的位置決定sboos的運行方向。

當玩家子彈擊中sboss后,使用sboss.setFrame(1),此時飛機變紅,在本次repaint結束前,使用sboss.setFrame(0)使飛機變為本來顏色,而程序設定每1/20秒畫一次,由此得到飛機被擊中后變色的效果。(參見圖4-10)。

??? sboos會根據玩家飛機的位置發射子彈,根據游戲設置,當玩家在其上方、左方、右方時,sboss一次發射1發子彈,而玩家飛機在其下方時,sboss一次發射3發子彈。????????????????????????

??? sboss與cboss共用3發子彈,因為當sboss出現時,離關尾還遠,所以,為了提高效率,采用這種方法。

??? 如果sboos被擊落后,使用函數setVisable(false)將bossbullet0、bossbullet1、bossbullet2設置為不見,使用sboss.setImage()函數將sboos的圖片設置為爆炸圖片。同時,玩家生命標志playerno加1,sbz賦值為-1,使得sboos無法發射子彈,sbpzbz賦值為1,使得玩家的子彈不與sboos進行碰撞檢測。

??? 同時在屏幕中使用drawString()繪制“援軍到達”四個字,隨著屏幕的運動,爆炸圖片逐漸進入屏幕下方,當sboos.getY()>palnepo,通過改變標志位的值使得drawSteing()不在執行,四字消失。

??? 如果玩家被擊落后并沒有點“返回“,而此時,背景會一直運動到關尾,考慮到其與關尾BOSS共用3發子彈,如sboos不消失,將會出現子彈亂飛的情況。所以,如果判斷語句if((sboss.getY()==getHeight()))為真,則表示離地圖的終點只有一個屏幕的距離時,sbz賦值為-1、sbpzbz賦值為1(含義上面已經說明)。同時調用sboss.move(0,-3),使sboos快速飛出屏幕,直到判斷語句if(sboss.getY()<-65)為真時,調用下面的函數setVisable(false),使得sboos不可見。

4.5 普通敵人相關屬性

?? ?普通敵人是指游戲中不斷出現的蘭色飛機。

??? 首先在程序中首先定義了aik、aip兩個Random()類對象,ai和aipp兩個整型變量。程序中使用switch(ai)語句判斷下一次的飛機出現情況,為了達到不重復出現的效果,使用語句ai=aik.nextInt()%4(同樣應該在構造函數中放置此語句和aipp=aip.nextInt() % 5,以使每次游戲開始的時候敵人飛機的出現順序是不固定的),以隨機出現0,1,2,3四個整數(代表著飛機的四種出現情況)。

? ??情況1:使用 aipp=aip.nextInt()%5取得隨機數aipp,根據下面三條語句設置飛機的出現位置:j0.setPosition(100-aipp*30,planepoup+24);

?? ???????j1.setPosition(100,planepoup);

?? ???????j2.setPosition(100+aipp*30,planepoup-24);;

將getHeight()/8賦給整型變量kkk,每次循環kkk-1,當kkk<=1時飛機轉向,當aipp>0時,飛機向左下方運行,使用語句setFrame(0)、move(-3,3)達成向左下方運動的效果。當aipp<0時,向右下方運動,實現方法同上。

??? 情況2:初始位置設置方法同情況1。當kkk〈0時,飛機掉頭向上飛,其中setFrame(3),

move(-4,0)。

??? 情況3:初始位置設置方法同情況1。當kkk〈0時,飛機只向左轉。設置情況3的原因是在更多的隨機位置出現敵機。

??? 情況4:初始位置設置方法同情況1。但其中的飛機j1具有跟蹤能力,其實現方法如下:使用2個if語句if(j1.getX()<c1.getX())、if(j1.getX()>c1.getX())判斷J1在c1的左或右側,并且實時根據判斷情況使用setFrame()和move()改變飛機的形態,使用語句

if((j1.getX()<c1.getX())&&((j1.getX()+48)>c1.getX())&&(j1.getY()<c1.getY()))判斷c1是否在j1的下方,當c1在j1的下方時,發射子彈jbullet1。

???? 以上四種情況的最后,都將使用函數nextInt()產生ai,aipp的值。

???? 設置整型數組jb[4],對應著4種出現情況的標志位。

???? 如,執行情況1,首先執行判斷語句if(jb[0]==1),在此語句中,首先使用setVisable (true)函數將敵人飛機設置為可見的,并根據上次運行的qipp的值設置敵人飛機的初始位置最后,jb[0]賦值為2。

??? 接著執行判斷語句if(jb[0]==2),在此語句中,首先使用move()函數使飛機向下運動,同時kkk減1,當kkk<=0時,飛機轉向,此時,根據aipp的正負判斷飛機向哪邊轉向。當飛機飛出屏幕時,jb[0]賦值為3。

??? 需要注意的一點是,當取得ai的數值時,一定要寫上這條語句:jb[ai]=1;因為當4種情況都出現一便的時候,標志位jb[]里的數值都將變為3,如果不將其重新賦值為1,敵人飛機將只能出現4次。

??? 其他3種情況也大致如此。

??? 普通敵人是否發射子彈由以下語句if(((j1.getX()<=c1.getX()-18)||((j2.getX() -6)>=c1.getX()))&(jbz==0)),即c1在j1左側18象素范圍內或j2左側6象素范圍時,j0、j1、j2一起發射子彈,jbz=1,表示在這組子彈消失前敵人不發射子彈。

?? ?如果jpb的值為0,則判斷語句if(jpb==0)里的move()語句將一直執行下去。

??? 之后,還需要對每發子彈于玩家飛機進行碰撞檢測,如果碰撞,則將碰撞的這發子彈設置為不可見。

4.6 白云的實現原理

???為了游戲界面更加美觀,程序中設定了精靈數組cloud[i]來表示白云,由于白云應該在所有飛機的上方,即cloud[i]應該最早被append()到LayerManager中,或者使用insert (cloud[],0)在索引數值0處插入Layer,本程序采用了第一種方法,即在gameScreen類的構造函數中按游戲設置的順序使用lm.append()加入到LayerManager之中。

??? 程序中設定白云數為5。首先設置白云的初始位置,其語句如下:

cloud[0].setPosition(25,planepoup-(65));

cloud[1].setPosition(80,planepoup-(140));

cloud[2].setPosition(112,planepoup-(90));

cloud[3].setPosition(175,planepoup-(200));

cloud[4].setPosition(223,planepoup-(70));

其原理為:將屏幕的X數軸和Y數軸各分成5份,即在X軸的5個范圍內每個范圍出現一朵白云,Y軸的每個范圍內也只能出現一朵。所以的白云的起始位置在每次游戲開始時是固定的。

白云位置設定后,使用move(0,1)使白云移動,由于白云初始位置設定在屏幕的不同區域內,故其移動出屏幕的先后順序是不同的,使用if(cloud[].getY()>planepo)判斷白云是否飛出屏幕。如果為真則使用cloud[].setPosition(cloudposition*40,planepoup)設置白云的位置,其中,cloudposition=aicloud.nextInt()%5,aicloud為Random()類對象。乘以40表示其在X軸出現的范圍是多少,cloud[0]、cloud[1]、cloud[2]、cloud[3]、 cloud[4]乘以的值分別為40,30、55、15、22。以達成白云的隨機出現效果。

4.7 關尾BOSS及相關屬性

??? 關尾處飛機在屏幕上方橫向移動,而背景地圖不動,所以使用renderboss()重繪屏幕,其中,paint(g,0,0)表示屏幕繪制點在坐標軸(0,0)處。BOSS生命進度條由以下語句繪制:

g.setColor(255,0,0);

?????????? ???????? g.fillRect(2,2,60,5);//生命進度條背靜紅

?????????? ???????? g.setColor(255,255,255);

?????????? ???????? g.fillRect(2,2,bosslife,5);//生命進度條前景白

其中bosslife記錄著BOSS的生命值,其初始值為0,當玩家每擊中一次BOSS,其值加5,,即化出白色進度條,當bosslife==60時,表示過關,除玩家飛機與子彈外的其他Sprite均使用setVisable(false)使其不在顯示,同樣的pzbz要賦予1,以消除玩家飛機還能與敵人碰撞的BUG。

??? 如果cboss.getX()<0,則表示其在屏幕左方出界,應改為右飛。同理如果cboss.getX()

>(getWidth()-cboss.getWidth()),則表示其在屏幕右方出界,應改為左飛。

在飛機橫向飛行中,使用以下語句判斷飛機是否開火:

if(((cboss.getX()<=c1.getX()-10)||(cboss.getX()<=c1.getX()+60))&&(jbsz==0))

當每發一組子彈后,jbsz=1,則飛機無法開火,知道子彈

飛出屏幕,jbsz才重新設定為0。而((cboss.getX()<=

c1.getX()-10)||(cboss.getX()<=c1.getX()+60)表示當

玩家飛機處于BOSS的左右各10個象素的范圍內時。BOSS

開火。關尾參見圖4-10。

4.8本章小結

第四章中按照相應的步驟描述了所有關鍵類的具體算

圖4-10關尾

法實現,引用了相關函數進行了具體流程的解釋,并對原

理稍復雜的函數做了詳細的分析。對游戲有關的各運行面也做了展示。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

5? 測試

5.1 打包測試的過程

?? ?使用Eclipse完成代碼的調試之后,需要使用WTK生成包(即jar和jad文件),其過程如下:首先,使用WTK的新建項目功能建立一個新項目,要求與Eclipse工作區下的項目名稱、MIDlet類名相同(圖5-1)。

5-1

?? 新建項目后,將Eclipse工作區下的.java文件拷入src文件夾,將.class文件拷入class文件夾(需要新建),將pic文件夾拷入res文件夾,點擊生成,如一切正常,將如圖片5-2所示。

圖5-2

之后,選擇項目-包-生成包。如圖5-3所示。

圖5-3

生成的jar和jad文件存儲在lzhhdm/bin目錄下。

運行Motorola SDK v4.2 for J2ME,使用MOTOA760手機模擬器進行測試。參考圖5-4。點擊Lanuch按紐,進入如圖5-5的界面,即可以進行游戲測試了。

圖5-4

? ?測試的過程,實際上就是找不同的同學玩這款游戲,以期望發現BUG。實際上,幾乎每一版本都會產生很多BUG。?????????

5.2 發現的BUG及解決情況????

幾乎每一個計算機程序都會有這樣

那樣的不足,尤其是未經過精心維護的

非商業軟件。即使是作為操作系統的各

種版本的Windows也時常會發生許多類

型的錯誤和漏洞。本游戲程序對于初涉

此領域的畢業設計課題來說,尤其在開

始初期,感覺邏輯復雜,難以控制,因

此產生了大量BUG,其中一些BUG還沒有

解決,所有發現的BUG如下:

1.玩家子彈出現順序問題;

2.玩家飛機爆炸后仍然可以控制爆

炸圖片;?????????

3.當過關后仍然會發生碰撞;

圖5-5

4.當玩家擊落可獎人飛機的同時玩

家被擊落,并且此為玩家的最后

一架飛機,雖然顯示援軍到達,但

圖5-5

游戲仍然結束。

5.有某組飛機在飛機被擊中后仍能發射子彈;

6.sboos左側子彈發射后不停在原位置刷新問題;

7.? 游戲運行一段時間后變的很卡;

??? 其中,1、2、3、4條BUG已經解決(方法已在第4章相關位置進行了說明)。4、5、6沒有解決,其中,4、5、6三條如果有足夠的時間可以解決。第7條以現有水平無法解決,因為出現這種情況的原因估計是內存的問題,而由于水平的關系,現在的代碼變量過多,并且效率低下,有很多重復的地方,解決的方法只能是在水平提高的情況下重寫整個程序。

5.3 未完善的功能

經過匯總測試人員的建議,本游戲應該完善的功能如下

1. 由于每按一次開火,就會對玩家子彈的精靈數組進行一次循環檢查,使得本運行效率就不高的KVM運行異常緩慢。即使刷屏沒有間隔也不會提高速度;

??? 2. 最好有接寶物的設置,增強可玩性;

??? 3. 由于沒由合適的圖片,使得敵人設置單一;

??? 4. 地圖本應由外部文件讀入,但設計初期并沒有掌握這項技術;

??? 5. 手機游戲最好只有一個類,而我卻有4個;

??? 7. 沒有添加成績記錄,即英雄榜;

??? 6. 最大的遺憾,敵人不夠智能化。

??? 希望不遠的將來,我能夠有能力對這個游戲進行重寫,以解決BUG、完善功能。

???

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

6? 總結

6.1 本程序的總結和展望

?? ??本程序設計實現了手機上以J2ME為平臺的飛行射擊游戲的開發,敵人運行的方式由程序進行控制,具有一定的可玩性和復雜性。經過了細心的調試和排錯解決了絕大部分的問題。

?但是我的水平實在有限,在第5章列舉的眾多BUG和遺憾就可以看出這一點來,但我相信,隨著時間的推移,個人水平的增長,我一定會重寫這個程序,使其更加完善,

6.2 感想

?? 這款游戲作為我的畢業設計,是本人目前做過的最有意義的程序,這期間對J2ME的學習,使我又回到了初學PASCAL的時候。

本科期間做過很多課程設計,大多規模很小。在數據庫、各種應用軟件和游戲中,我仍覺得對游戲的設計有極大的熱情。因為其各個模塊間的聯系十分緊密,代碼重復執行率高,當經過無數次的調試、修改后,能最終看到成品,有無比自豪的心情。大學期間做過圖書館管理程序等簡單的數據庫管理系統的課程設計,思想大致相似,變化范圍有限,沒有太多自己可發揮的余地。大家作品的最終結果都離不開同一個模式。相比一些數據庫軟件,游戲的設計有很多人情色彩和藝術思想的發揮,正式商業的軟件的人性化界面和各個游戲間迥異的結構每每會讓人有去開發的沖動。

??? 學習J2ME的困難遠遠超出了想象,在設計初期,為了解決地圖的滾動、玩家飛機如何不飛出上下邊界兩個問題竟然花費了數天的時間。很多相關的技術,如需要使用到的線程、Game包的新功能、高級、低級圖形界面的使用、貼圖等,每一項都需要花一定的時間去掌握和熟悉。更為困難的是,J2ME為一種剛出現僅幾年的新技術,國內的參考資料非常少,僅有的幾本也停留在簡單的介紹階段。臺灣的王森寫了本較好的書,給了我很大的幫助,但對設計該游戲來說,仍只夠入門。

???? 幸運的是,互聯網上有那么多無私的人,由Jason Lam著,Deaboway Chou譯的電子書《J2ME&Gaming》給了我很大的幫助,作者、譯者的辛勤勞動的成果免費放在網上由大家下載,是開源精神的完美體現。

?

???

首先感謝我的指導老師馬慧彬副教授,她在我的畢業設計過程中提出了指導性的方案和架構,并指引我閱讀相關的資料和書籍,使我在不熟悉的領域中仍能迅速掌握新興的技術。

感謝黃明旭、包明輝同學對游戲進行測試,感謝包明輝同學對游戲相關圖片的修改。

感謝答辯組對本畢業設計的考核,如果可以得到專家的認可將對我的學習和工作給予極大的鼓勵。你們客觀的評價和建議我將牢記在心,在今后的發展中揚長避短,更加努力的嚴格要求自己。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

參考文獻

[1]Joshua Bloce著. 潘愛民譯. Effective Java中文版.2004年7月第4版. 機械工業出版社.

[2]Bruce Eckel.侯捷譯.Java編程思想. 2005年3月第1版. 機械工業出版社出版社

[3]王森著.Java手機/PDA程序設計入門.2005年2月第3版.電子工業出版社.

[4]James Keogh著.潘穎王磊譯.J2ME開發大全.2004年2月第1版清華大學出版社.

[5]Ian Sommerville著.程成等譯.軟件工程.2003年1月第1版.機械工業出版社.

[6]Jason Lam著.Deabo way Chou譯 J2ME&Gaming 2004年末 www.jasonlanm604.com

[7]陳立偉 張克非 黎秀紅著.精通JAVA手機游戲與應用程序設計.中國青年出版社.

2005年5月

[8]飛思科技產品研發中心.精通Jbuilder9.電子工業出版社.2004年

[9]微型爪哇人.Java手機程序開發.中國鐵道出版社,2003年

[10]Frand M.Carrano,Janet J.Prichard?.著?韓志宏?譯.數據抽象和問題求解——

JAVA語言描述.清華大學出版社2005年4月

[11]袁海燕 王文濤著.JAVA實用程序設計100例.人民郵電出版社.2005年5月

[12]Jonathan Knudsen.What's New in the J2ME Wireless Toolkit 2. 22004年4月www.sun.com



?

?

?

?

?

?

?

?

?

?

?

?

?

附錄一? 代碼


import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.lcdui.*;

public class lzhhdm extends MIDlet implements CommandListener {

??????? public Display display;

?????? private Image splashLogo;

?????? private boolean isSplash=true;

??????? public Form a;

??????? private Alert alert;

??????? int length;

??????? private MenuScreen menuscreen;

??????? private gameScreen gamescreen;

??????? private Command ok,back;

??????? private byte[] byteInputData;

?????? public lzhhdm()

?????? {

?????? }

?????? protected void startApp() throws MIDletStateChangeException {

?????? display=Display.getDisplay(this);

?????? menuscreen=new MenuScreen(this);

?????? if(isSplash)

?????? {? a=null;

????????????? a=new Form("覽橋風光V1.0");

????????????? ok=new Command("ok",Command.OK,1);

?????? ??? a.append(new StringItem(null,"....."));

????????????? a.addCommand(ok);

????????????? a.setCommandListener(this);

?????? ??? display.setCurrent(a);?

?????? }

?????? }

?????? protected void menuscreenShow()

?????? {

????????????? display.setCurrent(menuscreen);

?????? }

?????? protected void menuscreensecond() {

?????????????

????????????? menuscreen=new MenuScreen(this);

????????????? MenuScreen.mainmenu[0]="重新開始";//玩完一遍或掛了后在玩一遍 菜單第一項改為 重新開始

????????????? display.setCurrent(menuscreen);

????????????? }

?????? protected void pauseApp() {}

?????? protected void destroyApp(boolean arg0) throws MIDletStateChangeException {??

?????? }

?????? protected void helShow()

?????? {? a=null;

????????????? a=new Form("覽橋風光V1.0");

????????????? back=new Command("返回",Command.BACK,1);

?????? ??? a.append(new StringItem(null,"操作方式:上 2 下 8 左 4 右 6 開火 5"));

?????? ??? a.append(new StringItem(null,"彈藥數:一次最多打三組"));

????????????? a.addCommand(ok);

????????????? a.setCommandListener(this);

?????? ??? display.setCurrent(a);

?????? }

?????? protected void renwuShow()

?????? {

????????????? a=null;???

????????????? a=new Form("覽橋風光V1.0");

????????????? back=new Command("返回",Command.BACK,1);

?????? ??? a.append(new StringItem(null,"游戲名稱:覽橋風光"));

?????? ??? a.append(new StringItem(null,"版本號:V1.00"));

?????? ??? a.append(new StringItem(null,"制作者:信息電子技術學院01計算機5班 劉澤華 學號:7"));

????????????? a.addCommand(ok);

????????????? a.setCommandListener(this);

?????? ??? display.setCurrent(a);

?????? }

?????? protected void gameShow()

?????? {?? try{

??????

????????????? gamescreen=null;

????????????? gamescreen=new gameScreen(this);

?????????????

????????????? gamescreen.start();

???????????????????? display.setCurrent(gamescreen);

????????????? gamescreen.conti=true;

?????? }catch(Exception exp)

?????? {

?????? System.out.println("dfg");

?????? }

?????? }

??????

?????? public void commandAction(Command arg0, Displayable arg1) {

????????????? a=null;

?????????????

????????????? this.menuscreenShow();

?????? }

}

import javax.microedition.lcdui.*;

public class MenuScreen extends Canvas? implements Runnable,CommandListener

{

?Font lowfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);

?????? ? Font highfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM);

?????? ?int lowColor=0x000000FF;

?????? ?int highColor=0x00FF0000;

?????? ?int highBGColor=0x00CCCCCC;

?????? ?int width;

?????? ?boolean co;

?????? ?int height;

?????? ?int startHeight;

?????? ?int spacing=highfont.getHeight()/2;

?????? public? static String[] mainmenu={"D?ó??·","°??ú","1?óú"};

?????? ?int menuIndex;

?????? Thread menuThread;

?????? private Command ok=new Command("ok",Command.OK,1);

?????? private lzhhdm midlet;

?????? public MenuScreen(lzhhdm midlet)

?????? {???? this.midlet=midlet;

????????????? width=getWidth();

????????????? height=getHeight();

????????????? startHeight=(highfont.getHeight()*mainmenu.length)+((mainmenu.length-1)*spacing);

????????????? startHeight=(height-startHeight)/2;

????????????? menuIndex=0;

????????????? addCommand(ok);

????????????? ?setCommandListener(this);??????

????????????? menuThread =new Thread(this);

????????????? menuThread.start();

????????????? co=true;

?????? }

??????

?????? public void run()

?????? {

????????????? while(co)

????????????? {

???????????????????? repaint();

????????????? }

?????? }

??????

?????? public void paint(Graphics g)

?????? {?

????????????? g.setColor(0x00FFFFFF);

????????????? g.fillRect(0,0,width,height);

????????????? for(int i=0;i<mainmenu.length;i++)

????????????? {

???????????????????? if(i==menuIndex)

???????????????????? {?

??????????????????????????? g.setColor(highBGColor);

??????????????????????????? g.fillRect(0,startHeight+(i*highfont.getHeight())+spacing,width,highfont.getHeight());

??????????????????????????? g.setFont(highfont);

??????????????????????????? g.setColor(highColor);?????? g.drawString(mainmenu[i],(width-highfont.stringWidth(mainmenu[i]))/2,startHeight+(i*highfont.getHeight())+spacing,20);

???????????????????? }else

???????????????????? {

??????????????????????????? g.setFont(lowfont);

??????????????????????????? g.setColor(lowColor);

???????????????????? ?????? g.drawString(mainmenu[i],(width-lowfont.stringWidth(mainmenu[i]))/2,startHeight+(i*highfont.getHeight())+spacing,20);

???????????????????? }

????????????? }

?????? }

?????? public void keyPressed(int code)

?????? {

????????????? if(getGameAction(code)==Canvas.UP&&menuIndex-1>=0)

????????????? {

???????????????????? menuIndex--;

????????????? }

????????????? else if(getGameAction(code)==Canvas.DOWN&&menuIndex+1<mainmenu.length)

????????????? {

????????????? ?????? menuIndex++;

????????????? }

?????? }

?????? public void commandAction(Command c,Displayable d)

?????? {

????????????? if (c==ok)

????????????? {

???????????????????? switch(menuIndex)

???????????????????? {

???????????????????? ? case 0:

???????????????????? ? ?? ?co=false;

???????????????????? ? ?? midlet.gameShow();

???????????????????? ? ?? break;

?????????? ? case 1:

?????????? ? ? midlet.helShow();

?????????? ? ? break;

?????????? ? case 2:

?????????? ? ? midlet.renwuShow();

?????????? ? ? break;

?????????? }??

?????? }

??? }

}

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

public class mybullets extends Sprite

{?? public? int score=0;

?????? private int[][] bullets;

?????? private int bulletstotal;

??? public int width,bulletheight;

? ?? public int no=0;

?????? public mybullets(Image img,int picwidth,int picheight,int bulletstotal,int width,int height)

?????? {??????

???????????????????? super(img,picwidth,picheight);

???????????????????? this.bulletstotal=bulletstotal;

???????????????????? bullets=new int[bulletstotal][4];

???????????????????? this.width=width;

???????????????????? this.bulletheight=height/7;???

?????? }

??? public void initBullets(int i)

??? {

??? ???????????? bullets[i][3]=1;

??? ???????????? bullets[i][2]=0;

??? }

??? public void updata(int i)

??? {

??? ????? bullets[i][1]+=bullets[i][2];

??? }

??? public void setfirstposition(int x,int y,int nof,Sprite sprite[],Image img)

??? {?? ???

??? ????? sprite[nof].setVisible(true);

??????? sprite[nof+1].setVisible(true);

??????? sprite[nof+2].setVisible(true);

??? ????? bullets[nof][0]=x+10;

??????? bullets[nof][1]=y-24;

??????? sprite[nof].setImage(img,6,6);

??????? bullets[nof+1][1]=bullets[nof][1]+10;

??????? bullets[nof+1 ][0]=x+10;

??????? sprite[nof+1].setImage(img,6,6);

??????? bullets[nof+2][1]=bullets[nof+1][1]+10;

??????? bullets[nof+2 ][0]=x+10;

??????? sprite[nof+2].setImage(img,6,6);

??? }

??? public void newposition(Sprite sprite[],int i,int v,Sprite jp0,Sprite jp1,Sprite jp2,Sprite boss,Image img)

??? {? ??????

??? ????? bullets[i][2]-=5;

??? ????? sprite[i].setPosition(bullets[i][0],bullets[i][1]+bullets[i][2]);

??? ????? sprite[i+1].setPosition(bullets[i][0],bullets[i+1][1]+bullets[i][2]);

??? ????? sprite[i+2].setPosition(bullets[i][0],bullets[i+2][1]+bullets[i][2]);

??????? if (sprite[i].collidesWith(jp0,true))

??????? {

??????? ???? sprite[i].setImage(img,32,32);

??????? ???? sprite[i+1].setImage(img,32,32);

?????? ????? sprite[i+2].setImage(img,32,32);

??????? ???? sprite[i].setFrame(1);

??????? ???? sprite[i+1].setFrame(1);

??????? ???? sprite[i+2].setFrame(2);

??????? ???? bullets[i][3]=0;

??????? ???? bullets[i+1][3]=0;

??????? ???? bullets[i+2][3]=0;

??????? ???? jp0.setVisible(false);

?????? ????? no=1;????

?????????? score=score+1;

??????? }

??????? if (sprite[i].collidesWith(jp1,true))

??????? {

??????? ???? sprite[i].setImage(img,32,32);

??????? ???? sprite[i+1].setImage(img,32,32);

??????? ???? sprite[i+2].setImage(img,32,32);

??????? ???? sprite[i].setFrame(1);

??????? ???? sprite[i+1].setFrame(1);

??????? ???? sprite[i+2].setFrame(2);

??????? ???? bullets[i][3]=0;

??????? ???? bullets[i+1][3]=0;

??????? ???? bullets[i+2][3]=0;

??????? ???? jp1.setVisible(false);

??????? ???? no=1;

??????????????? score=score+1;

??????? }

??????? if (sprite[i].collidesWith(jp2,true))

??????? {

??????? ???? sprite[i].setImage(img,32,32);

??????? ???? sprite[i+1].setImage(img,32,32);

??????? ???? sprite[i+2].setImage(img,32,32);

??????? ???? sprite[i].setFrame(1);

??????? ???? sprite[i+1].setFrame(1);

??????? ???? sprite[i+2].setFrame(2);

??????? ???? bullets[i][3]=0;

??????? ???? bullets[i+1][3]=0;

??????? ???? bullets[i+2][3]=0;

??????? ???? jp2.setVisible(false);

??????? ???? no=1;

??????? score=score+1;

??????? }

??? }

??? public boolean isAlive(int i)

??? {

??? ????? if (bullets[i][3]==1) return true;

??????????? else return false;

??? }

??? public void setAlive(int i)

??? {

??? ????? for (int z=i;z<i+3;z++)

??? ????? {

??? ???????????? bullets[i][3]=0;

??? ????? }????

??? }

??? public int rscore()

??? {

??? ????? return score;

??? }

public void clean(int i,Sprite sprite[])

{

?????? for (int z=i;z<i+3;z++)

?????? {

????????????? //sprite[z].setPosition(0,-1500);

????????????? sprite[z].setVisible(false);

????????????? no=1;????

?????? }}}

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

import java.util.*;

public class gameScreen extends GameCanvas implements Runnable,CommandListener

{?? private Form al;

??? public LayerManager lm,lm1;

??? TiledLayer b1;

??? int height=getHeight();

??? int bosscolor=0;

??? int sbosscolor=0;

??? int sbz=0;

??? int sbmove=0;

??? int sfire=0;

??? int smovebz=0;

??? int sbpzbz=0;

??? int slife=0;

??? int sbo=0;

??? int drawslife=0;

??? int lr=0;

??? int drawadd=0;

??? int pzbz=0;

??? int pzbzover=0;???

??? int? playlife=-1;

??? int bosslife=0;

??? int inputno=0;

??? int position=0;

??? int j1b=0;

??? int jbsz=-1;

??? int sbsz0=-1;

??? int sbsz1=-1;

??? int sbsz2=-1;

??? int sbsz3=-1;

??? int planepo;

??? int planepoup;

??? int kkk;

??? int gz=0;

??? int gzks=0;

??? int jiangli=0;

??? int jplaneno;

??? int cloundno=0;

??? int right=0;

??? int left=1;

??? int boss=0;

??? int over=0;

??? int ai=0;

??? int planert=-1;

??? int supermen=0;

??? int overcmd=0;

??? int bossover=0;

??? int jpb=-12;

??? int aipp=0;

??? int jbz=0;

??? int cloudposition;

??? Random aik=new Random();

??? Random aip=new Random();

??? Random aicloud=new Random();

??? int jb[]=new int[5];

??? int playerno=3;

private mybullets[] huokebullet=new mybullets[9];

privateSpritejbullet0,jbullet1,jbullet2,bossbullet0,bossbullet1,bossbullet2;

private Sprite cloud[]=new Sprite[5];

private MenuScreen ms;

privateSpritec1,sboss,cboss,j0,j1,j2,boss1; private lzhhdm midlet;

int s1=0;int s2=65;int s3=0;int row2;

int row;int planecolor=0;

int planecoco=0;public int by1;

public int y1;

public gameScreen (lzhhdm midlet)

{? super(true);this.midlet=midlet;

addCommand(new Command("暫停",Command.BACK,1));

?setCommandListener(this);

?lm=new LayerManager();

c1=new Sprite(img("/pic/MyPlaneFrames.png"),24,24);

cboss=newSprite(img("/pic/boss.png"),65,50);jbullet0=newSprite(img("/pic/bullet.png"),6,6);

jbullet1=new Sprite(img("/pic/bullet.png"),6,6);

jbullet2=new Sprite(img("/pic/bullet.png"),6,6);

bossbullet0=new Sprite(img("/pic/bullet.png"),6,6);

bossbullet1=new Sprite(img("/pic/bullet.png"),6,6);

bossbullet2=new Sprite(img("/pic/bullet.png"),6,6);

sboss=new Sprite(img("/pic/smallboss.png"),65,50);

b1=createBackGround(); c1.setPosition(getWidth()/2,row2+getHeight()-25);

System.out.println("ffffffffffff");

?planepoup=row2;

?planepo=row2+getHeight();

j0=new Sprite(img("/pic/jplane2.png"),24,22);

?j1=new Sprite(img("/pic/jplane2.png"),24,22);

?j2=new Sprite(img("/pic/jplane2.png"),24,22);

?kkk=getHeight()/8;

?lm.append(j0);

?lm.append(j1);

?lm.append(j2);

?cboss.setVisible(false);

?aipp=aip.nextInt()%3;

if(aipp==0)

{aipp=aip.nextInt()%3;

}lm.append(cboss);

?lm.append(bossbullet0);

?lm.append(bossbullet1);

?lm.append(bossbullet2);

?lm.append(jbullet0);

?lm.append(jbullet1);

lm.append(jbullet2);

?lm.append(sboss);

?jb[0]=1;jb[1]=1;jb[2]=1;jb[3]=1;

?try{for(int i=0;i<=4;i++){

?cloud[i]=new Sprite(img("/pic/cloud1.png"),16,16);

?lm.append(cloud[i]);}

?}catch(Exception e)

{System.out.println("cloud");}

try{for(int i=0;i<9;i++){

??? ??????????????????? huokebullet[i]=playerbullet("/pic/bullet.png");}}catch(Exception e){}

?try{for(int i=0;i<=8;i=i+3)

?{huokebullet[i].no=1;//ok

? huokebullet[i].score=0;}

? }catch(Exception e){System.out.println("ffffffffffffff");}

?for(int i=0;i<9;i++){

?lm.append(huokebullet[i]);}

?lm.append(c1);lm.append(b1);

}

private Image img (String pic)

{

?Image img=null;

try{ img=Image.createImage(pic);

}catch(Exception exp)

{System.out.println(exp);

}return img;

}

private mybullets playerbullet(String pic)

{Image img=null;

try{ img=Image.createImage(pic);

}catch(Exception exp)

{System.out.println(exp);

}return new mybullets(img,6,6,21,getWidth(),getHeight());}

public TiledLayer createBackGround()

{Image img=null;

try{??????? img=Image.createImage("/pic/beijing.png");

?????????????

?????? }catch(Exception exp)

{System.out.println("layer create image");

}???????????

TiledLayer tiledLayer=new TiledLayer(50,200,img,16,16);

int[] map1[]{ 地圖};

for(int i=0;i<map1.length;i++)

{ int? column=i%15;

row=(i-column)/15;?? ???? tiledLayer.setCell(column,row,map1[i]);}

row2=(row+1)*16-getHeight();

y1=-row2;

return tiledLayer;}

boolean conti=true;

int rate=50;

?????? public void run()

?????? {?? long st=0;

????????????? long et=0;

????????????? Graphics g=getGraphics();

????????????? int l=1350;

?????? ??? while(conti){?

st=System.currentTimeMillis();

???????????????????? input();

if(huokebullet[0].isAlive(0)){

huokebullet[0].no--;

if(huokebullet[0].no>0){?? ????? huokebullet[0].newposition(huokebullet,0,3,j0,j1,j2,cboss,img("/pic/explosion.png"));???? }

if(huokebullet[0].no<=0){??

huokebullet[0].setAlive(0);???????? ???? ?????huokebullet[0].clean(0,huokebullet);

?}}??????? ??? if(huokebullet[3].isAlive(3))

{huokebullet[3].no--;

if(huokebullet[3].no>0)

{? huokebullet[3].newposition(huokebullet,3,3,j0,j1,j2,cboss,img("/pic/explosion.png"));?????? }

?if(huokebullet[3].no<=0)

{huokebullet[3].setAlive(3);??????????

?huokebullet[3].clean(3,huokebullet);

}}?? ?????? if(huokebullet[6].isAlive(6))

{huokebullet[6].no--;??

if(huokebullet[6].no>0){?? ????? huokebullet[6].newposition(huokebullet,6,3,j0,j1,j2,cboss,img("/pic/explosion.png"));???? }

if(huokebullet[6].no<=0){huokebullet[6].setAlive(6);??????????

huokebullet[6].clean(6,huokebullet);} }if (huokebullet[0].collidesWith(cboss,true))

{huokebullet[0].setVisible(false);????????????? ??? huokebullet[1].setVisible(false);??????? ?? ?huokebullet[2].setVisible(false);

cboss.setFrame(1);

?if(bosslife<=55)

?{bosslife=bosslife+5;}

? huokebullet[0].setAlive(0);???????? huokebullet[0].clean(0,huokebullet);} if(huokebullet[0].collidesWith(sboss,true)&&(sbpzbz==0)){ ????? huokebullet[0].setVisible(false);

?? huokebullet[1].setVisible(false);?? ??????? huokebullet[2].setVisible(false);

?????? sboss.setFrame(1);

if(slife<=75){slife=slife+5;}

?huokebullet[0].setAlive(0);????????? ?????? huokebullet[0].clean(0,huokebullet);if(huokebullet[3].collidesWith(cboss,true)){cboss.setFrame(1);???????????? ?????? huokebullet[3].setVisible(false);

?huokebullet[4].setVisible(false);??????????????????????????? huokebullet[5].setVisible(false);

huokebullet[3].no=0;

if(bosslife<=55){

bosslife=bosslife+5;}??????????????????????? ? ?? ??????

huokebullet[3].setAlive(3);????????? huokebullet[3].clean(3,huokebullet);}

if(huokebullet[3].collidesWith(sboss,true)&&(sbpzbz==0)){sboss.setFrame(1);

huokebullet[3].setVisible(false);

huokebullet[4].setVisible(false);

huokebullet[5].setVisible(false);

huokebullet[3].no=1;

if(slife<=75){slife=slife+5;}

huokebullet[3].setAlive(3);?????????? huokebullet[3].clean(3,huokebullet);}

if(huokebullet[6].collidesWith(cboss,true)){???? huokebullet[6].setVisible(false);? ??????? huokebullet[7].setVisible(false);

huokebullet[8].setVisible(false);

cboss.setFrame(1);

if(bosslife<=55){ bosslife=bosslife+5;

}huokebullet[6].setAlive(6);????????? huokebullet[6].clean(6,huokebullet);??

}if(huokebullet[6].collidesWith(sboss,true)&&(sbpzbz==0)){sboss.setFrame(1);

?huokebullet[6].setVisible(false);????????????? ??? huokebullet[7].setVisible(false);??????? ?? huokebullet[8].setVisible(false);

if(slife<=75){slife=slife+5;}

huokebullet[6].setAlive(6);?????? ?????????????????????? ?????? huokebullet[6].clean(6,huokebullet);;}if((y1>-1350)&&(pzbzover==0))

{

?????? switch (ai){

?????? ??? ????? case 0:

?????? ?? ????????????? if(jb[0]==1){

?????? ??? ??????????????????? jbz=0;

???????????????????? ???? ??j0.setVisible(true);

?????? ????????? ????j1.setVisible(true);

?????? ????????????? j2.setVisible(true);

j1.setFrame(2);

?? ??????????????j0.setFrame(2);

?? ??????????????j2.setFrame(2);? j0.setPosition(100-aipp*30,planepoup+24);?? ???? ??????????j1.setPosition(100,planepoup); ????????????????j2.setPosition(100+aipp*30,planepoup-24);jb[0]=2;}

if (jb[0]==2){? j0.move(0,3);

j1.move(0,3);j2.move(0,3);

kkk=kkk-1;? }

if(kkk<=0){jb[0]=3;

if(aipp>=0){

j1.setFrame(0);? ??????? ??????j0.setFrame(0);j2.setFrame(0);?? ???? ????????????????????j0.move(-3,3);j1.move(-3,3);???? ?? ???????????????j2.move(-3,3);}else if(aipp<0)

{j1.setFrame(1);????????? ?????????? j0.setFrame(1);?????????? ???? j2.setFrame(1);j0.move(3,3);j1.move(3,3);

j2.move(3,3);}

if(j2.getY()>planepo)?? {

j0.setVisible(false);j1.setVisible(false);

j2.setVisible(false);jbullet0.setVisible(false);jbullet1.setVisible(false);???????? jbullet2.setVisible(false);jpb=-1;

ai=aik.nextInt()%4;????? ??? ????? ????????aipp=aip.nextInt()%5;

if(aipp==0){aipp=aip.nextInt()%5;

}if(ai<0) ai=ai*(-1);

jb[ai]=1;?????? ????????kkk=getHeight()/8;}}??????????? if((j1.getX()<=c1.getX()-18)&(jbz==0))

{ jpb=0;if(j0.isVisible()){

?jbullet0.setVisible(true);}

?if(j1.isVisible()){

? jbullet1.setVisible(true);}

? if(j2.isVisible()){

? jbullet2.setVisible(true);}????????? jbullet0.setPosition(j0.getX()+12,j0.getY()+30);jbullet1.setPosition(j1.getX()+12,j1.getY()+30);jbullet2.setPosition(j2.getX()+12,j2.getY()+30);jbz=1;}break;????? case 1:

?????? if(jb[1]==1){j0.setVisible(true);

? j1.setVisible(true);j2.setVisible(true);

?j1.setFrame(2);?? j0.setFrame(2);

j2.setFrame(2);j0.setPosition(100-aipp*30,planepoup+24);j1.setPosition(100,planepoup);j2.setPosition(100+aipp*30,planepoup-24);;jb[1]=2;}

if (jb[1]==2){? j0.move(0,3);

j1.move(0,3); j2.move(0,3);

kkk=kkk-1;}

if(kkk<0){jb[1]=3;}

if(jb[1]==3){ jpb=1;j1.setFrame(3);

j0.setFrame(3);j2.setFrame(3);

jb[1]=4;}

if(jb[1]==4){j0.move(0,-4);

j1.move(0,-4); j2.move(0,-4);??? ???

if(j2.getY()<planepoup) {j0.setVisible(false);

j1.setVisible(false);j2.setVisible(false);

jbullet0.setVisible(false);????? ? jbullet1.setVisible(false);jpb=-1;??? ?? ??jbullet2.setVisible(false);? ??? ????? ????ai=aik.nextInt()%4;???????????? ??? ????? ????????if(ai<0) ai=ai*(-1);jb[ai]=1;??

aipp=aip.nextInt()%5;???????? ??? ????? ?????if(aipp==0){ aipp=aip.nextInt()%5;}

kkk=getHeight()/8; }}break;

case 2: if(jb[2]==1){

jbz=0;j0.setVisible(true);

j1.setVisible(true);j2.setVisible(true);

j1.setFrame(2);j0.setFrame(2);j2.setFrame(2);?????? j0.setPosition(100-aipp*30,planepoup+aipp*30);j1.setPosition(100,planepoup);???? j2.setPosition(100+aipp*30,planepoup+aipp*30);;

jb[2]=2;} if (jb[2]==2){?

j0.move(0,3);j1.move(0,3);

j2.move(0,3);kkk=kkk-1;

}if(kkk<=0){jb[2]=3;

j1.setFrame(0);j0.setFrame(0);j2.setFrame(0);j0.move(-3,3);j1.move(-3,3);

j2.move(-3,3);? ? ???if(j2.getY()>planepo) {jpb=-1;

jbullet0.setVisible(false);

? jbullet1.setVisible(false);

?jbullet2.setVisible(false);

j0.setVisible(false); j1.setVisible(false);

j2.setVisible(false); ai=aik.nextInt()%4;

if(ai<0) ai=ai*(-1); jb[ai]=1;? ?? ????????aipp=aip.nextInt()%5; if(aipp==0)

{aipp=aip.nextInt()%5; }

kkk=getHeight()/8; ??? }

}??? if(((j1.getX()<=c1.getX()-18)||((j2.getX()-6)>=c1.getX()))&(jbz==0))

{if(j0.isVisible()){jbullet0.setVisible(true);} if(j1.isVisible()){

jbullet1.setVisible(true);}

if(j2.isVisible()) {

jbullet2.setVisible(true);}????

jpb=0; jbullet0.setPosition(j0.getX()+12,j0.getY()+30);?????? jbullet1.setPosition(j1.getX()+12,j1.getY()+30);

jbullet2.setPosition(j2.getX()+12,j2.getY()+30);jbz=1;}

??? ????? ??break;

???????? case 3:

?if(jb[3]==1){jbz=0;?? ??? j0.setVisible(true);j1.setVisible(true);

j2.setVisible(true);j1.setFrame(2);

j0.setFrame(2);j2.setFrame(2);?? j0.setPosition(200-aipp*50,planepoup-aipp*10);

j1.setPosition(100,planepoup);?? ??????????? j2.setPosition(100+aipp*50,planepoup-aipp*10); jb[3]=2; }

if (jb[3]==2){? j0.move(0,3);

j1.move(0,3);j2.move(0,3);

if(gzks==0){if(j1.getX()<c1.getX())

{j1.move(2,2);j1.setFrame(1);}

if(j1.getX()>c1.getX()){ j1.setFrame(0);

j1.move(-2,2);} if((j1.getX()<c1.getX())&&((j1.getX()+48)>c1.getX())&&(j1.getY()<c1.getY()))

?{j1.setFrame(2);j1.move(0,2); if(j1b==0){ jbullet1.setPosition(j1.getX()+12,j1.getY()+30);j1b=1;}}

?j0.move(0,3);jbullet1.move(0,3);

?j1.move(0,3);j2.move(0,3);} if((j2.getY()>(planepo+22))&&(j0.getY()>(planepo+22))&&((j1.getY()<(planepoup-22))||(j1.getY()>(planepo+22)))){

?jb[3]=1;

gz=0;gzks=0;jbullet1.setVisible(false);

jbullet2.setVisible(false);???? ?? ???????????????j0.setVisible(false);

???? j1.setVisible(false);

??? ????? j2.setVisible(false);

? ai=aik.nextInt()%4; if(ai<0)

?ai=ai*(-1);

jb[ai]=1;?? aipp=aip.nextInt()%5;

if(aipp==0) {aipp=aip.nextInt()%5;}

kkk=getHeight()/8;? }

if((j2.getX()<=c1.getX()-18)&(jbz==0))/

{ jpb=0; if(j0.isVisible())

{jbullet0.setVisible(true);}

if(j2.isVisible()){jbullet2.setVisible(true);

}jbullet0.setPosition(j0.getX()+12,j0.getY()+30);jbullet2.setPosition(j2.getX()+12,j2.getY()+30); jbz=1; }} break;}}if(jpb==0)

{jbullet0.move(0,5); jbullet1.move(0,5);

jbullet2.move(0,5); }

if((jbullet0.collidesWith(c1,true)||jbullet1.collidesWith(c1,true)||jbullet2.collidesWith(c1,true)||bossbullet0.collidesWith(c1,true)||bossbullet1.collidesWith(c1,true)||bossbullet2.collidesWith(c1,true))&&(pzbz==0)){

c1.setImage(img("/pic/explosion.png"),32,32); c1.setFrame(3); if((playerno>0))

{playerno=playerno-1; planert=1;

}else{pzbz=1; overcmd=1;???????

over=1;}}???? if((j0.collidesWith(c1,true)&&(pzbz==0)))????? {

?????? c1.setImage(img("/pic/explosion.png"),32,32); c1.setFrame(3); if(playerno>0)

?????? {playerno=playerno-1; planert=1;

playlife=0; }else{overcmd=1; playlife=1;

over=1;} j0.setVisible(false); pzbz=1;

}if((j1.collidesWith(c1,true)&&(pzbz==0))) {c1.setImage(img("/pic/explosion.png"),32,32); c1.setFrame(3); if(playerno>0)

{playerno=playerno-1; planert=1;

playlife=0; }else{overcmd=1;??????????

playlife=1; over=1;} j1.setVisible(false);

pzbz=1; if((j2.collidesWith(c1,true)&&(pzbz==0)))??????

{c1.setImage(img("/pic/explosion.png"),32,32); c1.setFrame(3);

if(playerno>0) {

playerno=playerno-1; planert=1;

playlife=0; }else{playlife=1;

if(overcmd==0) {}overcmd=1;

}???? over=1;} j2.setVisible(false);

pzbz=1; }if(overcmd==1)

{addCommand(new Command("返回",Command.OK,1)); overcmd=2;

if(boss==1) {cboss.setVisible(true);

if(cboss.getY()<25) {

????????????? ?? cboss.move(0,3);

????????????? ? }else lr=1;

????????????? if(lr==1)

????????????? {if(cboss.getX()<0)

???????????????????? {

??????????????????????????? right=0;

?????? left=1;? }

?????? else if(cboss.getX()>getWidth()-cboss.getWidth())

{left=0; right=1; }

if(right==0) {cboss.move(3,0); }

else if(left==0) {cboss.move(-3,0);} }

?????? if(((cboss.getX()<=c1.getX()-10)||(cboss.getX()<=c1.getX()+60))&&(jbsz==0))? {bossbullet0.setPosition(cboss.getX()+6,cboss.getY()+40); bossbullet1.setPosition(cboss.getX()+30,cboss.getY()+52);? ???bossbullet2.setPosition(cboss.getX()+54,cboss.getY()+40);? jbsz=1; }if(jbsz==1){

bossbullet0.setVisible(true);

bossbullet1.setVisible(true);

bossbullet2.setVisible(true);

bossbullet0.move(0,5);

bossbullet1.move(0,5);

bossbullet2.move(0,5); }

if(bossbullet2.getY()>getHeight()){jbsz=0;}}

if(bosslife==60){ cboss.setVisible(false);

j1.setVisible(false);j0.setVisible(false);

j2.setVisible(false);bossbullet0.setVisible(false);bossbullet1.setVisible(false);bossbullet2.setVisible(false);jbullet0.setVisible(false);jbullet1.setVisible(false);jbullet2.setVisible(false);

pzbz=1;bossover=1;boss=2;bosslife=65;

pzbzover=1; addCommand(new Command("返回",Command.OK,1));

????????????? }if(bosslife==45)

?????? {bosscolor=1; }

?????? if(slife==65)

?????? {sbosscolor=1;}

?????? if(y1<0){ render(g);

y1=y1+1;planepoup=planepoup-1;

planepo=planepo-1;c1.move(0,-1); }

if (y1>=0 ) { if(boss==0)

{jbsz=0; boss=1; planepoup=0;

planepo=getHeight();cboss.setPosition(80,-60); }renderboss(g); } if(bosscolor==0)

cboss.setFrame(0); else cboss.setFrame(1);

if(sbosscolor==0) sboss.setFrame(0);

else sboss.setFrame(1); if(cloundno==0)

{? cloud[0].setPosition(25,planepoup-(65));

?????? cloud[1].setPosition(80,planepoup-(140);

????? cloud[2].setPosition(112,planepoup-(90));?????? ????? cloud[3].setPosition(175,planepoup-(200)); cloud[4].setPosition(223,planepoup-(70));

cloundno=1; } cloud[0].move(0,1);

cloud[1].move(0,1); cloud[2].move(0,1);

?????? ?? ??????? cloud[3].move(0,1);

?????? ?? ??????? cloud[4].move(0,1);

?????? ???????? if(cloud[0].getY()>planepo){

cloudposition=aicloud.nextInt()%5;

if(cloudposition<0) {??? ?? ???????????? cloudposition=cloudposition*(-1);

?????? }???? cloudposition=cloudposition+1;

?????? cloud[0].setPosition(cloudposition*40,planepoup);? }if(cloud[1].getY()>planepo){

?????? cloudposition=aicloud.nextInt()%5;

if(cloudposition<0) {??? cloudposition=cloudposition*(-1);

}???? cloudposition=cloudposition+1;

cloud[1].setPosition(cloudposition*30,planepoup); }if(cloud[2].getY()>planepo){

cloudposition=aicloud.nextInt()%5;

if(cloudposition<0) {coudposition=cloudposition*(-1);

}

?????? cloudposition=cloudposition+1;

?????? cloud[2].setPosition(cloudposition*55,planepoup); }if(cloud[3].getY()>planepo){

cloudposition=aicloud.nextInt()%5;

if(cloudposition<0) {cloudposition=cloudposition*(-1);

}cloudposition=cloudposition+1;

cloud[03].setPosition(cloudposition*15,planepoup); } if(cloud[4].getY()>planepo){

cloudposition=aicloud.nextInt()%5;

if(cloudposition<0) {cloudposition=cloudposition*(-1); }

cloudposition=cloudposition+1; cloud[4].setPosition(cloudposition*22,planepoup); }if((y1==-1000)&&(sbz==0))

{sbsz0=0; sbsz1=0; sbsz2=0; sbsz3=0;

drawslife=1; sboss.setVisible(true);

sboss.setPosition(50,planepoup-65);

sbz=1; }if(sbz==1) {sboss.move(0,3);

if(sboss.getY()>planepoup) {sbz=2;

}}

if(sbz==2) {if(((sboss.getY()-50)<c1.getY())&&(smovebz==0)) {???? sbmove=1;//上移}

if(((sboss.getX()+30)<c1.getX())&&(smovebz==0)) {sbmove=4;//右移}

if(((sboss.getY()+50)<c1.getY())&&(smovebz==0)) {sbmove=2; }

if(((sboss.getX()-30)>c1.getX())&&(smovebz==0)) {sbmove=3; }if(sbmove==1)//上移

{ smovebz=1; sboss.move(0,-2); }

if(sbmove==2){smovebz=1; sboss.move(0,2);

}if(sbmove==3) {sboss.move(-2,0); }

if(sbmove==4)

{smovebz=1; sboss.move(2,0);? }

if(sboss.getY()<planepoup) {

?????? sboss.setPosition(sboss.getX(),planepoup); ?? smovebz=0; }

if(sboss.getY()>(planepo-65)){????? ?sboss.setPosition(sboss.getX(),planepo-65);

smovebz=0; }if(sboss.getX()<0) {sboss.setPosition(0,sboss.getY());smovebz=0; }if(sboss.getX()>(getWidth()-65)) {?????? sboss.setPosition(getWidth()-65,sboss.getY());????? smovebz=0; } if(((sboss.getX()+40)<c1.getX())&&(sboss.getY()<c1.getY())&&((sboss.getY()+65)>c1.getY())&&(sbsz0==0))

{bossbullet0.setVisible(true);

bossbullet0.setPosition(sboss.getX()+45,sbos.

getY()+35); sbsz0=1;

?????? ???????? }

?????? ???????? if(sbsz0==1)

{bossbullet0.move(3,0);???? if(bossbullet0.getX()>getWidth()) {

sbsz0=0; } }if((sboss.getX()>c1.getX())&&((sboss.getY()+65)>c1.getY())&&(sbsz1==0))

{bossbullet1.setPosition(sboss.getX()+10,sboss.getY()+35); sbsz1=1; }

if(sbsz1==1) {????? bossbullet1.move(-3,0);

if(bossbullet1.getX()<0) {

bossbullet1.setVisible(false);?????? sbsz1=0;}}?? ? if((sboss.getX()<c1.getX())&&((sboss.getX()+50)>(c1.getX()))&&(sboss.getY()>c1.getY())&&(sbsz2==0))? {

bossbullet2.setVisible(true);

bossbullet2.setPosition(sboss.getX()+25,sboss.getY());sbsz2=1; }if(sbsz2==1)

{bossbullet2.move(0,-4); if(bossbullet2.getY()<planepoup)

{bossbullet2.setVisible(false);???? sbsz2=0;

} }if((sboss.getX()<c1.getX())&&((sboss.getX()+50)>(c1.getX()))&&(sboss.getY()<c1.getY())&&(sbsz3==0))

{bossbullet0.setVisible(true); bossbullet1.setVisible(true); bossbullet2.setVisible(true);

bossbullet2.setPosition(sboss.getX()+10,sboss.getY()+25); bossbullet1.setPosition(sboss.getX()+30,sboss.getY()+50);

bossbullet0.setPosition(sboss.getX()+55,sboss.getY()+25); sbsz3=1; }

if(sbsz3==1) {bossbullet0.move(0,4);

bossbullet1.move(0,4); bossbullet2.move(0,4);

if(bossbullet0.getY()>planepo)

{

bossbullet0.setVisible(false);

bossbullet1.setVisible(false);

bossbullet2.setVisible(false); sbsz3=0;

}}} if((slife==80)) {

sboss.setImage(img("/pic/explosion.png"),32,32);sboss.setFrame(3);bossbullet0.setVisible(false); bossbullet1.setVisible(false);

bossbullet2.setVisible(false); jiangli=11;

slife=85; drawslife=0;

playerno=playerno+1; sbz=-1;//sbos ??????? sbpzbz=1; }

if((sboss.getY()==getHeight())){

sbz=-1; sbpzbz=1; drawadd=21;

}if(drawadd==21) {sboss.move(0,-3);

if(sboss.getY()<-65) {

sboss.setVisible(false); drawadd=31;

}}if(planert==1) {inputno=1;

pzbz=1; s2=65; c1.setImage(img("/pic/MyPlaneFrames.png"),24,24); c1.setFrame(0); c1.setVisible(true);?

c1.setPosition(getWidth()/2,planepo+48);

planert=2;

}if(planert==2)

{c1.move(0,-2); if(c1.getY()<(planepo-24))

{System.out.println(c1.getY());

System.out.println(planepo-24);inputno=0;

s1=1;

planert=3; }if(c1.getY()>(planepo+24))

{? c1.move(0,-2); }}

et=System.currentTimeMillis();

if((et-st)<rate){try{????? Thread.sleep(rate-(et-st));

}catch(Exception exp){} }

}}public void render(Graphics g)

{ g.setColor(255,255,255);

g.fillRect(0,0,getWidth(),getHeight());

lm.setViewWindow(0,0,getWidth(),getHeight()+10000); lm.paint(g,0,y1); if(over==1)

{ g.drawString("寒在杭州覽橋上空因座機被擊中,壯烈殉國,年",c1.getWidth()-24,60,0); g.drawString("1937年 8月14日,空軍第4大隊少尉飛行員劉思",c1.getWidth()-24,40,0); g.drawString("僅21歲",c1.getWidth()-24,80,0); inputno=1;

}g.drawString("37年8月14日 杭州覽橋 戰果:"+String.valueOf(huokebullet[0].rscore()+huokebullet[3].rscore()+huokebullet[6].rscore()),c1.getWidth()-24,c1.getHeight()-20,0);//

if(drawslife==1) {g.setColor(255,0,0);

g.fillRect(2,22,80,5);g.setColor(255,255,255);

g.fillRect(2,22,slife,5); }

if(playerno==3) {g.drawImage(img("/pic/playerbiaozhi.png"),170,4,0);? g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0); g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0); }if(playerno==2)

{g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0);

g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0); }if(playerno==1) {

g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0); }if(playerno==4)

{g.drawImage(img("/pic/playerbiaozhi.png"),145,4,0);

?????? g.drawImage(img("/pic/playerbiaozhi.png"),170,4,0);

g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0);

?? g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0);g.setColor(255,0,0); }

if(jiangli==11){g.setColor(255,0,0);

g.drawString("援軍到達",100,150,0);

if(sboss.getY()>planepo) {jiangli=20;

?????? }} if(s1==1) {g.setColor(255,255,255);

g.fillRect(170,22,65,5); g.setColor(255,0,0);

g.fillRect(170,22,s2,5); g.drawString("無敵時間",124,18,0); drawadd=1; s2=s2-1;?????

if(s2==0) {pzbz=0; s1=2; }}

flushGraphics();}public void renderboss(Graphics g) {lm.setViewWindow(0,0,getWidth(),getHeight());?????? lm.paint(g,0,0); if(over==1)

{//c1.getHeight(),0); g.drawString("1937年 8月14日,空軍第4大隊少尉飛行員劉思",c1.getWidth()-24,40,0);

g.drawString("僅21歲",c1.getWidth()-24,80,0); inputno=1;

} g.setColor(255,0,0); g.fillRect(2,2,60,5);//

g.setColor(255,255,255); g.fillRect(2,2,bosslife,5);//

if((bossover==1)&&(c1.isVisible()))

{g.drawString("此處加覽橋空戰真實歷史戰果",c1.getWidth()-24,40,0); g.drawString("此處加覽橋空戰真實歷史戰果",c1.getWidth()-24,60,0); g.drawString("僅21歲",c1.getWidth()-24,80,0); }

if(playerno==4) {g.drawImage(img("/pic/playerbiaozhi.png"),145,4,0); g.drawImage(img("/pic/playerbiaozhi.png"),170,4,0);? g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0);??????? g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0);} if(playerno==3) {

g.drawImage(img("/pic/playerbiaozhi.png"),170,4,0);

g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0);???? ??????? g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0);}if(playerno==2){???? ?????? g.drawImage(img("/pic/playerbiaozhi.png"),195,4,0);

g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0);

}if(playerno==1){ g.drawImage(img("/pic/playerbiaozhi.png"),220,4,0); }

if(s1==1) {??? g.setColor(255,255,255);

g.fillRect(170,22,65,5);g.setColor(255,0,0);

g.fillRect(170,22,s2,5);g.drawString("無敵",124,18,0);s2=s2-1;if(s2==0)

{pzbz=0;s1=2;}}

flushGraphics();}

public void input(){?? if(inputno==0)

{int keystate=getKeyStates();

if((keystate&UP_PRESSED)!=0){

moveUp();}

if((keystate&DOWN_PRESSED)!=0){

moveDown();}if((keystate&LEFT_PRESSED)!=0){ moveLeft();}

if((keystate&LEFT_PRESSED)==0){

c1.setFrame(0);}if((keystate&RIGHT_PRESSED)!=0){moveRight();}

if((keystate&FIRE_PRESSED)!=0){

for(int i=0;i<=6;i=i+3){

if(huokebullet[i].no==1){??

for( int z=i;z<i+3;z++){ ?????????????????????????

huokebullet[z].initBullets(z);????????????????????? ??????? huokebullet[z].no=huokebullet[z].bulletheight

}huokebullet[i].setfirstposition(c1.getX(),c1.getY(),i,huokebullet,img("/pic/bullet.png"));//

break;}}}}}private void moveDown() {

c1.move(0,4);?????????????

if((c1.getY()+c1.getHeight())>planepo)

{

c1.setPosition(c1.getX(),planepo-c1.getHeight());}}private void moveUp() {c1.move(0,-4);

if(c1.getY()<planepoup){?? c1.setPosition(c1.getX(),planepoup);}}

?????? private void moveRight() {

????????????? ? c1.setFrame(2);

???????????????????? c1.move(3,0);

?????? if(c1.getX()>(getWidth()-c1.getWidth()))

?????? {????????????????????????? c1.setPosition((getWidth()-c1.getWidth())c1.getY());?????????????????

}???? }

private void moveLeft() {

????????????? c1.move(-3,0);

????????????? c1.setFrame(1);???

????????????? if(c1.getX()<=0)

?????? ??? {

?????? ??? ????? c1.setPosition(0,c1.getY());

?????? ??? }

?????? }

?????? public void start()

?????? {

????????????? Thread t=new Thread(this);

????????????? t.start();

?????? }

?????? public void commandAction(Command c,Displayable d)

?????? {

????????????? if(c.getLabel()=="暫停")

????????????? {?? conti=false;

????????????? ?removeCommand(c);

????????????? ?addCommand(new Command("繼續",Command.OK,1));

????????????? }

????????????? if(c.getLabel()=="繼續")

????????????? {?? conti=true;

????????????? start();//

????????????? ?removeCommand(c);

????????????? ?addCommand(new Command("暫停",Command.OK,2));

????????????? }

if(c.getLabel()=="返回")

????????????? {?? conti=false;

midlet.menuscreensecond();

?????? }

?????? }?

}

?

?

?

?

?

????????????????????

?????? ?? ?????

??????


附錄二? 操作說明

在電腦中使用模擬器的步驟如下:

1?? 使用WTK的新建項目功能建立一個新項目,要求與Eclipse工作區下的項目名稱MIDlet類名相同。

2?? 新建項目后,將Eclipse工作區下的.java文件拷入src文件夾,將.class文件拷入class文件夾(需要新建),將pic文件夾拷入res文件夾,點擊生成,如一切正常。

3?? 選擇項目-包-生成包。

4?? 生成的jar和jad文件存儲在lzhhdm/bin目錄下。

?? 5??? 運行Motorola SDK v4.2 for J2ME,使用MOTOA760手機模擬器進行測試。點擊Lanuc按紐,即可以進行游戲了。

電腦鍵盤的方向鍵上、下、左、右可以控制玩家飛機的運動,回車可以發射子彈。

可以將鼠標移動到相應的按紐處單擊,以測試相應的按紐。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

附錄三? 英文文獻及其譯文

What's New in the J2ME Wireless Toolkit 2.2

by Jonathan Knudsen
June 2004

The award-winning J2ME Wireless Toolkit has become the de facto standard toolkit for developing applications for Java 2, Micro Edition (J2ME). Since its debut in 2000, the toolkit has evolved to keep pace with the rapidly changing face of mobile Java technology. Don't be misled by the small change in version number from 2.1. The new toolkit supports new optional APIs specified through the Java Community Process (JCP) in four vital areas: 3D graphics, multimedia messaging, Bluetooth networking, and data management. In this article I'll describe these new APIs and show you how they're implemented in the toolkit.

Before I do, take a moment to admire the updated DefaultColorPhone emulator skin. Since version 2.1, this skin has gotten a larger screen (320 x 240, or QVGA) and far more colors (4096 instead of 256).

Mobile 3D Graphics

JSR 184, the Mobile 3D Graphics API for J2ME (M3G), provides three-dimensional graphics functionality in a compact package that's appropriate for devices that support the most widely adopted J2ME software stack, the Connected, Limited Device Configuration (CLDC) and the Mobile Information Device Profile (MIDP). The API provides two APIs for displaying 3D content. The immediate mode API makes it possible for applications to create and manipulate 3D elements directly. On top of this layer is a scene graph API, also called retained mode, that makes it possible to load and display entire 3D scenes you've designed ahead of time. Applications may use whichever API is most appropriate, or a combination of retained mode and immediate mode. The JSR 184 specification also defines a file format for scene graphs, .m3g.

The toolkit's emulator fully supports JSR 184 and you'll find several MIDlets that show off the API's capabilities in the Demo3D project.

Life3D demonstrates the use of immediate mode:

PogoRoo is an interactive demonstration that features a bouncing kangaroo:

Finally, retainedmode shows how to load and render a scene graph file:

Multimedia Messaging

The J2ME Wireless Toolkit has long supported JSR 120, version 1.1 of the Wireless Messaging API (WMA); the new release supports WMA 2.0 (JSR 205), which expands WMA's capabilities to include Multimedia Messaging.

In the toolkit, messaging takes place in a simulated environment. If you run the emulator multiple times, applications on the emulators can communicate with each other, and you can use the toolkit's handy WMA Console utility to exchange messages with the applications in the same environment. Messages may conform to any of three standard protocols: Short Message Service (SMS), Cell Broadcast Service (CBS), or - new in version 2.2 of the toolkit - Multimedia Messaging Service (MMS).

You can address MMS messages and add any collection of files to the message.

Furthermore, the network monitor now displays MMS messages that are sent or received by the emulator.

Bluetooth and OBEX

The J2ME Wireless Toolkit emulator supports JSR 82, the Java APIs for Bluetooth, which includes two independent APIs:

The Bluetooth API provides an interface to Bluetooth wireless

networking, including device discovery and data exchange.

The OBEX API allows applications to use the Object Exchange (OBEX)

protocol over Bluetooth or other communication channels.

?

The toolkit allows you to develop and test applications that use Bluetooth technology even if you don't have any actual Bluetooth hardware. The toolkit simulates a Bluetooth environment, in which you can run multiple emulator instances that can discover each other and exchange data using the Bluetooth API.

?

An example application, BluetoothDemo, shows how to transfer imagesfrom? one emulator to another.

?

The J2ME Wireless Toolkit implements OBEX transfer over simulated Bluetooth and infrared connections. The simulated infrared connection

follows the IrDA standard defined by the Infrared Data Association. The? toolkit simulates infrared transfers between multiple running emulators.

?????

You can configure the Bluetooth and OBEX environment using the Bluetooth/OBEX tab in the toolkit preferences. This controls such

parameters as how long the emulator attempts to discover other devices in the simulated Bluetooth environment and the maximum packet size. See the toolkit's User's Guide for more details.

?????

Local Files and Personal Information

The J2ME Wireless Toolkit supports JSR 75, the PDA Optional Packages for

the J2ME Platform, which also includes two independent APIs:

?

The FileConnection API gives MIDlets access to a local file system on the device.

The Personal Information Management (PIM) optional package includes APIs for manipulating contact lists, calendars, and to-do lists.

?????

A real device may have a local file system which can be accessed using the FileConnection API. In the J2ME Wireless Toolkit emulator, a simulated file system is maintained as a directory on your hard disk.

?????

The files your application can access using FileConnection are stored in subdirectories of <toolkit>/appdb/<skin>/filesystem., where <toolkit> is the installation directory of the J2ME Wireless Toolkit and <skin> is the name of the emulator skin. For example, the DefaultColorPhone emulator skin comes with a root directory installed called root1, which contains a file called Readme. The file's full path is <toolkit>/appdb/DefaultColorPhone/filesystem/root1/Readme.

?????

You can manage the root directories that are available by choosing MIDlet > External events from the emulator window's menu. You'll see a small utility window for adding and removing roots. These actions will also generate events for a registered listener object.

In a real device, personal information might be stored in a proprietary

format in memory. The emulator uses a directory on your hard disk to

contain this information, accessible using the PIM API. All information is stored in <toolkit>/appdb/pim. Lists are stored in subdirectories of the contacts, events, and todo directories. For example, a contact list called Contacts is contained in <toolkit>/ appdb/ pim/ contacts/ Contacts.

????

Inside the list directory, items are stored in standard formats specified by the Internet Mail Consortium. Contacts are stored in vCard format, while calendar and to-do items are both stored in vCalendar format.

Summary

The J2ME Wireless Toolkit 2.2 is much more than an incremental update of an excellent tool. It includes support for four exciting new

specifications that together define six new APIs. As the world of wireless Java technology rapidly evolves, the J2ME Wireless Toolkit keeps pace and contains all the tools you need for

About the Author: Jonathan Knudsen [e-mail] [home page] is the author of several books, including Wireless Java (second edition), The Unofficial Guide to LEGO MINDSTORMS Robots, Learning Java (second edition), and Java 2D Graphics. Jonathan has written extensively about Java and Lego robots, including articles for JavaWorld, EXE, NZZ Folio, and the O'Reilly Network. Jonathan holds a degree in mechanical engineering from Princeton University.

譯文

J2ME Wireless Toolkit 2.2 新改進

作者:Jonathan Knudsen
2004 年 6 月

屢獲殊榮的 J2ME Wireless Toolkit 已經成為 J2ME 開發應用程序的事實標準工具包。自從 2000 年初次亮相以來,該工具包一直在發展以趕上移動 Java 技術外觀上快速改變的步伐。不要被從 2.1 版本以來的小改變所誤導。新的工具包在四個重要的領域支持 Java Community Process (JCP) 所指定的新的可選 API:3D 圖形、多媒體通信、藍牙連網(Bluetooth networking)和數據管理。本文將描述這些新的 API 并且向您展示如何在工具包中實現他們。

在這之前,讓我們贊美一下更新后的 DefaultColorPhone 模擬器皮膚,自從 2.1 版本以來,該皮膚已有了一個更大的屏幕(320 x 240, 或 QVGA)和更多的顏色(4096 色而不是 256 色)。

移動 3D 圖形

JSR 184,? 即 Mobile 3D 圖形 API for J2ME (M3G) 在一個集成軟件包中提供了三維圖形功能,適用于支持最為廣泛采用的 J2ME 軟件棧、有限連接設備配置(CLDC)和移動信息設備描述(MIDP)的設備。API 為顯示 3D 內容提供了兩種 API。立即模式 API 使應用程序能夠直接創建和操縱 3D 元素。這一層之上是一個場景圖 API,也稱為保留模式,能夠提早加載并顯示已設計的整個 3D 場景。應用程序可以采用最適合的 API,或保留模式與立即模式的組合。JSR 184 規范還為場景圖定義了一種文件格式-.m3g。

該工具包的模擬器全面支持 JSR 184,并且有幾個 MIDlet 展示了 API 在 Demo3D 項目中的功能。Life3D 演示了立即模式的使用。PogoRoo 是一個的交互的演示,特點是顯示一只跳躍的袋鼠:

多媒體通信

J2ME Wireless Toolkit 長期支持 JSR 120、Wireless Messaging API(WMA)的1.1版本;新版本支持 WMA 2.0(JSR 205),其把 WMA 的功能擴展到包括多媒體通信。

在工具包中,通信發生于模擬的環境中。如果多次運行模擬器,模擬器上的應用程序能夠相互通信,并且可以使用工具包方便的 WMA Console 實用程序在同一環境中與應用程序交換消息。通信可以遵照以下三種標準協議之一:短消息服務(Short Message Service,SMS)、蜂窩廣播服務(Cell Broadcast Service,CBS)或工具包 2.2 版本中的新協議-多媒體通信服務(MMS)。

您可以標記 MMS 消息,并向消息添加任何文件集合。

而且,現在網絡監視器能夠顯示模擬器發送或接收的 MMS 消息。

藍牙和 OBEX

J2ME Wireless Toolkit 模擬器支持 JSR 82,即 Java API for Bluetooth,包括兩個獨立的 API:

藍牙 API 為藍牙無線網絡提供了接口,包括設備恢復和數據交換。

OBEX API 允許應用程序在藍牙或其他通信信道上使用對象交換(Object Exchange,OBEX)協議。

該工具包允許在即使沒有實際藍牙硬件的情況下,也可以開發和測試采用藍牙技術的應用程序。該工具包模擬藍牙環境,您可以在該環境中運行可相互發現的多個模擬器實例和使用藍牙 API 交換數據。

應用程序實例 BluetoothDemo 顯示了如何從一個模擬器將圖像傳輸到另一個模擬器。

J2ME Wireless Toolkit 通過模擬的藍牙和紅外連接上實現 OBEX 傳輸。模擬的紅外連接遵循 Infrared Data Association 定義的 IrDA 標準。工具包在多個運行的模擬器之間模擬紅外傳輸。

您可以使用工具包參數中的 Bluetooth/OBEX 標簽來配置藍牙和 OBEX 環境。其控制了諸如模擬器在模擬的藍牙環境中試圖用多長時間去發現其他設備,以及最大數據包大小等參數。請參見工具包的用戶指南獲取更多的詳細信息。

本地文件和個人信息

J2ME Wireless Toolkit 支持 JSR 75,即 PDA Optional Packages for the J2ME Platform,它也包括兩個獨立的 API:

FileConnection API 提供了 MIDlet 對設備上本地文件系統的訪問。

Personal Information Management (PIM) 可選軟件包包括用于操縱聯系人列表、日程安排和計劃列表的 API。

一臺真實的設備可能有一個能通過使用 FileConnection API 訪問的本地文件系統。在 J2ME Wireless Toolkit 模擬器中,模擬的文件系統作為硬盤上的一個目錄存在。

應用程序使用 FileConnection 可訪問的文件都存放在子目錄 <toolkit>/appdb/<skin>/filesystem.中,此處 <toolkit> 是 J2ME Wireless Toolkit 的安裝目錄,<skin> 是模擬器皮膚的名稱。例如,DefaultColorPhone 模擬器皮膚隨安裝根目錄 root1 而產生,包含一個 Readme 文件。文件的完整路徑為<toolkit>/appdb/DefaultColorPhone/filesystem/root1/Readme。

您可以從模擬器窗口的菜單種選擇 MIDlet > External events 來管理可用的根目錄。您將看到一個添加和刪除根目錄的小的實用程序窗口。這些操作也將為 registered listener 對象生成事件。

在真實的設備上,個人信息可能以專有格式存儲在內存中。模擬器使用硬盤中的一個目錄來存放這些信息,可使用 PIM API 來訪問。所有的信息存儲在 <toolkit>/appdb/pim 目錄中。列表存儲在聯系人、事件和計劃目錄的子目錄中。例如,聯系人列表 Contacts 位于 <toolkit>/appdb/pim/contacts/Contacts 目錄中。

在列表目錄內,列表項以 Internet Mail Consortium 指定的標準格式存儲。聯系人以 vCard 格式存儲,日歷和計劃項都以 vCalendar 格式存儲。

結束語

J2ME Wireless Toolkit 2.2 不僅僅是一個出色工具的增量更新。它包括了對令人激動的四項新規范的支持,同時定義了六種新的 API。隨著無線 Java 技術世界的快速發展,J2ME Wireless Toolkit 緊緊跟隨發展的步伐并且包含您所需的全部工具。

關于作者

Jonathan Knudsen[電子郵件] [主頁],有多本著作,包括:Wireless Java (second edition)、The Unofficial Guide to LEGO MINDSTORMS Robots、Learning Java (second edition) 和 Java 2D Graphics 。Jonathan 在 Java 和 Lego 機器人領域編寫了大量的文章,包括 JavaWorld、 EXE、 NZZ Folio 和 the O'Reilly Network 方面的文章。作者擁有普林斯頓大學的機械工程學位。


?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

目? 錄

1 緒論

1.1 手機軟件現狀

1.2 J2ME介紹

1.3 手機游戲應具有的特征

1.4 本游戲背景介紹

1.5 本章小結

2 開發環境及相關技術的介紹

2.1 開發環境

2.2 Java語言特點

2.3 關于ECLIPSE

2.4 關于Wireless Tool Kit

2.5 Java Appication Manager

2.6 本章小結:

3 程序結構、思想和相關技術

3.1 本程序需要解決的主要技術問題

3.2 程序流程

3.3 Canvas類

3.4 Graphics類

3.5 MIDP1.0技術下的繪制背景技術

3.6 MIDP2.0新增的GameCanvas包

3.7 PNG圖片格式

3.8 玩家飛機的控制方式和敵人方的智能運行

3.9 子彈的運行和控制

3.10 內存的優化

3.11 內存檢測器

3.12 關于混淆器

3.13 本章小結

4 程序分析和具體實現

4.1 游戲進入前的選擇

4.2 mybullets類

4.3 游戲邏輯及gameScreen類

4.3.1 gameScreen類所實現的功能

4.3.2 地圖的創建

4.3.3地圖的移動

4.3.4 gameScreen類的構造函數

4.3.5 關于commandAction()方法

4.3.6 Sprite類對象的碰撞檢測及相關屬性

4.3.7 玩家4次游戲機會的實現方法

4.3.8 input()

4.3.9 render()renderboss()

4.4 游戲中的獎勵及相關飛機的行為

4.5 普通敵人相關屬性

4.6 白云的實現原理

4.7 關尾BOSS及相關屬性

4.8本章小結

5測試

5.1 打包測試的過程

5.2 發現的BUG及解決情況

5.3 未完善的功能

6總結

6.1 本程序的總結和展望

6.2 感想

???

參考文獻

附錄一代碼

附錄二操作說明

附錄三英文文獻及其譯文

?

摘? 要

這款游戲的名字叫《覽橋風光》。J2ME(Java 2 Micro Edition) 是近年來隨著各種不同設備,尤其是移動通信設備的飛速發展而誕生的一項新的開發技術。它定位在消費性電子產品的應用上,對設備的智能化、多樣化,提供了革命性的解決方案,并因其“Write Once, run anywhere”的Java特性而提高開發的效率。

隨著手機的日益普及、Java功能在移動設備上的實現,Java應用程序產生的手機增值服務逐漸體現出其影響力,對豐富人們的生活內容、提供快捷的資訊起著不可忽視的作用。本論文著眼于J2ME技術的應用,開發一款可商用的手機游戲程序。本程序將老少皆宜的經典作品移植到手機上來,為更流行的硬件平臺提供應用軟件。

本論文介紹了J2ME的相關技術及本程序的結構分析和具體功能的實現。

總結

以上是生活随笔為你收集整理的手机游戏毕业设计论文的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲 a v无 码免 费 成 人 a v | √8天堂资源地址中文在线 | 精品亚洲韩国一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 国内老熟妇对白xxxxhd | 荡女精品导航 | 午夜熟女插插xx免费视频 | 亚洲一区二区三区在线观看网站 | 中文字幕无码av波多野吉衣 | 日韩精品乱码av一区二区 | 午夜熟女插插xx免费视频 | 欧美日韩亚洲国产精品 | 欧美日韩综合一区二区三区 | 久久国产劲爆∧v内射 | 一个人免费观看的www视频 | 亚洲国产av精品一区二区蜜芽 | 未满小14洗澡无码视频网站 | 无码免费一区二区三区 | 精品欧洲av无码一区二区三区 | 亚洲欧洲日本无在线码 | 国色天香社区在线视频 | 欧美阿v高清资源不卡在线播放 | 领导边摸边吃奶边做爽在线观看 | 麻豆av传媒蜜桃天美传媒 | 丝袜 中出 制服 人妻 美腿 | 免费无码av一区二区 | 亚洲成av人综合在线观看 | 久久国产精品偷任你爽任你 | 内射爽无广熟女亚洲 | 西西人体www44rt大胆高清 | 四十如虎的丰满熟妇啪啪 | 爆乳一区二区三区无码 | 久久天天躁狠狠躁夜夜免费观看 | 欧美喷潮久久久xxxxx | 亚洲成色www久久网站 | 麻豆果冻传媒2021精品传媒一区下载 | 国产激情精品一区二区三区 | 激情爆乳一区二区三区 | 香蕉久久久久久av成人 | 自拍偷自拍亚洲精品10p | 精品aⅴ一区二区三区 | 欧美亚洲国产一区二区三区 | 无码成人精品区在线观看 | 大肉大捧一进一出视频出来呀 | 中文字幕乱码人妻无码久久 | 55夜色66夜色国产精品视频 | 亚洲成a人一区二区三区 | 久久这里只有精品视频9 | 国内精品久久久久久中文字幕 | 老熟妇仑乱视频一区二区 | 亚洲熟女一区二区三区 | 国产成人无码午夜视频在线观看 | 亚洲精品一区二区三区四区五区 | 波多野结衣乳巨码无在线观看 | 国产精品爱久久久久久久 | 极品尤物被啪到呻吟喷水 | 久久国产精品偷任你爽任你 | 牲欲强的熟妇农村老妇女 | 波多野结衣乳巨码无在线观看 | 亚洲性无码av中文字幕 | 成人精品视频一区二区 | 中文字幕av无码一区二区三区电影 | 国产电影无码午夜在线播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久99精品国产麻豆蜜芽 | 国产精品亚洲一区二区三区喷水 | 夫妻免费无码v看片 | 少妇激情av一区二区 | 午夜熟女插插xx免费视频 | 日本乱人伦片中文三区 | 中文字幕中文有码在线 | 日韩精品一区二区av在线 | 男女猛烈xx00免费视频试看 | 久久精品国产精品国产精品污 | www国产亚洲精品久久久日本 | 大地资源中文第3页 | 日日躁夜夜躁狠狠躁 | 国产97色在线 | 免 | 99久久精品无码一区二区毛片 | 亚洲色大成网站www国产 | 中文字幕人妻无码一区二区三区 | 2020久久香蕉国产线看观看 | 精品熟女少妇av免费观看 | 国产一区二区三区日韩精品 | 成 人 网 站国产免费观看 | 久久久精品欧美一区二区免费 | 欧美freesex黑人又粗又大 | 国产精品无码永久免费888 | 亚洲精品国产a久久久久久 | 俺去俺来也www色官网 | 大地资源网第二页免费观看 | 久久久久亚洲精品中文字幕 | 丰满人妻翻云覆雨呻吟视频 | www国产亚洲精品久久久日本 | 国产午夜无码视频在线观看 | 久久久久99精品成人片 | 亚洲七七久久桃花影院 | 1000部啪啪未满十八勿入下载 | 7777奇米四色成人眼影 | 无码中文字幕色专区 | 一本色道久久综合亚洲精品不卡 | 蜜臀av无码人妻精品 | 人妻插b视频一区二区三区 | 精品国偷自产在线视频 | 人人妻人人澡人人爽欧美一区九九 | 国产va免费精品观看 | 亚洲精品一区二区三区在线 | 午夜无码人妻av大片色欲 | 亚洲乱码国产乱码精品精 | 人妻无码久久精品人妻 | 精品人妻av区 | 亚洲欧美国产精品久久 | 性欧美videos高清精品 | 国产成人无码午夜视频在线观看 | 九九久久精品国产免费看小说 | 亚洲综合色区中文字幕 | yw尤物av无码国产在线观看 | 亚洲国产成人a精品不卡在线 | 亚洲gv猛男gv无码男同 | 欧美人与禽zoz0性伦交 | 亚洲精品美女久久久久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 女人被爽到呻吟gif动态图视看 | 国产精品久久久久9999小说 | 亚洲欧美中文字幕5发布 | 丰满人妻一区二区三区免费视频 | 国产成人无码区免费内射一片色欲 | 少女韩国电视剧在线观看完整 | 高潮毛片无遮挡高清免费视频 | 丰满人妻被黑人猛烈进入 | 人妻尝试又大又粗久久 | 97色伦图片97综合影院 | 男女爱爱好爽视频免费看 | 清纯唯美经典一区二区 | 亚洲日本在线电影 | 国产av剧情md精品麻豆 | 美女毛片一区二区三区四区 | 欧洲极品少妇 | 最近的中文字幕在线看视频 | 红桃av一区二区三区在线无码av | 中文字幕无码av波多野吉衣 | 中文字幕乱码人妻无码久久 | 国产精品第一区揄拍无码 | 人妻aⅴ无码一区二区三区 | 国产精品人人爽人人做我的可爱 | 福利一区二区三区视频在线观看 | 欧洲vodafone精品性 | 亚洲中文字幕无码中文字在线 | 色五月丁香五月综合五月 | аⅴ资源天堂资源库在线 | 国产无套内射久久久国产 | 欧美熟妇另类久久久久久不卡 | 国产性生交xxxxx无码 | 久久97精品久久久久久久不卡 | 久久亚洲精品成人无码 | 无码av最新清无码专区吞精 | а√天堂www在线天堂小说 | 巨爆乳无码视频在线观看 | 领导边摸边吃奶边做爽在线观看 | 久青草影院在线观看国产 | 欧洲熟妇精品视频 | 色婷婷av一区二区三区之红樱桃 | 一区二区三区高清视频一 | 午夜理论片yy44880影院 | 无码人中文字幕 | 亚洲综合无码久久精品综合 | 国产免费久久久久久无码 | 色婷婷欧美在线播放内射 | 亚洲国产精品一区二区第一页 | 老头边吃奶边弄进去呻吟 | 99在线 | 亚洲 | 人妻人人添人妻人人爱 | 国产性生大片免费观看性 | 中文字幕无码日韩专区 | 日韩精品乱码av一区二区 | 青青青手机频在线观看 | 亚洲综合无码久久精品综合 | 成人综合网亚洲伊人 | 在线播放无码字幕亚洲 | 丰满人妻被黑人猛烈进入 | 久久综合久久自在自线精品自 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品无码国产自产拍在线观看蜜 | 欧美一区二区三区 | 波多野42部无码喷潮在线 | 中文字幕av日韩精品一区二区 | 亚洲精品一区三区三区在线观看 | 美女毛片一区二区三区四区 | 无码乱肉视频免费大全合集 | 内射后入在线观看一区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 熟妇激情内射com | 女人和拘做爰正片视频 | 成熟妇人a片免费看网站 | 国产成人综合色在线观看网站 | 国产精品无码久久av | 色狠狠av一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 国产精品美女久久久久av爽李琼 | 成在人线av无码免费 | 国产成人精品视频ⅴa片软件竹菊 | 女人被男人躁得好爽免费视频 | 色欲人妻aaaaaaa无码 | 一本久道高清无码视频 | 国产sm调教视频在线观看 | 九九久久精品国产免费看小说 | 国产精品永久免费视频 | 在线观看国产午夜福利片 | 精品久久8x国产免费观看 | 国产乱人伦偷精品视频 | 国产乱码精品一品二品 | 国产综合在线观看 | 久久久国产精品无码免费专区 | 久久亚洲a片com人成 | 又大又紧又粉嫩18p少妇 | 熟妇人妻中文av无码 | 人妻与老人中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 人妻天天爽夜夜爽一区二区 | 成人毛片一区二区 | 成人亚洲精品久久久久 | 成人aaa片一区国产精品 | 久久久中文字幕日本无吗 | 成人性做爰aaa片免费看不忠 | 久久综合狠狠综合久久综合88 | 亚洲欧美国产精品久久 | 天堂а√在线中文在线 | 秋霞成人午夜鲁丝一区二区三区 | 欧美真人作爱免费视频 | 成人免费视频一区二区 | 色噜噜亚洲男人的天堂 | 亚洲精品国产精品乱码不卡 | 中文字幕无线码 | www一区二区www免费 | 亚洲一区二区三区在线观看网站 | 免费无码肉片在线观看 | 亚洲日本一区二区三区在线 | 国产高潮视频在线观看 | 国产精品亚洲综合色区韩国 | 丰满妇女强制高潮18xxxx | 亚洲日韩av一区二区三区中文 | 国内少妇偷人精品视频 | 午夜性刺激在线视频免费 | 色情久久久av熟女人妻网站 | 无码纯肉视频在线观看 | 中文精品久久久久人妻不卡 | 国产一精品一av一免费 | 波多野结衣 黑人 | 免费无码av一区二区 | 国产精品久久国产三级国 | 久久国产自偷自偷免费一区调 | 国产午夜亚洲精品不卡 | 国产午夜亚洲精品不卡下载 | 国产精品多人p群无码 | 国产精品国产自线拍免费软件 | 久久精品一区二区三区四区 | 国产乱人无码伦av在线a | 久久综合久久自在自线精品自 | 日日噜噜噜噜夜夜爽亚洲精品 | 55夜色66夜色国产精品视频 | 在教室伦流澡到高潮hnp视频 | 国产又爽又黄又刺激的视频 | 水蜜桃av无码 | 久久精品国产99久久6动漫 | 免费乱码人妻系列无码专区 | 免费网站看v片在线18禁无码 | 亚洲精品一区三区三区在线观看 | 婷婷色婷婷开心五月四房播播 | 国产无遮挡吃胸膜奶免费看 | 少妇无码吹潮 | 亚洲日本在线电影 | 性欧美疯狂xxxxbbbb | 荫蒂被男人添的好舒服爽免费视频 | 97夜夜澡人人双人人人喊 | 97久久国产亚洲精品超碰热 | 婷婷五月综合激情中文字幕 | 欧美日韩久久久精品a片 | 欧美第一黄网免费网站 | 小sao货水好多真紧h无码视频 | 一本精品99久久精品77 | 正在播放东北夫妻内射 | 熟妇激情内射com | 国精产品一品二品国精品69xx | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲熟悉妇女xxx妇女av | 麻豆蜜桃av蜜臀av色欲av | 精品久久久久香蕉网 | 精品亚洲韩国一区二区三区 | 亚洲天堂2017无码中文 | 国产内射爽爽大片视频社区在线 | 亚洲国产成人av在线观看 | 天天爽夜夜爽夜夜爽 | 麻豆精品国产精华精华液好用吗 | 亚洲七七久久桃花影院 | 少妇无码av无码专区在线观看 | 少妇人妻偷人精品无码视频 | 精品久久8x国产免费观看 | 亚洲午夜无码久久 | 亚洲欧美中文字幕5发布 | 国产莉萝无码av在线播放 | 3d动漫精品啪啪一区二区中 | 国产sm调教视频在线观看 | 国产成人精品久久亚洲高清不卡 | 亚洲午夜久久久影院 | 伊人久久大香线蕉av一区二区 | 国产一区二区三区精品视频 | 女人色极品影院 | 国产人妻久久精品二区三区老狼 | 国语自产偷拍精品视频偷 | 国产乱人伦av在线无码 | 成人欧美一区二区三区 | 国产精品爱久久久久久久 | 四十如虎的丰满熟妇啪啪 | 久久久久久久久888 | 好屌草这里只有精品 | 亚洲中文字幕无码中文字在线 | 亚洲精品国产第一综合99久久 | 乱人伦人妻中文字幕无码久久网 | 亚洲日韩av片在线观看 | 国産精品久久久久久久 | 亚洲毛片av日韩av无码 | 在线精品国产一区二区三区 | 无码人妻少妇伦在线电影 | 性生交片免费无码看人 | 亚洲精品综合一区二区三区在线 | 亚洲一区二区三区播放 | 野外少妇愉情中文字幕 | 国产在线无码精品电影网 | 中文字幕+乱码+中文字幕一区 | 啦啦啦www在线观看免费视频 | 国产后入清纯学生妹 | 成人欧美一区二区三区黑人 | 精品少妇爆乳无码av无码专区 | 午夜肉伦伦影院 | 99久久精品无码一区二区毛片 | 国产女主播喷水视频在线观看 | 欧美喷潮久久久xxxxx | 久久久久成人片免费观看蜜芽 | 国产又粗又硬又大爽黄老大爷视 | 国产色精品久久人妻 | 精品国产国产综合精品 | 亚洲中文字幕在线无码一区二区 | 少妇高潮喷潮久久久影院 | 无码人妻久久一区二区三区不卡 | 偷窥日本少妇撒尿chinese | 精品无码国产自产拍在线观看蜜 | 国产特级毛片aaaaaaa高清 | 国产av人人夜夜澡人人爽麻豆 | 日韩av无码中文无码电影 | 日本一卡2卡3卡四卡精品网站 | 亚洲中文字幕va福利 | 久久99精品久久久久婷婷 | 伊人久久大香线蕉av一区二区 | 日韩欧美成人免费观看 | 免费男性肉肉影院 | 无码av中文字幕免费放 | 亚洲区小说区激情区图片区 | 国产精品亚洲一区二区三区喷水 | 久久午夜无码鲁丝片秋霞 | 欧美老妇与禽交 | 99国产精品白浆在线观看免费 | 中国女人内谢69xxxx | 麻豆蜜桃av蜜臀av色欲av | 在线a亚洲视频播放在线观看 | 午夜丰满少妇性开放视频 | 亚洲精品一区二区三区在线 | 国产激情综合五月久久 | 亚洲a无码综合a国产av中文 | 国产精品久久福利网站 | 欧美zoozzooz性欧美 | 精品一区二区三区波多野结衣 | 亚洲欧美国产精品久久 | 久久综合激激的五月天 | a片在线免费观看 | 亚洲成av人在线观看网址 | 麻豆精品国产精华精华液好用吗 | 无码av免费一区二区三区试看 | 最新版天堂资源中文官网 | 精品无人区无码乱码毛片国产 | 人人爽人人澡人人人妻 | 国产9 9在线 | 中文 | 久久精品视频在线看15 | 亚洲国产精品久久久久久 | 国产精品第一国产精品 | 妺妺窝人体色www在线小说 | 2019nv天堂香蕉在线观看 | 日本一区二区更新不卡 | 亚洲综合色区中文字幕 | 十八禁真人啪啪免费网站 | 国产精品理论片在线观看 | 欧美日韩一区二区三区自拍 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产香蕉97碰碰久久人人 | 老熟女重囗味hdxx69 | 日本精品人妻无码77777 天堂一区人妻无码 | 黑人大群体交免费视频 | 色诱久久久久综合网ywww | 日本精品少妇一区二区三区 | 中文字幕无码免费久久99 | 夜先锋av资源网站 | 成人亚洲精品久久久久 | 亚洲日韩av一区二区三区四区 | 又紧又大又爽精品一区二区 | 一本大道久久东京热无码av | 色综合视频一区二区三区 | 亚欧洲精品在线视频免费观看 | 国产激情精品一区二区三区 | 少妇性l交大片 | 成人影院yy111111在线观看 | 暴力强奷在线播放无码 | 亚洲天堂2017无码中文 | 国产精品无套呻吟在线 | 国产精品久久福利网站 | 成人欧美一区二区三区黑人免费 | 欧美午夜特黄aaaaaa片 | 狠狠噜狠狠狠狠丁香五月 | 97色伦图片97综合影院 | 免费播放一区二区三区 | 丁香啪啪综合成人亚洲 | 人人爽人人澡人人人妻 | 国产97人人超碰caoprom | 亚洲精品成a人在线观看 | 成人三级无码视频在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 97无码免费人妻超级碰碰夜夜 | 熟妇人妻无码xxx视频 | 人妻少妇被猛烈进入中文字幕 | 99麻豆久久久国产精品免费 | 国产极品美女高潮无套在线观看 | 高潮喷水的毛片 | 男人的天堂av网站 | 动漫av一区二区在线观看 | 久久亚洲日韩精品一区二区三区 | 日韩成人一区二区三区在线观看 | 日本一卡2卡3卡四卡精品网站 | 两性色午夜视频免费播放 | 国产香蕉尹人视频在线 | 国产 精品 自在自线 | 亚洲自偷自偷在线制服 | 99视频精品全部免费免费观看 | 亚洲精品久久久久久一区二区 | 国产97人人超碰caoprom | 亚洲 激情 小说 另类 欧美 | 精品乱子伦一区二区三区 | 久久熟妇人妻午夜寂寞影院 | 狠狠躁日日躁夜夜躁2020 | 精品国偷自产在线 | 熟女少妇在线视频播放 | 内射白嫩少妇超碰 | 一个人看的www免费视频在线观看 | 女人被男人爽到呻吟的视频 | 中文字幕+乱码+中文字幕一区 | 领导边摸边吃奶边做爽在线观看 | 特级做a爰片毛片免费69 | 少妇高潮喷潮久久久影院 | 99国产欧美久久久精品 | 97久久精品无码一区二区 | 亚洲中文字幕无码中字 | 国产亚洲欧美日韩亚洲中文色 | 精品 日韩 国产 欧美 视频 | 老司机亚洲精品影院无码 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品永久免费视频 | 狠狠亚洲超碰狼人久久 | 亚洲一区二区观看播放 | 漂亮人妻洗澡被公强 日日躁 | 丰满人妻被黑人猛烈进入 | 国产亚洲精品精品国产亚洲综合 | 国产又爽又猛又粗的视频a片 | 无套内谢的新婚少妇国语播放 | 国产美女精品一区二区三区 | 中文字幕人妻无码一区二区三区 | 成年美女黄网站色大免费全看 | 一本色道久久综合亚洲精品不卡 | 国产真人无遮挡作爱免费视频 | 色狠狠av一区二区三区 | 国产午夜福利100集发布 | 亚洲欧美中文字幕5发布 | 亚洲自偷精品视频自拍 | 人妻少妇精品视频专区 | √天堂资源地址中文在线 | 亚洲日韩中文字幕在线播放 | 丰满少妇熟乱xxxxx视频 | 野狼第一精品社区 | 免费乱码人妻系列无码专区 | 动漫av网站免费观看 | 亚洲综合在线一区二区三区 | 无码国产乱人伦偷精品视频 | 欧美35页视频在线观看 | 亚洲国产精品一区二区美利坚 | 一个人看的www免费视频在线观看 | 黑人大群体交免费视频 | 国产黑色丝袜在线播放 | 精品水蜜桃久久久久久久 | 亚洲天堂2017无码中文 | 四十如虎的丰满熟妇啪啪 | 婷婷五月综合激情中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 18禁止看的免费污网站 | 亚洲综合色区中文字幕 | 亚洲成在人网站无码天堂 | 人人妻人人澡人人爽人人精品浪潮 | 无码人妻出轨黑人中文字幕 | 欧美激情综合亚洲一二区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲成色在线综合网站 | 午夜福利试看120秒体验区 | 自拍偷自拍亚洲精品被多人伦好爽 | 国内综合精品午夜久久资源 | 亚洲乱码日产精品bd | 午夜成人1000部免费视频 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲色www成人永久网址 | 亚洲精品一区三区三区在线观看 | 久久久精品人妻久久影视 | 亚洲の无码国产の无码步美 | 精品日本一区二区三区在线观看 | 欧美日韩亚洲国产精品 | 国产高清不卡无码视频 | 熟女少妇人妻中文字幕 | 天天综合网天天综合色 | 大色综合色综合网站 | 麻豆成人精品国产免费 | 国产莉萝无码av在线播放 | 人人妻人人澡人人爽欧美一区九九 | 亚洲娇小与黑人巨大交 | 亚洲啪av永久无码精品放毛片 | 四虎影视成人永久免费观看视频 | 红桃av一区二区三区在线无码av | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲乱码国产乱码精品精 | 日日麻批免费40分钟无码 | 国产成人精品久久亚洲高清不卡 | aa片在线观看视频在线播放 | 久久久精品欧美一区二区免费 | 亚洲成在人网站无码天堂 | 久久久成人毛片无码 | 色婷婷综合激情综在线播放 | 乌克兰少妇xxxx做受 | 夜精品a片一区二区三区无码白浆 | а天堂中文在线官网 | 大肉大捧一进一出视频出来呀 | 18黄暴禁片在线观看 | 成人欧美一区二区三区黑人 | 久久久久国色av免费观看性色 | 国产农村妇女高潮大叫 | 女人色极品影院 | 99久久婷婷国产综合精品青草免费 | 性欧美疯狂xxxxbbbb | 久久精品人人做人人综合 | 美女毛片一区二区三区四区 | 国产亚洲日韩欧美另类第八页 | 欧美 日韩 人妻 高清 中文 | 成人亚洲精品久久久久 | 亚洲呦女专区 | 亚洲精品一区二区三区在线观看 | 免费无码午夜福利片69 | 乌克兰少妇xxxx做受 | 少妇人妻大乳在线视频 | 九九综合va免费看 | 欧美怡红院免费全部视频 | 久久久无码中文字幕久... | 国产精品久久久久久久9999 | 国产精品无码永久免费888 | 国产激情综合五月久久 | 婷婷综合久久中文字幕蜜桃三电影 | 久久久久久久女国产乱让韩 | 沈阳熟女露脸对白视频 | av无码久久久久不卡免费网站 | 在线看片无码永久免费视频 | 久久精品99久久香蕉国产色戒 | 人人爽人人澡人人高潮 | 久久综合香蕉国产蜜臀av | 婷婷五月综合缴情在线视频 | 精品日本一区二区三区在线观看 | 一个人看的www免费视频在线观看 | 激情内射日本一区二区三区 | 男女爱爱好爽视频免费看 | а天堂中文在线官网 | 国精产品一品二品国精品69xx | 玩弄人妻少妇500系列视频 | 国产国语老龄妇女a片 | 综合人妻久久一区二区精品 | 亚洲色成人中文字幕网站 | 亚洲熟妇自偷自拍另类 | 国精产品一区二区三区 | 国产99久久精品一区二区 | 国产片av国语在线观看 | 无码人妻精品一区二区三区下载 | 国产精品福利视频导航 | 高潮喷水的毛片 | 亚洲成av人在线观看网址 | 色爱情人网站 | 精品国产一区二区三区四区在线看 | 国产成人亚洲综合无码 | 亚洲精品国产精品乱码视色 | 99精品国产综合久久久久五月天 | 亚洲色欲久久久综合网东京热 | a在线观看免费网站大全 | 国产av无码专区亚洲a∨毛片 | 西西人体www44rt大胆高清 | 少妇的肉体aa片免费 | 狠狠躁日日躁夜夜躁2020 | 青青草原综合久久大伊人精品 | 国产成人无码一二三区视频 | 激情内射日本一区二区三区 | 俄罗斯老熟妇色xxxx | 精品久久久久香蕉网 | 亚洲国产欧美在线成人 | 欧美猛少妇色xxxxx | 国产偷抇久久精品a片69 | 亚洲一区二区三区含羞草 | 噜噜噜亚洲色成人网站 | 欧美成人免费全部网站 | 国产成人综合色在线观看网站 | 又大又硬又爽免费视频 | 色综合久久久久综合一本到桃花网 | 人人妻人人澡人人爽欧美精品 | 午夜福利一区二区三区在线观看 | 偷窥村妇洗澡毛毛多 | 亚洲日韩av片在线观看 | 东京无码熟妇人妻av在线网址 | 东北女人啪啪对白 | 国产综合久久久久鬼色 | 国产色xx群视频射精 | www国产亚洲精品久久久日本 | 久久久久成人精品免费播放动漫 | 久久人妻内射无码一区三区 | 国产黑色丝袜在线播放 | 乱码午夜-极国产极内射 | 日日摸日日碰夜夜爽av | 国产精品无套呻吟在线 | 欧美日韩一区二区综合 | 亚洲精品一区二区三区在线 | 亚洲人成无码网www | 国产97在线 | 亚洲 | 伊人久久大香线蕉av一区二区 | 国产精品va在线播放 | 18精品久久久无码午夜福利 | 人人妻人人藻人人爽欧美一区 | 欧美大屁股xxxxhd黑色 | 宝宝好涨水快流出来免费视频 | 婷婷综合久久中文字幕蜜桃三电影 | 啦啦啦www在线观看免费视频 | 亚洲一区二区三区含羞草 | 亚洲精品一区二区三区大桥未久 | 97夜夜澡人人爽人人喊中国片 | 欧美阿v高清资源不卡在线播放 | 成人无码精品一区二区三区 | 夜夜躁日日躁狠狠久久av | 丰满人妻一区二区三区免费视频 | 波多野结衣av一区二区全免费观看 | 亚洲熟妇自偷自拍另类 | 男女爱爱好爽视频免费看 | 国产艳妇av在线观看果冻传媒 | 中文字幕无码日韩专区 | 欧洲熟妇精品视频 | 亚洲欧美国产精品久久 | 亚洲七七久久桃花影院 | 伊人久久婷婷五月综合97色 | 人妻少妇精品视频专区 | 免费网站看v片在线18禁无码 | 日韩人妻少妇一区二区三区 | 性生交片免费无码看人 | 久久精品国产99精品亚洲 | 中文亚洲成a人片在线观看 | 国产亚洲精品久久久久久国模美 | 一本一道久久综合久久 | 精品无码成人片一区二区98 | 久久亚洲精品成人无码 | 最新国产麻豆aⅴ精品无码 | 人人妻人人澡人人爽欧美一区九九 | 亚洲а∨天堂久久精品2021 | 国产av剧情md精品麻豆 | 亚洲无人区午夜福利码高清完整版 | 亚洲精品一区三区三区在线观看 | 国产莉萝无码av在线播放 | 久久久中文字幕日本无吗 | 国产综合色产在线精品 | 久久久国产精品无码免费专区 | 中文字幕无码av波多野吉衣 | 国产精品国产自线拍免费软件 | 欧美老妇交乱视频在线观看 | 99麻豆久久久国产精品免费 | 亚洲大尺度无码无码专区 | 亚洲人成网站免费播放 | 人妻体内射精一区二区三四 | 精品日本一区二区三区在线观看 | 无码人妻精品一区二区三区不卡 | 51国偷自产一区二区三区 | 99er热精品视频 | 国产又爽又黄又刺激的视频 | 亚洲精品一区二区三区在线观看 | 亚洲精品中文字幕乱码 | 亚洲精品国产a久久久久久 | 色婷婷av一区二区三区之红樱桃 | 乱码av麻豆丝袜熟女系列 | 粉嫩少妇内射浓精videos | 麻豆国产丝袜白领秘书在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 蜜桃视频插满18在线观看 | 狠狠亚洲超碰狼人久久 | 亚洲精品综合一区二区三区在线 | 在线a亚洲视频播放在线观看 | 国产亚av手机在线观看 | 免费观看的无遮挡av | 老熟女重囗味hdxx69 | 日产国产精品亚洲系列 | 欧美性猛交内射兽交老熟妇 | 国产无遮挡又黄又爽又色 | 日日碰狠狠躁久久躁蜜桃 | 99久久人妻精品免费一区 | 欧美猛少妇色xxxxx | 啦啦啦www在线观看免费视频 | 免费播放一区二区三区 | 又黄又爽又色的视频 | 大肉大捧一进一出视频出来呀 | 日本护士毛茸茸高潮 | 天天躁日日躁狠狠躁免费麻豆 | 欧美人与禽zoz0性伦交 | а√天堂www在线天堂小说 | 一本色道婷婷久久欧美 | 性生交大片免费看女人按摩摩 | 无人区乱码一区二区三区 | 色综合久久久久综合一本到桃花网 | 又紧又大又爽精品一区二区 | 色情久久久av熟女人妻网站 | 四虎国产精品一区二区 | 乱中年女人伦av三区 | 国产精品99久久精品爆乳 | 久久人人97超碰a片精品 | 一本久久a久久精品亚洲 | 奇米影视7777久久精品人人爽 | 日韩精品久久久肉伦网站 | 国产免费无码一区二区视频 | 欧美猛少妇色xxxxx | 小泽玛莉亚一区二区视频在线 | 国产三级久久久精品麻豆三级 | 狠狠躁日日躁夜夜躁2020 | 乱人伦人妻中文字幕无码久久网 | 欧美三级a做爰在线观看 | 男女性色大片免费网站 | 色老头在线一区二区三区 | 中文字幕av伊人av无码av | 国产一区二区三区精品视频 | 九九综合va免费看 | 波多野结衣av一区二区全免费观看 | 全球成人中文在线 | 成人综合网亚洲伊人 | 国产精品视频免费播放 | 一二三四社区在线中文视频 | 理论片87福利理论电影 | 国内精品九九久久久精品 | 人人妻人人藻人人爽欧美一区 | 亚洲日本va中文字幕 | 99久久亚洲精品无码毛片 | aa片在线观看视频在线播放 | 国产精品久久精品三级 | www成人国产高清内射 | 精品偷自拍另类在线观看 | 精品无码av一区二区三区 | 国产激情无码一区二区app | 精品少妇爆乳无码av无码专区 | 俺去俺来也www色官网 | 久久亚洲精品成人无码 | 大胆欧美熟妇xx | 国产成人一区二区三区别 | 中文字幕乱码人妻无码久久 | 亚洲欧美国产精品久久 | 欧美喷潮久久久xxxxx | 精品久久久无码中文字幕 | 无码av最新清无码专区吞精 | 色狠狠av一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 无码人妻黑人中文字幕 | 中文字幕乱码人妻二区三区 | 精品人妻中文字幕有码在线 | 成熟人妻av无码专区 | 免费国产成人高清在线观看网站 | 亚洲精品久久久久avwww潮水 | 一本大道伊人av久久综合 | 婷婷丁香五月天综合东京热 | 99久久人妻精品免费二区 | 美女毛片一区二区三区四区 | 大色综合色综合网站 | 国产sm调教视频在线观看 | 性色欲网站人妻丰满中文久久不卡 | 强辱丰满人妻hd中文字幕 | 中文字幕乱码亚洲无线三区 | 欧洲熟妇色 欧美 | 3d动漫精品啪啪一区二区中 | 在线看片无码永久免费视频 | 亚洲精品欧美二区三区中文字幕 | 国产激情艳情在线看视频 | 亚洲国产一区二区三区在线观看 | 人妻互换免费中文字幕 | 装睡被陌生人摸出水好爽 | 人人澡人摸人人添 | 国产精品-区区久久久狼 | 秋霞成人午夜鲁丝一区二区三区 | 国产人妻久久精品二区三区老狼 | 岛国片人妻三上悠亚 | 中文字幕久久久久人妻 | 亚洲精品午夜无码电影网 | 蜜桃视频插满18在线观看 | 亚洲一区二区观看播放 | 日韩在线不卡免费视频一区 | 亚洲国产精品久久久天堂 | 欧美色就是色 | 亚洲第一无码av无码专区 | 中文字幕人妻无码一区二区三区 | 国产内射老熟女aaaa | 亚洲精品中文字幕久久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 帮老师解开蕾丝奶罩吸乳网站 | 女人被男人爽到呻吟的视频 | 精品国产麻豆免费人成网站 | 国产精品无码一区二区桃花视频 | 少妇无码一区二区二三区 | 国产精品久久久一区二区三区 | 爆乳一区二区三区无码 | 成人综合网亚洲伊人 | 午夜男女很黄的视频 | 欧美人与动性行为视频 | 人妻无码久久精品人妻 | 无码人妻丰满熟妇区毛片18 | 四十如虎的丰满熟妇啪啪 | 色欲久久久天天天综合网精品 | 日本精品人妻无码免费大全 | 久久天天躁狠狠躁夜夜免费观看 | 精品水蜜桃久久久久久久 | 欧美国产亚洲日韩在线二区 | 亚洲精品久久久久久一区二区 | 欧洲vodafone精品性 | 欧美日韩一区二区三区自拍 | 久久久久av无码免费网 | 亚洲午夜福利在线观看 | 男女作爱免费网站 | 色欲久久久天天天综合网精品 | 国产高清av在线播放 | 欧美丰满少妇xxxx性 | 欧美性生交活xxxxxdddd | 日韩av无码一区二区三区不卡 | 国产乡下妇女做爰 | 狂野欧美性猛xxxx乱大交 | 美女扒开屁股让男人桶 | 黑森林福利视频导航 | 婷婷丁香五月天综合东京热 | 成人综合网亚洲伊人 | 久久精品中文字幕一区 | 久久亚洲中文字幕无码 | 在线观看国产一区二区三区 | 丝袜美腿亚洲一区二区 | 欧美精品一区二区精品久久 | 久久综合给久久狠狠97色 | 亚洲色偷偷偷综合网 | 国产熟妇高潮叫床视频播放 | 欧美亚洲日韩国产人成在线播放 | 亚洲成a人片在线观看无码3d | 亚洲精品一区二区三区婷婷月 | 成人精品一区二区三区中文字幕 | www成人国产高清内射 | 中文字幕无码热在线视频 | 亚洲熟熟妇xxxx | 色 综合 欧美 亚洲 国产 | 久久伊人色av天堂九九小黄鸭 | 国产精品久久福利网站 | 天堂在线观看www | 人妻夜夜爽天天爽三区 | 极品嫩模高潮叫床 | 亚洲一区二区三区在线观看网站 | 久久99精品国产.久久久久 | 7777奇米四色成人眼影 | 成人亚洲精品久久久久 | 欧美一区二区三区视频在线观看 | 久久国产精品_国产精品 | 5858s亚洲色大成网站www | 少妇人妻大乳在线视频 | 狂野欧美性猛xxxx乱大交 | 亚洲一区二区三区香蕉 | 色婷婷香蕉在线一区二区 | 亚洲自偷精品视频自拍 | 内射白嫩少妇超碰 | 无码人妻精品一区二区三区不卡 | 国产性生大片免费观看性 | 少妇性俱乐部纵欲狂欢电影 | 久久人人爽人人人人片 | 国产无套内射久久久国产 | 午夜无码区在线观看 | 国产av久久久久精东av | 亚洲热妇无码av在线播放 | 狠狠色欧美亚洲狠狠色www | 少妇性l交大片 | 在线天堂新版最新版在线8 | 国产电影无码午夜在线播放 | 国产人妻人伦精品1国产丝袜 | 欧洲美熟女乱又伦 | 国产精品-区区久久久狼 | 久久久久久亚洲精品a片成人 | 老子影院午夜精品无码 | 老熟女重囗味hdxx69 | 高中生自慰www网站 | 日韩精品久久久肉伦网站 | 中文精品无码中文字幕无码专区 | 国产av无码专区亚洲a∨毛片 | 国内揄拍国内精品少妇国语 | 国产成人综合色在线观看网站 | 又色又爽又黄的美女裸体网站 | 性欧美大战久久久久久久 | 成人精品天堂一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 亚洲国产精品久久久久久 | 久久久久成人精品免费播放动漫 | 天堂亚洲免费视频 | 欧美成人家庭影院 | 国产后入清纯学生妹 | 亚洲精品国偷拍自产在线麻豆 | 久久99国产综合精品 | 国产精品二区一区二区aⅴ污介绍 | 激情爆乳一区二区三区 | 少妇无码吹潮 | 精品欧美一区二区三区久久久 | 成熟妇人a片免费看网站 | av无码电影一区二区三区 | 99精品久久毛片a片 | 亚洲国产日韩a在线播放 | 亚洲日韩av一区二区三区中文 | 亚无码乱人伦一区二区 | 人妻少妇精品视频专区 | 日日躁夜夜躁狠狠躁 | 成人无码视频免费播放 | 亚洲成av人片在线观看无码不卡 | 亚洲区小说区激情区图片区 | 国产舌乚八伦偷品w中 | 一本加勒比波多野结衣 | 天堂一区人妻无码 | 成人免费无码大片a毛片 | 欧美性生交活xxxxxdddd | 麻豆人妻少妇精品无码专区 | 亚洲中文字幕av在天堂 | 娇妻被黑人粗大高潮白浆 | 在线观看国产一区二区三区 | 九九久久精品国产免费看小说 | 亚洲色大成网站www国产 | 综合人妻久久一区二区精品 | 国内丰满熟女出轨videos | 国产激情综合五月久久 | 国内精品一区二区三区不卡 | 日本大乳高潮视频在线观看 | 四虎影视成人永久免费观看视频 | 国产激情艳情在线看视频 | 人人妻人人澡人人爽欧美一区九九 | 999久久久国产精品消防器材 | 成人精品视频一区二区三区尤物 | 国产后入清纯学生妹 | 成在人线av无码免观看麻豆 | 亚洲人成网站在线播放942 | 久久久精品国产sm最大网站 | 人人妻人人澡人人爽人人精品 | 精品偷拍一区二区三区在线看 | 国产精品久久久一区二区三区 | 久青草影院在线观看国产 | 亚洲va中文字幕无码久久不卡 | 精品国产乱码久久久久乱码 | 高潮喷水的毛片 | 中文亚洲成a人片在线观看 | 国产亚洲精品久久久闺蜜 | 久久久久久久久888 | 国产va免费精品观看 | 成人一在线视频日韩国产 | 国产精品丝袜黑色高跟鞋 | 欧洲精品码一区二区三区免费看 | 沈阳熟女露脸对白视频 | 精品一区二区三区无码免费视频 | 荫蒂添的好舒服视频囗交 | 高中生自慰www网站 | 日本肉体xxxx裸交 | 麻豆人妻少妇精品无码专区 | 亚洲a无码综合a国产av中文 | 欧美黑人乱大交 | 亚洲精品综合五月久久小说 | 大胆欧美熟妇xx | 狂野欧美性猛xxxx乱大交 | 国产精品成人av在线观看 | 日韩人妻少妇一区二区三区 | 久久久中文久久久无码 | 国产97在线 | 亚洲 | 欧美精品无码一区二区三区 | 国产精品亚洲五月天高清 | 成人影院yy111111在线观看 | 丰满少妇熟乱xxxxx视频 | 疯狂三人交性欧美 | 波多野结衣av一区二区全免费观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 自拍偷自拍亚洲精品10p | 久久久久99精品国产片 | 国产一精品一av一免费 | 亚洲综合无码久久精品综合 | 国产熟妇高潮叫床视频播放 | 波多野结衣高清一区二区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 精品乱码久久久久久久 | 久久这里只有精品视频9 | 樱花草在线播放免费中文 | 色偷偷人人澡人人爽人人模 | 国产成人无码av片在线观看不卡 | 粉嫩少妇内射浓精videos | 欧美一区二区三区视频在线观看 | 妺妺窝人体色www婷婷 | 一个人免费观看的www视频 | 色一情一乱一伦一视频免费看 | 国产精品高潮呻吟av久久 | 欧美激情一区二区三区成人 | 亚洲欧美色中文字幕在线 | 亚洲人交乣女bbw | 日韩欧美中文字幕在线三区 | 亚洲s色大片在线观看 | 国产香蕉尹人综合在线观看 | 国精品人妻无码一区二区三区蜜柚 | 欧美老人巨大xxxx做受 | 天海翼激烈高潮到腰振不止 | 国精产品一品二品国精品69xx | 亚洲自偷自拍另类第1页 | 国产疯狂伦交大片 | 天天拍夜夜添久久精品大 | 在线播放免费人成毛片乱码 | 动漫av网站免费观看 | 亚洲色在线无码国产精品不卡 | 好爽又高潮了毛片免费下载 | 亚洲男人av天堂午夜在 | 日韩视频 中文字幕 视频一区 | 亚洲爆乳精品无码一区二区三区 | 在线播放无码字幕亚洲 | 国产精品久久久久9999小说 | 无码人妻丰满熟妇区五十路百度 | 黑人巨大精品欧美一区二区 | 国产精品久久久久影院嫩草 | 高潮毛片无遮挡高清免费视频 | 亚拍精品一区二区三区探花 | 国产后入清纯学生妹 | 成人片黄网站色大片免费观看 | 色综合天天综合狠狠爱 | 精品偷自拍另类在线观看 | 国产片av国语在线观看 | 无码精品人妻一区二区三区av | 伊人久久大香线焦av综合影院 | 色偷偷人人澡人人爽人人模 | 4hu四虎永久在线观看 | 67194成是人免费无码 | 成熟人妻av无码专区 | 国产免费久久久久久无码 | 亚洲国产午夜精品理论片 | 国产亚洲精品久久久久久大师 | 亚洲自偷自拍另类第1页 | 久9re热视频这里只有精品 | 亚洲国产精品美女久久久久 | 日本丰满护士爆乳xxxx | 久久午夜夜伦鲁鲁片无码免费 | 熟妇人妻无乱码中文字幕 | 中文亚洲成a人片在线观看 | 中文字幕人妻无码一区二区三区 | 精品无码成人片一区二区98 | 久久久精品欧美一区二区免费 | 亚洲成色www久久网站 | 亚洲天堂2017无码 | 色婷婷久久一区二区三区麻豆 | 日本免费一区二区三区最新 | 精品国产av色一区二区深夜久久 | 亚洲阿v天堂在线 | 成人免费视频视频在线观看 免费 | ass日本丰满熟妇pics | 久久久久久久女国产乱让韩 | 国产色视频一区二区三区 | 97se亚洲精品一区 | 国产综合色产在线精品 | 国产农村乱对白刺激视频 | 亚洲精品午夜国产va久久成人 | 久久久中文久久久无码 | 久久久久亚洲精品中文字幕 | 久久午夜无码鲁丝片 | 日产精品99久久久久久 | 美女黄网站人色视频免费国产 | a在线亚洲男人的天堂 | 亚洲熟妇自偷自拍另类 | 性欧美牲交在线视频 | 成在人线av无码免观看麻豆 | 国产无遮挡吃胸膜奶免费看 | 国产农村妇女高潮大叫 | 国内精品久久久久久中文字幕 | 亚洲狠狠婷婷综合久久 | 久久久www成人免费毛片 | 国产亚洲日韩欧美另类第八页 | 最新国产麻豆aⅴ精品无码 | 欧洲熟妇色 欧美 | 久久伊人色av天堂九九小黄鸭 | 久久精品国产一区二区三区 | 人妻熟女一区 | 国产美女极度色诱视频www | 国产在热线精品视频 | 人妻少妇被猛烈进入中文字幕 | 男女下面进入的视频免费午夜 | 麻豆国产97在线 | 欧洲 | 国内精品人妻无码久久久影院蜜桃 | 曰韩无码二三区中文字幕 | 激情五月综合色婷婷一区二区 | 久久久久免费精品国产 | 国产精品va在线观看无码 | 亚洲中文无码av永久不收费 | 麻豆人妻少妇精品无码专区 | 日韩精品一区二区av在线 | 日韩少妇白浆无码系列 | 18禁黄网站男男禁片免费观看 | 亚洲人交乣女bbw | 人妻无码αv中文字幕久久琪琪布 | 亚洲综合无码久久精品综合 | 国产熟妇高潮叫床视频播放 | 国产激情无码一区二区 | 中文字幕无码日韩欧毛 | 无码国内精品人妻少妇 | 天天做天天爱天天爽综合网 | 日本熟妇乱子伦xxxx | 婷婷五月综合激情中文字幕 | 国产亲子乱弄免费视频 | 好屌草这里只有精品 | 大屁股大乳丰满人妻 | 国产人成高清在线视频99最全资源 | 国产另类ts人妖一区二区 | 亚洲中文无码av永久不收费 | 久9re热视频这里只有精品 | 日本免费一区二区三区最新 | 亚洲а∨天堂久久精品2021 | 亚洲爆乳大丰满无码专区 | 亚洲狠狠色丁香婷婷综合 | 4hu四虎永久在线观看 | 欧美激情一区二区三区成人 | 亚洲精品一区二区三区在线 | 双乳奶水饱满少妇呻吟 | 四虎影视成人永久免费观看视频 | 小sao货水好多真紧h无码视频 | 性色av无码免费一区二区三区 | 无码帝国www无码专区色综合 | 亚洲午夜无码久久 | 国产精品久久福利网站 | 亚洲日韩av片在线观看 | 国产国语老龄妇女a片 | 免费人成在线观看网站 | 久久99久久99精品中文字幕 | 久久久精品456亚洲影院 | 亚洲精品午夜无码电影网 | 国产成人精品久久亚洲高清不卡 | 一本大道久久东京热无码av | 无码国内精品人妻少妇 | 性生交片免费无码看人 | 人妻插b视频一区二区三区 | 日本精品人妻无码免费大全 | 精品国产青草久久久久福利 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产av无码专区亚洲awww | 在线观看国产午夜福利片 | 18精品久久久无码午夜福利 | 97精品人妻一区二区三区香蕉 | 国产乱子伦视频在线播放 | www国产亚洲精品久久久日本 | 任你躁在线精品免费 | 巨爆乳无码视频在线观看 | 一本无码人妻在中文字幕免费 | 中文字幕+乱码+中文字幕一区 | 婷婷丁香五月天综合东京热 | 任你躁在线精品免费 | 国产精品美女久久久网av | 中文字幕人妻丝袜二区 | 欧美日韩视频无码一区二区三 | 老子影院午夜精品无码 | 久久伊人色av天堂九九小黄鸭 | 成人动漫在线观看 | 一区二区三区高清视频一 | 十八禁真人啪啪免费网站 | 日韩欧美成人免费观看 | 性生交大片免费看女人按摩摩 | 性生交大片免费看l | 荫蒂被男人添的好舒服爽免费视频 | 老熟妇乱子伦牲交视频 | 国产香蕉尹人视频在线 | av无码电影一区二区三区 | v一区无码内射国产 | 国产精品久久国产精品99 | 欧美国产日产一区二区 | 国内老熟妇对白xxxxhd | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 日韩av无码中文无码电影 | 亚洲乱码国产乱码精品精 | 日韩亚洲欧美精品综合 | 日韩精品无码一区二区中文字幕 | 日韩精品久久久肉伦网站 | av香港经典三级级 在线 | 精品无码av一区二区三区 | 国产精品对白交换视频 | 日本一区二区更新不卡 | 欧美性生交xxxxx久久久 | 欧美性黑人极品hd | 欧美熟妇另类久久久久久不卡 | 久久久久免费精品国产 | 日韩人妻无码中文字幕视频 | 好男人www社区 | 亚洲中文字幕无码中文字在线 | 麻豆蜜桃av蜜臀av色欲av | 精品国产福利一区二区 | 国产激情艳情在线看视频 | 亚洲精品一区二区三区四区五区 | 少妇被粗大的猛进出69影院 | 在线亚洲高清揄拍自拍一品区 | 人妻无码久久精品人妻 | 无码午夜成人1000部免费视频 | 国产精品美女久久久网av | 国产午夜亚洲精品不卡 | 麻豆国产人妻欲求不满谁演的 | 国产国语老龄妇女a片 | 午夜熟女插插xx免费视频 | 精品久久久无码中文字幕 | 丰满肥臀大屁股熟妇激情视频 | 一区二区三区乱码在线 | 欧洲 | 国产精品高潮呻吟av久久 | 午夜理论片yy44880影院 | 久久午夜夜伦鲁鲁片无码免费 | 97久久国产亚洲精品超碰热 | 国产一区二区三区四区五区加勒比 | 丝袜人妻一区二区三区 | 国产97色在线 | 免 | 亚洲毛片av日韩av无码 | 欧美日本精品一区二区三区 | 丝袜美腿亚洲一区二区 | 国产三级精品三级男人的天堂 | 精品久久8x国产免费观看 | 成人欧美一区二区三区 | 清纯唯美经典一区二区 | 强奷人妻日本中文字幕 | 欧美日韩亚洲国产精品 | 亚洲午夜无码久久 | 亚洲精品无码人妻无码 | 99精品视频在线观看免费 | 欧美兽交xxxx×视频 | 男人的天堂av网站 | 欧美日韩一区二区综合 | 扒开双腿吃奶呻吟做受视频 | 377p欧洲日本亚洲大胆 | 国产精品人人妻人人爽 | 国产精品免费大片 | 久久久国产精品无码免费专区 | 黑人大群体交免费视频 | 国产在线无码精品电影网 | 国产精品永久免费视频 | 亚洲a无码综合a国产av中文 | 中文字幕无码av激情不卡 | 两性色午夜视频免费播放 | 亚洲成色在线综合网站 | 欧美老妇交乱视频在线观看 | 国产高潮视频在线观看 | 嫩b人妻精品一区二区三区 | 精品久久久无码人妻字幂 | 国产亚洲精品久久久闺蜜 | 男人和女人高潮免费网站 | 熟妇女人妻丰满少妇中文字幕 | 久久久国产一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 2019nv天堂香蕉在线观看 | 日本一卡2卡3卡四卡精品网站 | 青青青手机频在线观看 | 亚洲а∨天堂久久精品2021 | 俺去俺来也www色官网 | 亚洲人成人无码网www国产 | 伊在人天堂亚洲香蕉精品区 | 日本大乳高潮视频在线观看 | 亚洲国产成人av在线观看 | 天堂在线观看www | 性史性农村dvd毛片 | 国内精品久久久久久中文字幕 | 婷婷五月综合激情中文字幕 | 成人女人看片免费视频放人 | 日本肉体xxxx裸交 | 亚洲精品综合五月久久小说 | 麻豆国产97在线 | 欧洲 | 色综合久久88色综合天天 | 四虎国产精品一区二区 | 久久午夜夜伦鲁鲁片无码免费 | 又色又爽又黄的美女裸体网站 | 国产口爆吞精在线视频 | 国产精品无码一区二区桃花视频 | 亚洲自偷自偷在线制服 | 人妻少妇精品无码专区二区 | 人妻尝试又大又粗久久 | 蜜桃臀无码内射一区二区三区 | 久久精品国产99精品亚洲 | 国产精品久久久久9999小说 | 蜜桃臀无码内射一区二区三区 | 久久综合久久自在自线精品自 | 午夜精品久久久内射近拍高清 | 人妻互换免费中文字幕 | 一本久道久久综合狠狠爱 | 黑人玩弄人妻中文在线 | 熟女俱乐部五十路六十路av | 免费国产成人高清在线观看网站 | 强辱丰满人妻hd中文字幕 | 国产两女互慰高潮视频在线观看 | 国产精品丝袜黑色高跟鞋 | 国产av剧情md精品麻豆 | 久久伊人色av天堂九九小黄鸭 | 特黄特色大片免费播放器图片 | 精品亚洲成av人在线观看 | 少妇无码av无码专区在线观看 | 97久久精品无码一区二区 | 日韩av无码一区二区三区 | 人妻少妇被猛烈进入中文字幕 | www国产亚洲精品久久网站 | 免费观看激色视频网站 | 中文无码成人免费视频在线观看 | 牲欲强的熟妇农村老妇女视频 | 欧美精品一区二区精品久久 | 性欧美牲交在线视频 | 中文字幕无码日韩欧毛 | 久久精品女人的天堂av | 无码成人精品区在线观看 | √天堂资源地址中文在线 | 久久久久久av无码免费看大片 | 中文字幕av伊人av无码av | 日本精品久久久久中文字幕 | 999久久久国产精品消防器材 | 无套内谢的新婚少妇国语播放 | 在线播放免费人成毛片乱码 | 亚洲国产一区二区三区在线观看 | 99国产欧美久久久精品 | 在线播放免费人成毛片乱码 | 久久zyz资源站无码中文动漫 | 欧美日韩久久久精品a片 | 麻豆蜜桃av蜜臀av色欲av | 欧美人与善在线com | 少女韩国电视剧在线观看完整 | 国产成人无码一二三区视频 | 麻豆蜜桃av蜜臀av色欲av | 人人澡人人妻人人爽人人蜜桃 | 久久久久人妻一区精品色欧美 | 国产口爆吞精在线视频 | 国产精品无码mv在线观看 | 精品久久8x国产免费观看 | 成人性做爰aaa片免费看不忠 | 撕开奶罩揉吮奶头视频 | 色综合天天综合狠狠爱 | 中国大陆精品视频xxxx | 中文精品无码中文字幕无码专区 | 免费无码的av片在线观看 | 国产精品18久久久久久麻辣 | 国内精品人妻无码久久久影院 | 亚洲精品久久久久avwww潮水 | 久久亚洲中文字幕精品一区 | 欧美人与禽zoz0性伦交 | 亚洲娇小与黑人巨大交 | 国产成人综合色在线观看网站 | 狠狠cao日日穞夜夜穞av | 色爱情人网站 | 最新国产麻豆aⅴ精品无码 | 女人被男人爽到呻吟的视频 | 国产午夜手机精彩视频 | 久久久久99精品成人片 | 色欲综合久久中文字幕网 | a在线观看免费网站大全 | 中文无码精品a∨在线观看不卡 | 狂野欧美激情性xxxx | 无码人妻久久一区二区三区不卡 | 国产极品美女高潮无套在线观看 | 国产色在线 | 国产 | 久久人人97超碰a片精品 | 亚洲欧美综合区丁香五月小说 | 玩弄中年熟妇正在播放 | 国产婷婷色一区二区三区在线 | 黄网在线观看免费网站 | 久久久av男人的天堂 | 丰满少妇熟乱xxxxx视频 | 久久人人爽人人爽人人片av高清 | 女人和拘做爰正片视频 | 国产精品福利视频导航 | 内射巨臀欧美在线视频 | 国产免费观看黄av片 | 亚洲伊人久久精品影院 | 国模大胆一区二区三区 | 亚洲国产精品一区二区第一页 | 亚洲精品欧美二区三区中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 麻花豆传媒剧国产免费mv在线 | 欧美亚洲日韩国产人成在线播放 | 麻豆成人精品国产免费 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲精品一区三区三区在线观看 | 在线播放亚洲第一字幕 | 又大又硬又黄的免费视频 | 东北女人啪啪对白 | 性欧美大战久久久久久久 | 亚洲精品久久久久久久久久久 | 偷窥日本少妇撒尿chinese | 超碰97人人做人人爱少妇 | 亚洲熟妇色xxxxx欧美老妇y | 久精品国产欧美亚洲色aⅴ大片 | 精品无人区无码乱码毛片国产 | 午夜理论片yy44880影院 | 午夜男女很黄的视频 | 影音先锋中文字幕无码 | 精品偷拍一区二区三区在线看 | 国产一区二区三区精品视频 | 无码成人精品区在线观看 | 成人试看120秒体验区 | 日本xxxx色视频在线观看免费 | 人人澡人摸人人添 | 亚洲啪av永久无码精品放毛片 | 欧美自拍另类欧美综合图片区 | 亚洲人成影院在线观看 | 性啪啪chinese东北女人 | 丰腴饱满的极品熟妇 | 曰韩无码二三区中文字幕 | 图片区 小说区 区 亚洲五月 | 国产又粗又硬又大爽黄老大爷视 | 国产又粗又硬又大爽黄老大爷视 | 人妻人人添人妻人人爱 | 久久天天躁狠狠躁夜夜免费观看 | 国产乱人伦av在线无码 | 无码人妻久久一区二区三区不卡 | 2019nv天堂香蕉在线观看 | 久久国产精品_国产精品 | 青青青爽视频在线观看 | 色偷偷人人澡人人爽人人模 | 东京热男人av天堂 | 欧美日本免费一区二区三区 | 九九综合va免费看 | 国产9 9在线 | 中文 | 在线成人www免费观看视频 | 麻豆果冻传媒2021精品传媒一区下载 | 人妻中文无码久热丝袜 | 国产精品爱久久久久久久 | 国内精品人妻无码久久久影院 | 夜夜影院未满十八勿进 | 纯爱无遮挡h肉动漫在线播放 | 亚洲国产欧美日韩精品一区二区三区 | 日韩少妇内射免费播放 | 久久亚洲国产成人精品性色 | 欧美精品免费观看二区 | 性欧美大战久久久久久久 | 久久精品国产一区二区三区肥胖 | 亚洲а∨天堂久久精品2021 | 无码人妻黑人中文字幕 | 丰满妇女强制高潮18xxxx | 亚洲无人区午夜福利码高清完整版 | 老司机亚洲精品影院无码 | 日韩人妻无码中文字幕视频 | 大乳丰满人妻中文字幕日本 | 真人与拘做受免费视频 | a在线观看免费网站大全 | 人妻体内射精一区二区三四 | 少妇的肉体aa片免费 | 亚洲伊人久久精品影院 | 99精品国产综合久久久久五月天 | 亚洲日韩一区二区 | 波多野结衣 黑人 | 国产乱人无码伦av在线a | 女人被男人爽到呻吟的视频 | 亚洲欧美综合区丁香五月小说 | 国语精品一区二区三区 | 人人爽人人爽人人片av亚洲 | 日本精品高清一区二区 | 成人无码视频在线观看网站 | 99国产精品白浆在线观看免费 | 国产成人精品久久亚洲高清不卡 | 国产成人综合在线女婷五月99播放 | 免费观看的无遮挡av | 国产亚洲精品久久久久久国模美 | 婷婷色婷婷开心五月四房播播 | 3d动漫精品啪啪一区二区中 | 无码吃奶揉捏奶头高潮视频 | 亚洲中文字幕无码中文字在线 | 国产艳妇av在线观看果冻传媒 | 国产真人无遮挡作爱免费视频 | 国产婷婷色一区二区三区在线 | 综合激情五月综合激情五月激情1 | 欧美自拍另类欧美综合图片区 | 国产乱人伦av在线无码 | 国内丰满熟女出轨videos | 亚洲精品久久久久中文第一幕 | 精品久久久久久人妻无码中文字幕 | 亚欧洲精品在线视频免费观看 | 熟妇女人妻丰满少妇中文字幕 | 国产绳艺sm调教室论坛 | 国产日产欧产精品精品app | 日韩精品乱码av一区二区 | 国产精品无码成人午夜电影 | 一本色道久久综合狠狠躁 | 99精品视频在线观看免费 | 亚洲一区二区三区四区 | 国产成人人人97超碰超爽8 | 少妇久久久久久人妻无码 | 国产欧美亚洲精品a | 国产区女主播在线观看 | 99久久精品国产一区二区蜜芽 | 国产精品丝袜黑色高跟鞋 | 红桃av一区二区三区在线无码av | 亚洲 另类 在线 欧美 制服 | 熟妇人妻无码xxx视频 | 亚洲中文字幕无码一久久区 | 一本久道高清无码视频 | 亚洲精品成a人在线观看 | 日本乱人伦片中文三区 | 性欧美牲交在线视频 | 少妇太爽了在线观看 | 中文字幕中文有码在线 | 国内精品人妻无码久久久影院 | 亚洲熟妇色xxxxx亚洲 | 成人精品视频一区二区 | 国产在线精品一区二区三区直播 | 内射欧美老妇wbb | 精品亚洲成av人在线观看 | 国产亚洲精品精品国产亚洲综合 | 自拍偷自拍亚洲精品被多人伦好爽 | 一本无码人妻在中文字幕免费 | 久久久无码中文字幕久... | 国产人妖乱国产精品人妖 | 正在播放老肥熟妇露脸 | 亚洲欧美综合区丁香五月小说 | 牲欲强的熟妇农村老妇女视频 | 成人无码视频免费播放 | 国产深夜福利视频在线 | 色欲人妻aaaaaaa无码 | 中文字幕无码视频专区 | 麻花豆传媒剧国产免费mv在线 | 国产性生大片免费观看性 | 又色又爽又黄的美女裸体网站 | 无码人妻精品一区二区三区不卡 | 久久熟妇人妻午夜寂寞影院 | 亚洲精品成a人在线观看 | 国产精品亚洲一区二区三区喷水 | 久久综合网欧美色妞网 | 99久久精品午夜一区二区 | 性做久久久久久久免费看 | 香蕉久久久久久av成人 | 国产97人人超碰caoprom | 国语精品一区二区三区 | 精品国产福利一区二区 | 国产精品无码永久免费888 | 98国产精品综合一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 少妇无码一区二区二三区 | 国产小呦泬泬99精品 | 国产午夜亚洲精品不卡 | 久久精品国产大片免费观看 | 免费乱码人妻系列无码专区 | 精品国精品国产自在久国产87 | 一本久道久久综合婷婷五月 | 久久国产精品精品国产色婷婷 | 欧美性猛交内射兽交老熟妇 | 大乳丰满人妻中文字幕日本 | 久久精品一区二区三区四区 | 女高中生第一次破苞av | 中文字幕无码免费久久99 | 色综合天天综合狠狠爱 | 九一九色国产 | 午夜丰满少妇性开放视频 | 国精产品一区二区三区 | 国产在线一区二区三区四区五区 | 精品无码av一区二区三区 | 熟妇激情内射com | 东京热无码av男人的天堂 | av在线亚洲欧洲日产一区二区 | 欧美zoozzooz性欧美 | 久久久久se色偷偷亚洲精品av | 国产熟妇另类久久久久 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 成年美女黄网站色大免费全看 | 国产精品久久久久久无码 | 亚洲乱码中文字幕在线 | 亚洲成a人一区二区三区 | 无码免费一区二区三区 | 精品国产一区二区三区四区在线看 | 东京一本一道一二三区 | 在线看片无码永久免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码免费一区二区三区 | 激情五月综合色婷婷一区二区 | 激情内射亚州一区二区三区爱妻 | 永久免费观看国产裸体美女 | 国产乱人伦av在线无码 | 成年美女黄网站色大免费视频 | 久久99久久99精品中文字幕 | 欧美精品免费观看二区 | 少妇人妻av毛片在线看 | 国产欧美熟妇另类久久久 | 成人精品天堂一区二区三区 | 精品国产精品久久一区免费式 | 婷婷综合久久中文字幕蜜桃三电影 | 99精品国产综合久久久久五月天 | 女人色极品影院 | 久久精品一区二区三区四区 | 学生妹亚洲一区二区 | 熟妇人妻无乱码中文字幕 | 女人高潮内射99精品 | 一个人看的视频www在线 | 久久久久99精品国产片 | 九月婷婷人人澡人人添人人爽 | 精品国精品国产自在久国产87 | 人人妻人人澡人人爽欧美一区九九 | 国产免费久久久久久无码 | 一本久道久久综合婷婷五月 | 国产激情艳情在线看视频 | 国产性生交xxxxx无码 | 成人性做爰aaa片免费看 | 欧美国产日产一区二区 | 日韩视频 中文字幕 视频一区 | 天堂亚洲免费视频 | 综合激情五月综合激情五月激情1 | 国产精品高潮呻吟av久久4虎 | 亚洲国产一区二区三区在线观看 | 一本久久a久久精品vr综合 | 亚洲成色www久久网站 | 国产精品久久国产精品99 | 久久99精品久久久久婷婷 | 色婷婷综合中文久久一本 | 在线播放无码字幕亚洲 | 久久久亚洲欧洲日产国码αv | 国产精品国产自线拍免费软件 | 国产后入清纯学生妹 | 亚洲成熟女人毛毛耸耸多 | 国产av无码专区亚洲awww | 色欲综合久久中文字幕网 | 日本大香伊一区二区三区 | 久久久精品成人免费观看 | 97人妻精品一区二区三区 | 国产成人无码区免费内射一片色欲 | 野外少妇愉情中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 夜精品a片一区二区三区无码白浆 | 伊人久久大香线蕉av一区二区 | 国内丰满熟女出轨videos | 久久亚洲国产成人精品性色 | 欧美人与物videos另类 | 久久精品国产亚洲精品 | 国产成人无码午夜视频在线观看 | 中文字幕无码av激情不卡 | 麻豆国产97在线 | 欧洲 | 国产在线无码精品电影网 | 亚洲精品久久久久久一区二区 | 熟女少妇人妻中文字幕 | 俄罗斯老熟妇色xxxx | 久久国产自偷自偷免费一区调 | 亚洲色大成网站www | 正在播放东北夫妻内射 | 日本成熟视频免费视频 | 精品无码一区二区三区的天堂 | 午夜成人1000部免费视频 | 日本www一道久久久免费榴莲 | 国产亚洲视频中文字幕97精品 | 久久亚洲国产成人精品性色 | 色情久久久av熟女人妻网站 | 搡女人真爽免费视频大全 | 老头边吃奶边弄进去呻吟 | 色老头在线一区二区三区 | 女人被爽到呻吟gif动态图视看 | 亚洲国产一区二区三区在线观看 | 西西人体www44rt大胆高清 | 男人和女人高潮免费网站 | 亚洲精品一区国产 | 国产乱人无码伦av在线a | 永久免费观看美女裸体的网站 | 日韩精品a片一区二区三区妖精 | 少妇无码av无码专区在线观看 | 久久久www成人免费毛片 | 国产深夜福利视频在线 | 香港三级日本三级妇三级 | 国产无套粉嫩白浆在线 | 大地资源中文第3页 | 在线a亚洲视频播放在线观看 | 亚洲自偷自拍另类第1页 | 国产亚洲精品久久久久久久久动漫 |