Java面向?qū)ο蟪绦蛟O(shè)計(jì) 課件 項(xiàng)目8 飛機(jī)大戰(zhàn)游戲_第1頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì) 課件 項(xiàng)目8 飛機(jī)大戰(zhàn)游戲_第2頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì) 課件 項(xiàng)目8 飛機(jī)大戰(zhàn)游戲_第3頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì) 課件 項(xiàng)目8 飛機(jī)大戰(zhàn)游戲_第4頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì) 課件 項(xiàng)目8 飛機(jī)大戰(zhàn)游戲_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目8飛機(jī)大戰(zhàn)游戲?qū)W習(xí)目標(biāo)知識(shí)技能目標(biāo):掌握接口的定義;掌握類實(shí)現(xiàn)接口的方法;掌握繼承和多態(tài)的方法;能用兩種方式創(chuàng)建線程的方法;職業(yè)素養(yǎng)目標(biāo):具備較強(qiáng)的職業(yè)道德和責(zé)任心,提高代碼審查和質(zhì)量控制的能力具備軟件產(chǎn)品零BUG的質(zhì)量意識(shí),提升代碼質(zhì)量和程序性能課證融通學(xué)習(xí)內(nèi)容與“大數(shù)據(jù)應(yīng)用開發(fā)(Java)”職業(yè)技能等級(jí)標(biāo)準(zhǔn)(初級(jí))對(duì)應(yīng)關(guān)系工作任務(wù)職業(yè)技能要求1.3面向?qū)ο蟠a編寫(初級(jí))1.3.2能熟練運(yùn)用繼承和多態(tài)機(jī)制編寫復(fù)用度高的Java代碼;1.3.3能熟練運(yùn)用接口機(jī)制設(shè)計(jì)靈活的Java程序;1.2Java高級(jí)機(jī)制編程(中級(jí))1.2.3能運(yùn)用Java異常處理機(jī)制編寫更健壯的Java程序;1.2.5能運(yùn)用Java8的新特性完成函數(shù)式編程,提升編程效率。2.2多線程并發(fā)優(yōu)勢(shì)應(yīng)用2.2.1能熟練使用Java的多線程API創(chuàng)建線程類;任務(wù)8.1搭建系統(tǒng)框架1飛機(jī)大戰(zhàn)游戲中類設(shè)計(jì)如圖所示,根據(jù)類圖設(shè)計(jì),完成項(xiàng)目框架的搭建,包括包的定義、接口的定義。任務(wù)詳解任務(wù)描述任務(wù)8.1搭建系統(tǒng)框架1技術(shù)準(zhǔn)備技能點(diǎn)1:面向接口編程思想面向接口編程思想是指在設(shè)計(jì)軟件應(yīng)用時(shí),應(yīng)該先定義接口,然后再實(shí)現(xiàn)接口。接口定義了一組操作的規(guī)范,而實(shí)現(xiàn)類則負(fù)責(zé)具體實(shí)現(xiàn)這些操作。當(dāng)需要更改某個(gè)功能的實(shí)現(xiàn)時(shí),只需要修改對(duì)應(yīng)的實(shí)現(xiàn)類,而不需要修改其他使用這個(gè)功能的代碼。最終實(shí)現(xiàn)內(nèi)部變動(dòng)而不影響外部與其他實(shí)現(xiàn)交互。其優(yōu)點(diǎn)是提高代碼的可讀性、可復(fù)用性、可維護(hù)性和可擴(kuò)展性,以及降低代碼之間的耦合度。面向接口編程也是面向?qū)ο缶幊腆w系中的思想精髓之一。任務(wù)8.1搭建系統(tǒng)框架1微課1-1Java前世今生技能點(diǎn)1:面向接口編程思想(1)語(yǔ)法:interface接口名{//常量和抽象方法}技術(shù)準(zhǔn)備1.JDK8以前接口(2)使用說(shuō)明:①接口中的抽象方法,可以不加abstract。②接口中的常量,可以不加final和static,系統(tǒng)默認(rèn)會(huì)加上。(3)接口特性①接口不可以被實(shí)例化,接口通常作為類型來(lái)使用。②實(shí)現(xiàn)類必須實(shí)現(xiàn)接口的所有方法,否則接口的實(shí)現(xiàn)類定義為抽象類。③實(shí)現(xiàn)類可以實(shí)現(xiàn)多個(gè)接口,實(shí)現(xiàn)Java中的多重繼承。④接口中的變量都是靜態(tài)常量。⑤接口可以多重繼承,也就是說(shuō)一個(gè)接口可以有多個(gè)父接口。任務(wù)8.1搭建系統(tǒng)框架1技能點(diǎn)1:面向接口編程思想技術(shù)準(zhǔn)備接口新特性——JDK8.0之后,接口中除了有抽象方法以外,允許有默認(rèn)方法和靜態(tài)方法示例代碼:UsbInterface接口中有1個(gè)默認(rèn)方法和一個(gè)抽象方法。publicinterfaceUsbInterface{

//模擬連接USB設(shè)備

defaultvoidpreService(){

System.out.println("USB設(shè)備已連接");}

//模擬USB設(shè)備工作

voidservice();

//模擬拔出USB設(shè)備

defaultvoidafterService(){

System.out.println("USB設(shè)備已拔出");}}(1)默認(rèn)方法接口中的默認(rèn)方法用default關(guān)鍵字修飾,并提供方法的默認(rèn)實(shí)現(xiàn)。這一特性可以在不修改現(xiàn)有實(shí)現(xiàn)的基礎(chǔ)上添加新的方法,增強(qiáng)的接口的可擴(kuò)展性。任務(wù)8.1搭建系統(tǒng)框架1技能點(diǎn)1:面向接口編程思想技術(shù)準(zhǔn)備接口新特性——JDK8.0之后,接口中除了有抽象方法以外,允許有默認(rèn)方法和靜態(tài)方法示例代碼:在JDK8.0中,F(xiàn)unction接口中包含static方法identity()。publicinterfaceFunction<T,R>{static<T>Function<T,T>identity(){returnt->t;}}(2)JDK8中,允許接口中包含靜態(tài)方法,提供與接口相關(guān)的實(shí)用功能。JDK9.0之后,接口中允許有私有方法,私有方法只能在接口內(nèi)被調(diào)用。私有方法用于輔助默認(rèn)方法和靜態(tài)方法的實(shí)現(xiàn),隱藏實(shí)現(xiàn)細(xì)節(jié),提高代碼的可讀性和可維護(hù)性。JDK9.0中接口新特性任務(wù)8.1搭建系統(tǒng)框架1技能點(diǎn)2:抽象類的定義(1)定義抽象方法的語(yǔ)法[訪問(wèn)控制符]abstract[返回值類型]方法名([形參列表]);(2)抽象方法的特點(diǎn):①抽象方法沒(méi)有方法體,沒(méi)有{},方法頭后以分號(hào)結(jié)束②抽象方法必須在抽象類或者接口中,普通類中不能有抽象方法③抽象方法必須在子類中實(shí)現(xiàn),除非子類也是抽象類技術(shù)準(zhǔn)備1.抽象方法:是一種特殊的方法,它在抽象類或接口中聲明。抽象方法主要用于定義子類必須實(shí)現(xiàn)的特定行為,但不提供這些行為的具體實(shí)現(xiàn)。任務(wù)8.1搭建系統(tǒng)框架1技能點(diǎn)2:抽象類的定義(1)定義抽象類的語(yǔ)法[訪問(wèn)控制符]abstractclass類名{public類名(){

//構(gòu)造方法}//抽象方法publicabstractvoidabstractMethodName();//非抽象方法的定義

}技術(shù)準(zhǔn)備2.抽象類的定義:抽象類是一種特殊的類,不能被實(shí)例化,通常用于定義一組具有共同特性的對(duì)象或作為一組子類的通用父類。抽象類可以包含抽象方法和非抽象方法,但如果一個(gè)類中包含抽象方法,那么這個(gè)類就必須被聲明為抽象類。(2)抽象類的特點(diǎn)①抽象類不能實(shí)例化②抽象類中可以有抽象方法,但不是必需的③抽象類應(yīng)該被繼承,不能定義成final的④抽象類的構(gòu)造方法不能是private任務(wù)8.1搭建系統(tǒng)框架1練一練閱讀下列代碼,分析類的定義有沒(méi)有錯(cuò)誤?publicabstractclassPet{publicvoidprint(){//…}}

正確

原因:

;

錯(cuò)誤

原因:

publicclassPet{publicabstractvoidprint();}

正確

原因:

;

錯(cuò)誤

原因:

;

任務(wù)實(shí)施任務(wù)8.1搭建系統(tǒng)框架1第一步:任務(wù)分析(1)根據(jù)圖8.1中的類圖,寫出項(xiàng)目所涉及的包名及類名:(2)寫出接口名和接口中的抽象方法接口名:抽象方法:(3)抽象類GameObject中包含的屬性和方法第二步:編寫代碼(1)新建一個(gè)Java項(xiàng)目(2)新建包(3)新建接口IGameObject(4)新建抽象類GameObject第三步:驗(yàn)證結(jié)果AEBCD小組協(xié)作,完成任務(wù)評(píng)價(jià)測(cè)試任務(wù)8.1搭建系統(tǒng)框架1評(píng)價(jià)指標(biāo)評(píng)價(jià)標(biāo)準(zhǔn)分值得分創(chuàng)建項(xiàng)目正確創(chuàng)建Java項(xiàng)目10

包的創(chuàng)建正確定義包,包名命名準(zhǔn)確10

接口定義正確定義接口IGameObject30

抽象類的定義正確定義抽象類GameObject30

編碼規(guī)范包名、接口名、抽象類命名規(guī)范、有合理的注釋20

任務(wù)8.1搭建系統(tǒng)框架1拓展提升——函數(shù)式接口Lambda表達(dá)式的本質(zhì)是實(shí)現(xiàn)了一個(gè)函數(shù)式接口。函數(shù)接口也是JDK8的新特性之一,用于支持Lambda表達(dá)式。函數(shù)式接口是只有一個(gè)抽象方法的接口,可以用@FunctionalInterface注解來(lái)顯式標(biāo)記,當(dāng)接口中多于一個(gè)抽象方法時(shí),編譯會(huì)報(bào)錯(cuò)。ActionListener接口和Lambda表達(dá)式是兼容的,因此添加事件監(jiān)聽時(shí)可以用Lambda表達(dá)式來(lái)實(shí)現(xiàn)。任務(wù)8.1搭建系統(tǒng)框架1案例:定義一個(gè)函數(shù)式接口,包含一個(gè)抽象方法say教師演示第一步:創(chuàng)建函數(shù)式接口//定義函數(shù)式接口@FunctionalInterfacepublicinterfaceMyInterface{//包含一個(gè)抽象方法publicvoidsay(Stringcontent);}第二步:調(diào)用接口中的方法

//創(chuàng)建Lambda表達(dá)式MyInterfacemi=content->System.out.println("say:"+content);//調(diào)用函數(shù)式接口的方法mi.say("Hello!FunctionInterface.");第三步:運(yùn)行程序任務(wù)描述任務(wù)8.2定義接口的實(shí)現(xiàn)類2根據(jù)項(xiàng)目類圖可知,GameObject類實(shí)現(xiàn)Image接口,子彈類Bullet,敵機(jī)類Enemy,玩家飛機(jī)類Plane都是GameObject的子類。本任務(wù):根據(jù)類圖,實(shí)現(xiàn)GameObject類實(shí)現(xiàn)IGameObject接口,并創(chuàng)建GameObject的三個(gè)子類。具體任務(wù)任務(wù)8.2定義接口的實(shí)現(xiàn)類2技能點(diǎn)1:創(chuàng)建接口的實(shí)現(xiàn)類語(yǔ)法:class子類名implements接口列表{//給出接口中所有抽象方法的}使用說(shuō)明:(1)如果類實(shí)現(xiàn)了接口,那么它必須提供該接口中聲明的所有方法的具體實(shí)現(xiàn),除非這個(gè)類本身是抽象的。(2)Java中,一個(gè)類可以實(shí)現(xiàn)一個(gè)或者多個(gè)接口,中間用逗號(hào)分隔。技術(shù)準(zhǔn)備類實(shí)現(xiàn)接口使用implements關(guān)鍵字,并且該類需要提供接口中所有方法的具體實(shí)現(xiàn)。技能點(diǎn)2:繼承的實(shí)現(xiàn)任務(wù)8.2定義接口的實(shí)現(xiàn)類2創(chuàng)建子類語(yǔ)法: class

子類名

extends

父類{ }使用說(shuō)明:(1)父類必須是已經(jīng)存在的類,可以是JDK中定義的類,也可以是用戶自己定義或者第三方的類。(2)Java中不支持類的多重繼承,一個(gè)類只能有一個(gè)直接父類。(3)子類擁有父類所有非私有的屬性和方法。(4)final修飾的類不能作為父類(不能被繼承)。(5)子類也叫派生類,父類又稱為基類或者超類。面向?qū)ο蟮娜筇卣魇欠庋b性、繼承性和多態(tài)性。繼承性是指在現(xiàn)有類的基礎(chǔ)上創(chuàng)建子類,新增程序的功能。繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的特性,其好處是可以減少代碼的冗余,便于系統(tǒng)升級(jí)和維護(hù)。技術(shù)準(zhǔn)備任務(wù)8.2定義接口的實(shí)現(xiàn)類2案例:編寫圓類,可以計(jì)算圓的面積和周長(zhǎng);編寫一個(gè)圓柱體類,可以計(jì)算圓柱體的體積、底面面積和底面周長(zhǎng)。教師演示第一步:任務(wù)分析(1)識(shí)別所用到的類:圓類(Circle)、圓柱體類(Cylinder)和測(cè)試類Test;(2)識(shí)別圓類(Circle)包含的屬性和方法:(3)識(shí)別圓柱體類(Cylinder)包含的屬性和成員方法第二步:編碼實(shí)現(xiàn)(1)新建Java項(xiàng)目(2)新建Circle類(3)編寫圓柱體類(4)編寫測(cè)試類第三步:測(cè)試運(yùn)行程序技能點(diǎn)3:多態(tài)的實(shí)現(xiàn)任務(wù)8.2定義接口的實(shí)現(xiàn)類2在面向?qū)ο蟪绦蛟O(shè)計(jì)理論中,多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征之一。多態(tài)性是指:相同的消息發(fā)送給不同類的對(duì)象,可能產(chǎn)生多種不同的行為。多態(tài)性分為編譯時(shí)的多態(tài)性(靜態(tài)多態(tài)性)和運(yùn)行時(shí)的多態(tài)性(動(dòng)態(tài)多態(tài)性)。靜態(tài)多態(tài)性:通過(guò)方法的重載來(lái)實(shí)現(xiàn),程序在編譯時(shí)就清楚調(diào)用哪一個(gè)方法;動(dòng)態(tài)多態(tài)性:通過(guò)方法的覆蓋來(lái)實(shí)現(xiàn),程序在執(zhí)行過(guò)程中才清楚調(diào)用哪一個(gè)方法。技術(shù)準(zhǔn)備任務(wù)8.2定義接口的實(shí)現(xiàn)類2方法重載:指在同一個(gè)類中出現(xiàn)多個(gè)同名的方法,要求方法特征(參數(shù)類型、參數(shù)個(gè)數(shù)、參數(shù)順序)不完全相同。方法重載在JDK提供的類中應(yīng)用特別廣泛,java.io.PrintStream類中包含多個(gè)print方法,其參數(shù)類型不同。

技術(shù)準(zhǔn)備——用重載實(shí)現(xiàn)靜態(tài)多態(tài)性任務(wù)8.2定義接口的實(shí)現(xiàn)類2案例:定義一個(gè)類,滿足以下要求:教師演示(1)包含編寫一個(gè)方法average,該方法以兩個(gè)整數(shù)為參數(shù),并以浮點(diǎn)數(shù)形式返回兩個(gè)整數(shù)的平均值;(2)重載average方法,使得輸入?yún)?shù)為3個(gè)整數(shù),然后返回這三個(gè)數(shù)的平均值;(3)重載average方法,使其返回四個(gè)參數(shù)的平均值。任務(wù)8.2定義接口的實(shí)現(xiàn)類2技術(shù)準(zhǔn)備——用覆蓋實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性方法覆蓋時(shí)應(yīng)遵循的原則有:(1)覆蓋后的方法(子類中的方法)不能比被覆蓋的方法(父類中的方法)有更嚴(yán)格的訪問(wèn)權(quán)限;(2)覆蓋后的方法不能比被覆蓋的方法產(chǎn)生更多的異常。方法覆蓋又稱為方法重寫是指在子類中出現(xiàn)與父類的方法名、返回類型、函數(shù)特征完全相同的方法。方法覆蓋的作用是:當(dāng)父類中的方法不能滿足需要,覆蓋使得在子類中可以重新定義父類中已有的方法,從而體現(xiàn)出子類自己的行為。任務(wù)8.2定義接口的實(shí)現(xiàn)類2技術(shù)準(zhǔn)備——用super調(diào)用父類構(gòu)造方法創(chuàng)建子類對(duì)象會(huì)先調(diào)用父類的構(gòu)造方法(默認(rèn)調(diào)用父類無(wú)參構(gòu)造方法),再調(diào)用子類的構(gòu)造方法。也可以通過(guò)在子類構(gòu)造方法中通過(guò)super()調(diào)用父類構(gòu)造方法。語(yǔ)法:調(diào)用父類無(wú)參構(gòu)造方法:

super();調(diào)用父類有參構(gòu)造方法:

super([參數(shù)列表]);

使用說(shuō)明:調(diào)用父類構(gòu)造方法的語(yǔ)句只能是子類構(gòu)造方法的第一條語(yǔ)句。子類中沒(méi)有通過(guò)super調(diào)用父類構(gòu)造方法,默認(rèn)調(diào)用父類無(wú)參構(gòu)造方法。任務(wù)8.2定義接口的實(shí)現(xiàn)類2練一練:閱讀下列代碼,分析程序存在的問(wèn)題,并給出解決方案classSuperClass{

publicSuperClass(Stringstr){//有參構(gòu)造方法

System.out.println("TheSuperCalssConstructorisinvoked!");}}classSubClassextendsSuperClass{

publicSubClass(){//無(wú)參構(gòu)造方法

System.out.println("TheSubClassConstructorisinvoked!");}}classMainClass{

publicstaticvoidmain(String[]args){

SubClassobj=newSubClass();}}任務(wù)8.2定義接口的實(shí)現(xiàn)類2技術(shù)準(zhǔn)備——?jiǎng)討B(tài)多態(tài)性的實(shí)現(xiàn)實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性的步驟:第一步:編寫父類第二步:編寫子類,子類重寫(覆蓋)父類方法第三步:運(yùn)行時(shí),使用父類的類型,子類的對(duì)象任務(wù)8.2定義接口的實(shí)現(xiàn)類2案例:編寫一個(gè)顧客類,包括ID,姓名,電話,地址,購(gòu)買力,輸入客戶信息和輸出客戶信息的方法。編寫一個(gè)員工類,包括ID,姓名,電話,地址,工資,輸入員工信息和輸出客戶信息的方法。要求:增加代碼的重用。教師演示任務(wù)實(shí)施任務(wù)8.2定義接口的實(shí)現(xiàn)類2第一步:創(chuàng)建接口的實(shí)現(xiàn)類創(chuàng)建IGameObject的實(shí)現(xiàn)類GameObject,該類為抽象類。第二步:創(chuàng)建GameObject類的子類(1)創(chuàng)建子彈類。(2)創(chuàng)建敵機(jī)類。(3)創(chuàng)建玩家飛機(jī)類。第三步:驗(yàn)證程序根據(jù)類圖,驗(yàn)證包和接口的定義是否完整、準(zhǔn)確。AEBCD小組協(xié)作,完成任務(wù)評(píng)價(jià)測(cè)試任務(wù)8.2定義接口的實(shí)現(xiàn)類2評(píng)價(jià)指標(biāo)評(píng)價(jià)標(biāo)準(zhǔn)分值得分創(chuàng)建項(xiàng)目正確創(chuàng)建Java項(xiàng)目10

類實(shí)現(xiàn)接口正確定義GameObject,實(shí)現(xiàn)IGameObject接口10

敵機(jī)類正確定義Enemy類,繼承GameObject類20

子彈類正確定義Bullet類,繼承GameObject類20

玩家飛機(jī)類正確定義Plane類,繼承GameObject類20

編碼規(guī)范代碼編寫規(guī)范、有合理的注釋20

拓展提升——用可變參數(shù)減少方法的重載任務(wù)8.2定義接口的實(shí)現(xiàn)類2要實(shí)現(xiàn)計(jì)算兩個(gè)整數(shù)、三個(gè)整數(shù)、四個(gè)整數(shù)和五個(gè)整數(shù)的平均數(shù),我們可以用到方法的重載,定義四個(gè)average()方法。在JDK5.0之后,可以使用方法的可變參數(shù),將上述四個(gè)average方法用一個(gè)方法來(lái)替換。可變參數(shù)的形式:數(shù)據(jù)類型...可變參數(shù)名使用說(shuō)明:(1)可變參數(shù)的本質(zhì)是數(shù)組,多個(gè)參數(shù)是當(dāng)做數(shù)組傳遞的。(2)一個(gè)方法最多只能有一個(gè)可變參數(shù),而且必須是最后一個(gè)參數(shù)。拓展提升——用可變參數(shù)減少方法的重載任務(wù)8.2定義接口的實(shí)現(xiàn)類2示例代碼:用可變參數(shù)實(shí)現(xiàn)計(jì)算兩個(gè)整數(shù)、三個(gè)整數(shù)、四個(gè)整數(shù)和五個(gè)整數(shù)的平均數(shù)publicintaverage(int...nums){

intsum=0;

for(intn:nums){

sum+=n;}

returnsum/nums.length;}任務(wù)描述任務(wù)8.3創(chuàng)建游戲界面3本任務(wù)創(chuàng)建游戲界面,具體要求:(1)窗口大小500×500,點(diǎn)擊窗體關(guān)閉按鈕結(jié)束游戲(2)加載游戲背圖片(3)在游戲窗口底部顯示玩家飛機(jī)具體任務(wù)任務(wù)8.3創(chuàng)建游戲界面3技能點(diǎn)1:將圖片文件轉(zhuǎn)換成Image對(duì)象技術(shù)準(zhǔn)備1.讀取圖像staticBufferedImageImageIO.read(Fileinput):從文件中讀取圖像staticBufferedImageImageIO.read(URLinput):從URL中讀取圖像2.寫入圖像ImageIO.write(RenderedImageim,StringformatName,Fileoutput)方法將圖像寫入文件。參數(shù)說(shuō)明:(I)im可以是BufferedImage或其他實(shí)現(xiàn)了該接口的對(duì)象(2)formatName是要寫入的圖像格式(如"jpg”或"png")(3)output是輸出文件的File對(duì)象javax.imageio.ImageIO是Java標(biāo)準(zhǔn)庫(kù)中的一個(gè)類,它提供了一個(gè)簡(jiǎn)單的接口來(lái)讀取、寫入和創(chuàng)建圖像。任務(wù)8.3創(chuàng)建游戲界面3案例:編寫GameUtil類,實(shí)現(xiàn)將文件轉(zhuǎn)換成Image教師演示第一步:任務(wù)分析實(shí)現(xiàn)讀圖像,用到j(luò)avax.imageio.ImageIO類的read()方法。第二步:編碼實(shí)現(xiàn)publicclassGameUtil{publicstaticImagegetImage(Stringpath){//讀圖像BufferedImageimage=null;URLurl=GameUtil.class.getClassLoader().getResource(path);try{image=ImageIO.read(url);}catch(IOExceptione){thrownewRuntimeException(e);}returnimage;}}任務(wù)8.3創(chuàng)建游戲界面3案例:在窗體中加載背景圖片教師演示第一步:任務(wù)分析圖片資源存放在Maven項(xiàng)目resources下,調(diào)用案例1中的類,實(shí)現(xiàn)讀圖像。第二步:編碼實(shí)現(xiàn)

關(guān)鍵技術(shù):在JFrame中顯示圖片,可以重寫paint(Graphicsg)方法,調(diào)用Graphics類中的drawImage()方法實(shí)現(xiàn)(1)新建一個(gè)Maven項(xiàng)目,在resources下新建images文件夾,將背景圖片存放到該文件夾中。(2)新建GameWindow,繼承自JFrame(3)在Main類中,創(chuàng)建GameWindow對(duì)象第三步:運(yùn)行程序任務(wù)實(shí)施任務(wù)8.3創(chuàng)建游戲界面3第一步:任務(wù)分析在任務(wù)8.2的基礎(chǔ)上,編寫GameUtil類用于實(shí)現(xiàn)讀取圖像文件,編寫GameWindow類,用于顯示飛機(jī)大戰(zhàn)游戲界面。GameWindow類實(shí)現(xiàn)顯示主界面,初始化玩家飛機(jī),在主界面顯示背景圖片和玩家飛機(jī)。第二步:編碼實(shí)現(xiàn)(1)打開任務(wù)8.2的項(xiàng)目。(2)新建GameWindow類,繼承自JFrame,根據(jù)提示,完善代碼。(3)在main方法中創(chuàng)建GameWindow的對(duì)象第三步:運(yùn)行程序AEBCD小組協(xié)作,完成任務(wù)評(píng)價(jià)測(cè)試任務(wù)8.3創(chuàng)建游戲界面3評(píng)價(jià)指標(biāo)評(píng)價(jià)標(biāo)準(zhǔn)分值得分創(chuàng)建項(xiàng)目正確創(chuàng)建Java項(xiàng)目10

顯示背景圖片正確在窗體中顯示背景圖片20

窗體顯示窗體居中、大小500*500、大小不可變20

顯示玩家飛機(jī)正確顯示玩家飛機(jī)30

編碼規(guī)范變量命名規(guī)范、有合理的注釋20

拓展提升——日志處理任務(wù)8.3創(chuàng)建游戲界面31.輸出日志信息java.util.logging.Logger類提供了輸出日志信息的方法2.日志級(jí)別java.util.logging.Level類定義了一組可用于控制日志輸出的標(biāo)準(zhǔn)日志記錄級(jí)別。按照級(jí)別從高到低分別是:Level.SEVERE:表示嚴(yán)重故障的消息級(jí)別;Level.WARNING:表示潛在問(wèn)題的消息級(jí)別;Level.INFO:表示信息性消息的消息級(jí)別;Level.CONFIG:表示靜態(tài)配置消息的消息級(jí)別;Level.FINE:提供跟蹤信息的消息級(jí)別;Level.FINER:表示想當(dāng)詳細(xì)的跟蹤消息;Level.FINEST:表示高度詳細(xì)的跟蹤信息;3.關(guān)閉日志Logger.getGlobal().setLevel(Level.OFF);可實(shí)現(xiàn)不輸出日志信息。任務(wù)描述任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3在任務(wù)8.3中,完成了飛機(jī)大戰(zhàn)游戲主界面構(gòu)建,接下來(lái)用線程實(shí)現(xiàn)在游戲中同時(shí)加載玩家飛機(jī)、敵機(jī)和子彈。具體任務(wù):(1)創(chuàng)建一個(gè)子彈線程,用于管理玩家發(fā)射的子彈(2)創(chuàng)建一個(gè)敵機(jī)線程,用于管理敵機(jī)(3)創(chuàng)建一個(gè)線程,用于每個(gè)50毫秒刷新游戲界面(4)創(chuàng)建一個(gè)倒計(jì)時(shí)線程,用于記錄游戲時(shí)間具體任務(wù)任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3技能點(diǎn)1:線程及生命周期1.進(jìn)程和線程線程又稱為“輕量級(jí)”的進(jìn)程。一個(gè)進(jìn)程中可以有一個(gè)或者多個(gè)線程,如果進(jìn)程中只有一個(gè)線程,是單線程程序,如果進(jìn)程中有多個(gè)線程為多線程程序。2.線程的生命周期(1)新建狀態(tài)(2)可運(yùn)行狀態(tài)(3)運(yùn)行狀態(tài)(4)不可運(yùn)行狀態(tài)(阻塞、睡眠等)(5)死亡狀態(tài)技術(shù)準(zhǔn)備任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3技能點(diǎn)2:用繼承Thread類方式創(chuàng)建線程(1)常用構(gòu)造方法Thread():創(chuàng)建一個(gè)新的線程對(duì)象。Thread(Runnabletarget):創(chuàng)建一個(gè)新的線程對(duì)象,用于執(zhí)行Runnable對(duì)象的任務(wù)。(2)常用方法start():啟動(dòng)線程,線程進(jìn)入就緒狀態(tài)。run():線程執(zhí)行的主體,當(dāng)CPU空閑時(shí),從就緒隊(duì)列中取優(yōu)先級(jí)最高的線程,執(zhí)行run()方法,此時(shí),線程進(jìn)入運(yùn)行狀態(tài)。interrupt():中斷線程wait():讓線程進(jìn)入等待狀態(tài)sleep(longs):線程進(jìn)入睡眠狀態(tài),參數(shù)的單位是毫秒setPriority(intpriority):設(shè)置線程的優(yōu)先級(jí)技術(shù)準(zhǔn)備1.通過(guò)繼承Thread類任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3技術(shù)準(zhǔn)備技能點(diǎn)2:用繼承Thread類方式創(chuàng)建線程示例代碼:創(chuàng)建線程類classMyThreadextendsThread{

//線程要完成的任務(wù)publicvoidrun(){}}啟動(dòng)線程:

MyThreadthread=newMyThread();thread.start();任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3案例:在窗體顯示以“yyyy-MM-ddhh:mm:ss”格式動(dòng)態(tài)顯示系統(tǒng)時(shí)間教師演示第一步:任務(wù)分析(1)創(chuàng)建Thread類的子類TimeThread,用于動(dòng)態(tài)顯示系統(tǒng)時(shí)間(2)按照指定格式顯示系統(tǒng)日期和時(shí)間,用到SimpleDateFormat類,對(duì)系統(tǒng)當(dāng)前時(shí)間進(jìn)行格式化(3)動(dòng)態(tài)顯示時(shí)間,用到無(wú)限循環(huán),避免時(shí)間不停刷新,可通過(guò)Thread.sleep(1000);讓線程睡眠1秒鐘第二步:編碼實(shí)現(xiàn)(1)新建一個(gè)Java項(xiàng)目(2)新建MainForm類,包含JPanel,JLabel等組件(3)在MainForm類中新建一個(gè)內(nèi)部類TimeThread,用于顯示系統(tǒng)時(shí)間(4)在MainForm類構(gòu)造方法中,創(chuàng)建TimeThread類的對(duì)象,并啟動(dòng)start()方法(5)在main方法中創(chuàng)建MainForm類的對(duì)象第三步:運(yùn)行程序技能點(diǎn)3:用實(shí)現(xiàn)Runnable接口創(chuàng)建線程任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3Java中類不支持多重繼承,因此,當(dāng)線程類已經(jīng)有父類的情況,可通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建線程類。技術(shù)準(zhǔn)備第二步:動(dòng)線程第一步:創(chuàng)建一個(gè)類,實(shí)現(xiàn)Runnable接口0201實(shí)現(xiàn)Runnable接口創(chuàng)建線程的步驟classMyThreadimplementsRunnable{publicvoidrun(){//線程要完成的任務(wù)}}MyThreadth=newMyThread();newThread(th).start();任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3案例:為避免沉迷游戲,為游戲窗口主界面添加倒計(jì)時(shí)提醒教師演示第一步:任務(wù)分析GameWindow類已經(jīng)繼承了JFrame類,只能通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建線程實(shí)現(xiàn)倒計(jì)時(shí)。在游戲主界面顯示倒計(jì)時(shí),20分鐘后游戲結(jié)束。倒計(jì)時(shí)格式:“倒計(jì)時(shí):XX分鐘XX秒”第二步:編碼實(shí)現(xiàn)(1)打開任務(wù)8.2的項(xiàng)目(2)修改GameWindow類,實(shí)現(xiàn)Runnable接口,重寫run()方法第三步:運(yùn)行程序任務(wù)實(shí)施任務(wù)8.4用線程實(shí)現(xiàn)顯示游戲元素3第一步:任務(wù)分析根據(jù)任務(wù)描述,本任務(wù)涉及到多個(gè)線程,可以將四個(gè)線程單獨(dú)放到org.example.planegame.service包中。第二步:編碼實(shí)現(xiàn)(1)編寫B(tài)ulletThread類,實(shí)現(xiàn)管理玩家發(fā)射的子彈。(2)編寫EnemyThread類,實(shí)現(xiàn)管理敵機(jī)和敵機(jī)發(fā)射的子彈。(3)編寫CountDownSecondThread類,實(shí)現(xiàn)游戲倒計(jì)時(shí)管理。(4)編寫PaintThread類,實(shí)現(xiàn)對(duì)界面定時(shí)刷新第三步:運(yùn)行程序AEBCD小組協(xié)作,完成任務(wù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論