JAVA游戏开发-从零开始开发贪吃蛇电梯模拟游戏-全_第1页
JAVA游戏开发-从零开始开发贪吃蛇电梯模拟游戏-全_第2页
JAVA游戏开发-从零开始开发贪吃蛇电梯模拟游戏-全_第3页
JAVA游戏开发-从零开始开发贪吃蛇电梯模拟游戏-全_第4页
JAVA游戏开发-从零开始开发贪吃蛇电梯模拟游戏-全_第5页
已阅读5页,还剩204页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA游戏开发

从零开始开发贪吃蛇、电梯模拟游戏

Java遊戲開發(貪吃蛇、電梯模擬遊戲)

學習情境1:Java遊戲體驗08遊戲3-2目標和任務兩個真實的Java遊戲本課程學完後要完成的兩個Java遊戲:(1)貪吃蛇遊戲(2)電梯模擬遊戲學習過程實踐指導動手實踐3、使用Java整合式開發環境調試運行Java程式編輯並保存java程式解釋java程式形成中間檔運行Java程式,得到結果Java相關一、1995年Java被正式發佈二、Java目前的主要應用許多大公司購買了Java的許可證。眾多軟體發展商開始支持Java軟體產品。物件導向的應用開發。Intranet(企業內部網)上的軟體發展。動態畫面的設計,包括圖形圖像的調用。與各類資料庫連接查詢的SQL語句實現。其他應用類型的程式。三、Java語言的特點三、Java語言的特點可攜性:Java來源程式經過編譯器編譯,會被轉換成一種我們稱之為“位元組碼(byteˉcodes)”的目的程式。“位元組碼”的最大特點便是可以跨平臺運行,即程式設計人員們常說的“編寫一次,到處運行”,正是這一特性成為Java得以迅速普及的重要原因。解釋性:採用先經過編譯器編譯、再利用解譯器解釋的方式運行三、Java語言的特點高性能:用Java語言編輯的來源程式的執行方法是採用先經過編譯器編譯、再利用解譯器解釋的方式來運行的。它綜合了解釋性語言與編譯語言的眾多優點,使其執行效率較以往的程式設計語言有了大幅度的提高。三、Java語言的特點併發性:Java的多執行緒機制使應用程式中的執行緒能夠併發執行,且其同步機制保證了對共用資料的正確操作。通過使用多執行緒,程式設計者可以分別用不同的執行緒完成特定的行為,而不需要採用全域的事件迴圈機制,這樣就很容易在網路上實現即時交互行為。豐富的API(ApplicationProgramInterface)文檔和類庫,程式師的開發工作可以在一個更高的層次上展開,這也正是Java受歡迎的重要原因之一。Java同時為用戶提供了詳盡的API文檔說明。四、Java程式工作機制Java程式的組成結構五、Java應用程式(教師提供)Java程式的組成結構(1)至多有一個public類,檔案名必須與類名相同。(2)程式可以有一個或多個其它類。(3)當需要從某個類繼承或使用某個類及其方法時,使用import引入該類的定義。(4)Java程式組成結構

package //0個或1個,必須放在檔開始

import //0個或多個,必須放在所有類定義之前

publicclassDefinition //0個或1個,檔案名必須與類名相同

classDefinition //0個或多個

interfaceDefinition //0個或多個

六、Java開發平臺(1)JDK+EditPlus(2)JDK+Jcreate(3)JDK+Eclipse七、Java程式的開發及運行過程Java遊戲開發(貪吃蛇、電梯模擬遊戲)

學習情境2:Java類設計08遊戲3-2目標和任務學習過程項目核心:模仿教師提供的一個核心案例,學習類的編寫方法功能擴展1:擴展類,為類添加更多的屬性、方法、存取控制功能擴展2:使用已有的類應用升級:分析電梯模擬遊戲的類圖,模仿核心案例編寫電梯遊戲所需的類项目核心功能扩展1功能扩展2应用升级物件導向程式設計概述Java類Java中所有的程式都由一個或多個類組成設計Java程式就是設計Java的類先有類,再創建類的對象,通過物件使用類類由屬性和方法構成.Java中的系統類和自訂類學習Java,先學會使用系統類完成一定的功能,再學習自己設計一些類.程式1-1EnterDate類定義一個類,又叫聲明一個類,它有固定的書寫格式類聲明的格式.掌握屬性的聲明和方法的聲明,就掌握了類的聲明.注意類聲明時的一些規範.<修飾符>class<類名>extends[<父類名>][implements<介面1>[,<介面2>]*]{類體}類的聲明屬性聲明方法聲明項目核心供學生模仿,它具有完整的類格式,但只包含少數屬性和操作該屬性的方法//核心案例,檔案名:EnterDate.Java,publicclassEnterDate{publicintyear;publicvoidsetYear(intnewYear){if(newYear<0){System.out.println("所給的年份參數不合理,設置操作被拒絕!");return;}year=newYear;}//endsetYear(intnewYear)方法//提供對屬性year進行讀取的方法publicintgetYear(){returnyear;}//測試上述屬性和方法能否正確使用publicstaticvoidmain(Stringargs[]){EnterDatehubd;hubd=newEnterDate();hubd.setYear(1980);System.out.println("year="+hubd.getYear());}}類的聲明屬性聲明方法聲明類的使用2、類的使用先定義一個類再創建這個類的物件類名對象名=new類的構造方法;通過調用物件的屬性和方法來使用這個物件,即使用類來完成一定的事(功能)

對象名.屬性;對象名.方法;示例:使用核心案例EnterDate類。核心案例就是EnterDate類的定義(2)EnterDatehubd=newEnterDate();(3)hubd.setYear(1980);EnterDate.Java類的測試類testEnterDate在另一個新類testEnterDate中使用EnterDate,如下所示,//publicclasstestEnterDate{publicstaticvoidmain(Stringargs[]){EnterDatehubd,humm;hubd=newEnterDate();humm=newEnterDate(182,45,69);hubd.setYear(1980);hubd.setMonth(8);hubd.setDay(28);}}測試EnterDate中方法與屬性的結果:構造器構造器又叫構造方法,構造函數。構造方法是Java類中一種特殊的方法。它體現在:(1)構造方法的方法名必須與類名完全相同。(2)一個類可以定義多個構造方法,這叫構造方法的重載。(3)沒有參數的構造方法叫默認構造方法,有參數的叫非默認構造方法。(4)一個類如果一個構造方法都沒有定義,則它繼承父類的構造方法。(5)當一個類中定義了非默認的構造方法後,默認的構造方法就失效了,除非再定一個默認構造方法的定義。信息隱藏和封裝屬性和方法可以沒有修飾符,有public修飾符、有private修飾符,有protected修飾符。屬性和方法修飾符不同,可以控制它們被訪問的範圍。用private修飾不想被其它類訪問的屬性和方法,以達到資訊隱藏的目的。用public修飾哪些不想隱藏的屬性和方法,以達到可以被子類繼承或被別的類訪問的目的。使用繼承創建類功能擴展:使用繼承定義一個person類作為父類,代碼如下:classPerson{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;}publicPerson(Stringname){this(name,20);}publicPerson(){name="";age=20;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}publicvoidsetName(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetInfo(){return"name:"+name+"\nage:"+age;}}//endclassPerson功能擴展:使用繼承Student先繼承Person,後重載Person中的方法從上面的Person類繼承一個子類Student類,並在子類中重載父類Person中的方法classStudentextendsPerson{privateStringschool;//增加新屬性

publicStudent(Stringname,intage,Stringschool){super(name,age);this.school=school;}publicStudent(Stringname,Stringschool){super(name);this.school=school;}publicStudent(Stringschool){this.school=school;}//重載構造方法

publicStudent(){school="";}publicStringgetSchool(){returnschool;}//增加新的方法

publicvoidsetSchool(){this.school=school;}//增加新的方法

publicStringgetInfo(){returnsuper.getInfo()+"\nschool:"+school;}//重載}功能擴展:使用繼承設計一個類使用Person,StudentpublicclassP49{publicstaticvoidmain(Stringargs[]){Personperson=newPerson("張三",21);System.out.println(person.getInfo());Studentstudent=newStudent("李四",22,"sziit");System.out.println(student.getInfo());Persons=newStudent("王五",23,"szpt");

System.out.println(s.getInfo());}}方法重載一個類多個同名的方法叫重載重載不同重寫普通方法與構造方法都可以重載普通方法重載規則:重載方法的參數列表必須和被重載的方法不同。重載方法的返回類型可以和被重載的方法不同,但僅此還不夠。重載方法可以改變存取控制級別構造器的重載構造器也可以重載用this調用自己的構造方法用super調用父類的構造方法this和super不能同時出現this和super只能出現在第一行如果你類中沒有顯式的默認構造器,不能用super()。方法覆蓋子類可以重寫父類中同名的方法重寫也稱為覆蓋重寫時注意:方法名必須與被重寫的方法一樣參數列表必須與被重寫的方法一樣返回類型必須與被重寫的方法一樣存取控制級別不能比被重寫的方法更嚴格由覆蓋和重載產生的多態性物件導向三大特徵:封裝、繼承、多態多態:編譯時多態運行時多態多態參數

Static和finalstatic用static修飾的成份叫靜態成份,如靜態屬性、靜態方法、靜態類。static可以修飾屬性和方法,內部類,不能用來修飾一般的類。用static修飾的屬性成為全域變數,所有類的實例共用一個靜態屬性。用static修飾的方法不能在子類中重寫Static和final靜態成員沒有this。訪問靜態成員,可不用創建物件,直接用類名訪問。在類的方法的外部,可以定義靜態塊static{…}靜態塊常用於進行靜態屬性的初始化。靜態塊的產生,源於任何的動作陳述式必須屬於某個方法這個規定。final可以使用final來修飾類,屬性,方法。一個類用final修飾,則它不可以被繼承。一個屬性用final修飾,則它將成為一個常量。一個方法用final修飾,則它不能被重寫。抽象類別抽象方法就是不完整的方法,方法體為空。類中有抽象方法,則類必須為抽象類別用abstract修飾的類叫抽象類別如果子類沒有實現父類中的抽象方法,則子類必須也為抽象類別。一個類不能同時用abstract和final修飾。介面當一個類中所有的方法都是抽象方法時,Java將它定義為介面。<修飾符>interface<介面名稱>{[<常量聲明>][<抽象方法聲明>]}和繼承父類相似,類可以實現介面。<修飾符>class<類名>extends[<父類名>][implements<介面1>[,<介面2>]*]{類體}抽象類別和介面的多態性抽象類別和介面都支援多態性它們和類的多態性相似。內部類就是在一個類的{}中間再定義一個類,classA{classB{…}}編譯後产生A.class和A$B.class兩個類文件內部類的使用創建了內部類之後,可以在{}的內部或外部使用它注意:內部類的名稱不能和它的外部類相同內部類可以申明為abstract,並可以被其它內部類繼承。內部類可以申明為final的。內部類可以申明为private或protected非static的內部類不能申明除常量之外的靜態成員。定義在外部類方法體中的內部類稱為本地方法內部類,可以訪問外部類的其它成員,但不能訪問所在方法的區域變數。還有一種特殊的內部類,static內部類。Java檔的組織Java中用包來組織使用者的原始檔案一個Java包可以認為是硬碟上的一個資料夾.Java用package包名;來創建一個包.同一個包中的類可以互相訪問.要訪問不同包中的類,用import包名;導入要訪問的某包.包應用示例如圖所示組織Java的文件將PA1放入package1包中,將PA2放入package2包中,PA2調用PA1,testPA12調用PA1和PA2.包應用示例包應用示例packagepackage1;//***將PA1放入package1包中publicclassPA1{}packagepackage2;//***,將PA2放入與PA1不同的package2包中importpackage1.PA1;//***因為PA1,PA2不同包,PA2想使用PA1必須先導入importpackage1.PA1;//**importpackage2.PA2;//**應用升級:按照設計說明書的類圖編寫類問題陳述:某公司打算建造一幢兩層的辦公樓,並為它裝一部電梯。公司要求開發一個物件導向的類比程式,對電梯的運作進行建模,在電梯系統的類比程式裡,公司要求圖形化地顯示執行過程,在適當時刻,螢幕應顯示一個人走向電梯,按下一個按鈕,然後進入電梯,乘坐電梯,最後走出電梯。該圖形還應顯示電梯的移動、門的大開、指示燈的開和關、按下和重定按鈕式的亮暗變化。應用升級:電梯遊戲系統包含的類應用升級:實現Elevator類對於Elevator類的private屬性moving、summoned、currentFloor、capacity、和traveTime,他們的聲明代碼為:

publicclassElevator{//attributesprivatebooleanmoving;privatebooleansummoned;privateintcurrentFloor=1;privateintdestinationFloor=2;privateintcapacity=1;privateinttravelTime=5;//constructorpublicElevator(){}}Java遊戲開發(貪吃蛇、電梯模擬遊戲)

學習情境3:圖形化使用者介面設計08遊戲3-2目標和任務目標:為遊戲添加使用者介面,使用者交互任務:網上物流系統介面設計,電梯類比遊戲介面設計學習過程根据系统界面的需要,在该程序上添加其他GUI元素进行布局管理添加事件处理代码开发电梯模拟游戏界面模仿教师提供的源代码開始圖形化使用者介面(GUI)設計學習內容:GUI概述容器有容器佈局事件處理概述事件模型事件適配器常用swing組件項目:設計一個系統介面如下:項目分析可將專案分成三個模組實現:创建界面中的各个组件合理布局组件为组件添加事件处理GUI所有的GUI都可分成以上三個模組實現GUI包java.awt包,是使用Java進行GUI設計的基礎。javax.swing包,幾乎所有AWT組件對應有新功能更強的Swing組件。另外還加入了一些全新的元件。Swing元件在名稱上前面多了一個字母“J”

2、GUI的創建步驟(1)引用需要的包和類。(2)設置一個頂層的容器。(3)根據需要為容器設置佈局管理器或使用默認佈局管理器。(4)將組件添加到容器內,位置自行設計。(5)為回應事件的組件編寫事件處理代碼。容器、組件、佈局和觀感1容器和組件元件是可以用圖形化的方式顯示在螢幕上並能夠與使用者進行交互的物件。容器是一種特殊的元件,一種能夠容納其他元件或容器的元件。2.佈局管理器為了使圖形化使用者介面具有良好的平臺無關性,提供了專門用來管理元件在容器中的佈局的工具。3.觀感決定swing應用程式的外觀。常用容器JPanel組件用於將小型的羽量級元件組合在一起JPanel的缺省佈局為FlowLayoutJPanel具有下列構造函數:JPanel()JPanel(LayoutManagerlm)JApplet也是一種視窗容器,繼承自Applet類,Applet小程式是另一種Java程式,與Applet不同的是,它默認的佈局管理器是JAppletBorderLayout,而Applet默認的佈局管理器是FlowLayout。可直接向Applet視窗中添加元件,但JApplet不行,添加元件時必須添加到其內容窗格中。得到內容窗格使用方法:

getContentPane();常用組件標籤(JLabel)它既可以顯示文本也可以顯示圖像構造函數如下:JLabel(Iconicon):icon表示使用的圖示JLabel(Stringtext,Iconicon,intalign):text表示使用的字符串;icon表示使用的圖示;align表示水準對齊方式,其值可以為:LEFT、RIGHT、CENTER。其它常用方法

getText()setText(Stringtext)常用組件按鈕(JButton)可以使用以下任一構造函數來創建按鈕:JButton():新建一個空的按鈕JButton(Iconicon)JButton(Stringtext)JButton(Stringtext,Iconicon)JButtonbtnOk=newJButton("確定!");JButtonbtnCancel=newJButton("取消!");getContentPane.add(btnOk);getContentPane.add(btnCancel);常用組件常用組件常用組件文字方塊--JTextAreaJTextArea元件用於接受來自使用者的多行文本它可實現可滾動介面JTextArea元件可使用下列構造函數創建:JTextArea()JTextArea(introws,intcols)常用組件核取方塊-JCheckBox核取方塊用於為使用者提供一組選項JCheckBox類具有下列構造函數:JCheckBox()JCheckBox(Iconicon)JCheckBox(Iconicon,booleanselected)JCheckBox(Stringtext)JCheckBox(Stringtext,booleanselected)JCheckBox(Stringtext,Iconicon)JCheckBox(Stringtext,Iconicon,booleanselected)常用組件選項按鈕-JRadioButton選項按鈕允許使用者從多個選項中選擇其中一個ButtonGroup用於在Swing中創建組JRadioButton物件可使用下列構造函數創建:JRadioButton()JRadioButton(Iconicon)JRadioButton(Icon,booleanselected)JRadioButton(Stringtext)JRadioButton(Stringtext,booleanselected)JRadioButton(Stringtext,Iconicon)JRadioButton(Stringtext,Iconicon,booleanselected)常用組件常用組件常用組件常用組件對話方塊1.JOptionPane對話方塊是強制回應對話方塊,它提供了很多現成的對話方塊樣式,可以供使用者直接使用。2.JFileChooser對話方塊提供了標準的檔的打開、保存對話方塊。佈局管理器4、佈局管理器Java中的佈局類型包括以下幾種:FlowLayout(流式佈局)BorderLayout(邊界佈局)GridLayout(網格佈局)CardLayout(卡片佈局)GridBagLayout(網格包佈局)FlowLayout佈局管理器FlowLayout的構造函數有:FlowLayout():生成一個默認的流式佈局FlowLayout(intalignment):可以設定每一行元件的對齊方式FlowLayout(intalignment,inthorz,intvert):可以設定元件間的水準和垂直距離

Applet和麵板的缺省佈局,組件從左上角開始按從左到右、從上到下的方式排列BorderLayout佈局管理器下麵是BorderLayout所定義的構造函數:-BorderLayout():生成默認的邊界佈局-BorderLayout(inthorz,intvert):可以設定元件間的水準和垂直距離窗口、框架和對話方塊等的缺省佈局組件被置於容器的北、南、東、西或中間位置GridLayout佈局管理器swing佈局管理器手動佈局在某些情況下,使用者不想使用佈局管理器,需要自己設置元件的位置和大小,這時應取消容器的佈局管理器,然後再進行設置,否則用戶自訂設置將會被佈局管理器覆蓋。取消佈局管理器的方法是:

setLayout(null);

用戶使用setLocation()、setSize()、setBounds()等方法為元件設置位置和大小。需要注意的是,這種方法會導致程式與系統相關,如不同的解析度會產生不同的效果。5、事件處理模型Java最新的事件處理方法是基於授權事件模型當事件來源物件因使用者的操作(滑鼠或鍵盤),系統會自動觸發此事件類物件E,並通知所授權的事件監聽者A(若來源對象已向A註冊),事件監聽者A中有處理各種事件的方法(事件處理者1~n)便會處理此事件E的各種狀況。事件處理方法實現事件監聽器介面法:首先給元件註冊監聽器,使用下列方法:

addxxxListener(事件監聽器对象);確定了事件監聽器的類型後,必須在程式中定義類來實現這些介面,重寫介面中的所有方法。事件適配器使用實現事件監聽器介面的方法處理事件時,必須重寫監聽器介面中的所有方法,儘管有些方法不會用到。繼承事件適配器類,只需要重寫所需要的方法即可。項目核心:只包括少數組件importjavax.swing.*;importjava.awt.*;classP115extendsJFrame{JLabeljLabel;P115(){super("網上物流系統");setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);jLabel=newJLabel("請選擇貨物出發地");getContentPane().add(jLabel);pack();}publicstaticvoidmain(Stringargs[]){P115demo=newP115();}}運行結果功能擴展:包括更多組件的GUI按照創建元件,介面佈局,添加事件處理三個部分完成包括更多元件的GUI。如下圖所示:應用升級為電梯類比遊戲創建介面,如下圖:Java遊戲開發(貪吃蛇、模擬電梯遊戲)

學習情境4:塗鴉遊戲設計08遊戲3-2目標和任務目標:遊戲場景中圖形影像處理任務:塗鴉遊戲,用戶可選擇一種顏色,用滑鼠在螢幕上隨意繪畫,電梯類比遊戲的場景圖片載入學習過程項目核心:創建一個Applet容器,在其中繪圖功能擴展:使用者通過交互控制圖形繪製,圖像載入應用升級:為“電梯模擬遊戲”載入樓層,電梯井等圖像项目核心功能扩展应用升级什麼是AppletApplet的生命週期調用init()方法將Applet載入到容器調用start()方法調用paint()方法調用stop()方法調用destroy()從容器中清除Applet項目核心創建一個可以在上面用滑鼠塗鴉的Applet程式,運行情況如下://核心案例,檔案名:Scribble.java創建Applet繪圖容器1通過繼承Applet類創建Applet繪圖容器importjava.applet.*;publicclassScribbleextendsApplet{//定義成員屬性//在Applet的子類中覆蓋Applet類的init()方法}2init()是類中的方法,當applet程式首次被打開時,init()將第一個被自動執行。添加滑鼠動作監聽(1)由於要對Applet容器中發生的滑鼠按下和滑鼠拖動事件進行繪圖回應,可以直接在

init()方法中添加語句:

addMouseListener(this);addMouseMotionListener(this);(2)實現MouseListener和MouseMotionListener2個介面publicclassScribbleextendsAppletimplementsMouseListener,MouseMotionListener{//需要將2個介面中的所有方法都實現,哪怕有些方法不需要做什麼}滑鼠動作監聽介面事件類介面/抽象類別事件方法MouseEventMouseListener/MouseAdapterMouseReleased(釋放)MousePressed(按下)MouseClicked(按一下)MouseEntered(進入)MouseExited(退出)MouseMotionEventMouseMotionListenerMouseDragged(拖動滑鼠)MouseMoved(移動滑鼠)鍵盤動作監聽介面鍵盤事件類介面/抽象類別事件處理方法KeyEventKeyListener/KeyAdapterKeyReleased(釋放)KeyPressed(按下)KeyTyped(按下並釋放)功能扩展1:增加顏色窗添加一個顏色選擇視窗添加一個顏色選擇視窗paint()方法在Java中的awt包裡,Component類(構件類)中定義了一個方法:

paint(Graphicsg){}(1)參數g是一個圖形類(Graphics)物件,它由系統自動生成,不需要使用者程式來產生實體。(2)由參數g來調用Graphics類中的圖形處理方法(3)paint()方法是自動調用的,當構件首次顯示或顯示需要更新時調用。(4)如果調用repaint()方法,將導致update()方法的自動調用,update()的調用將首先用背景色清除畫面,然後調用paint()方法Graphics類輸出圖形

在paint()方法中由g來調用:1.直線的輸出:publicvoidpaint(Graphicsg){ g.drawLine(50,60,100,120); g.drawLine(30,50,30,50);}矩形的輸出1無填充的矩形:

drawRect(intx,inty,intwidth,intheight)//x,y為矩形左上角座標,width,height為矩形的寬和高2有填充的矩形

fillRect(intx,inty,intwidth,intheight)3無填充的圓角矩形

drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)//arcWidth,arcHeight為圓角弧的橫向和縱向直徑4有填充的圓角矩形

fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)draw3DRect(intx,inty,intwidth,intheight,booleanraised) //raised:true/false5有凸出/凹下的三D矩形

fill3DRect(intx,inty,intwidth,intheight,booleanraised)畫出的六種矩形橢圓的輸出畫扇形fillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)示例:publicvoidpaint(Graphicsg){ g.setColor(Color.blue); g.drawOval(20,20,60,60); g.fillOval(100,20,80,60); g.drawArc(200,20,100,60,35,65); g.drawArc(20,100,60,60,35,-140); g.fillArc(100,100,100,60,35,65); g.fillArc(200,100,60,60,35,-140); }畫出的圓和弧畫多邊形1畫無填充多邊形drawPolygon(intxPoints[],intyPoints[],intnPoints)2畫有填充多邊形fillPolygon(intxPoints[],intyPoints[],intnPoints)//nPoints:多邊形頂點的個數;xPoints,yPoints–

每個頂點的x,y座標組drawPolygon(Polygonp)3Polygon類的構造方法Polygon()Polygon(intxPoints[],intyPoints[],intnPoints)//Polygon類的方法addPoint(intx,inty),與Polygon()結合使用可畫出任意個頂點的多邊形改變繪圖顏色Color類,可以通過Color類的對象來獲取顏色。1構造方法:Color(intr,intg,intb)//r,g,b–

紅,綠,藍的色份:0–255之間取值

Color(intrgb)//rgb:3原色的混合值2.設置顏色的常用方法:方法功能setColor(Colorc) //Graghics類中定義,由g調用,設置繪畫顏色getColor()//Graghics類中定義,由g調用,返回繪畫顏色setBackground(Colorc)//Component類中定義,設置構件的顏色getBackground//Component類中定義,返回構件的顏色setForeground(Colorc)//Component類中定義,設置構件上所繪製的圖形和//文字顏色getForeground()//Component類中定義,返回構件上所繪製的圖形和文字顏色以圖形方式處理文本功能擴展2:顯示圖像(1)定義一個類ImagePanel,功能是可以在指定位置顯示指定圖片。(2)類ImagePanel是一個JPanel子類,它能夠在指定的螢幕位置顯示一個圖像。(3)可以用ImagePanel物件表示模型中的靜止物件,如電梯和兩個樓層地板。應用升級問題陳述:在電梯系統的類比程式裡,公司要求圖形化地顯示執行過程,在適當時刻,螢幕應顯示一個人走向電梯,按下一個按鈕,然後進入電梯,乘坐電梯,最後走出電梯。該圖形還應顯示電梯的移動、門的大開、指示燈的開和關、按下和重定按鈕式的亮暗變化。希望獲得的介面如下:電梯模擬遊戲場景圖Java遊戲開發(貪吃蛇、模擬電梯遊戲)

學習情境5:音樂播放機設計08遊戲3-2目標與任務

目標:為遊戲添加音效,能夠用Java載入、播放遊戲中的音效檔,並按要求控制播放。任務:用Java設計一個播放多種聲音的程式。為電梯類比遊戲添加背景音樂。學習過程項目核心功能擴展應用升級教師學生提供:聲音播放案例模仿完成:聲音播放案例提供:多個聲音列表播放關鍵代碼協作完成:多個聲音列表播放提供:電梯遊戲的聲音和介面協作完成:電梯遊戲的音效處理Java支援的音訊檔案格式AU檔案格式WAV檔案格式AIFF檔案格式MIDI檔案格式音效檔有很多格式AU音效檔WAV音效檔

副檔名為WAV,由Microsoft和IBM共同開發,Windows9X系統都支援此格式。AIFF音效檔

副檔名為AIF或IEF,是Macintosh公司和SGI公司所共用的標準音頻檔案格式。MIDI音效檔

副檔名為MID,是音樂製造業所認可的標準,主要用於控制諸如合成器和音效卡之類的設備。Java2平臺支援三種類型的MIDI檔公式,它們分別為MIDI檔案類型O、MIDI檔案類型1以及RMF。與聲音處理有關的包和類

包,為I/O、序列化和MIDI資料的合成提供介面和類。包,為新MIDI設備、MIDI檔閱讀器和編寫器等的實現提供介面。

包,為捕獲、處理和播放音訊資料提供介面和類。包,為新音訊設備、音效檔閱讀器和編寫器或音訊格式轉換提供抽象類別。與聲音處理有關的包和類在Applet類播放聲音使用play()方法裝載與播放聲音。格式如下:

1、voidplay(URLurl)

2、voidplay(URLurl,Stringname)

一旦play()方法裝載了音效檔就立即播放。如果找不到,play()方法不返回出錯資訊,反應到使用者端就是聽不到聲音。

play()方法只播放一遍音效檔重複播放聲音如果需要重複播放某個音效檔,就需要使用AudioClip介面提供的方法。AudioClip介面提供播放聲音片段的方法。多個AudioClip項可以在同一時間播放,從而產生聲音混合的效果。項目核心一個基本的使用Applet類提供的方法播放音效檔的例子,運行結果如圖所示:步驟一:創建一個Applet小程式(1)通過繼承Applet類來創建一個有三個按鈕的容器importjava.applet.*;publicclassmAudioextendsApplet{}(2)定義成員屬性包含3個成員屬性,分別表示播放的聲音的URL相對位址,當前播放的音訊流和聲音播放狀態。

步驟一:創建一個Applet小程式(3)在Applet的子類中覆蓋Applet類的init()方法init()是類中的方法,當applet程式首次被打開時,會執行此方法定義的程式碼。當applet程式首次被打開時,init()將第一個被自動執行。在其中調用getAudioClip來初始化當前要播放的音訊流:audio=getAudioClip(newURL(getDocumentBase(),hurl));步驟二:對Applet容器中的按鈕動作進行事件處理(1)為Applet容器添加按鈕動作監聽器由於要對Applet容器中發生的三種按鈕按下事件進行分別回應,可以直接在init()方法中對三個按鈕添加語句:addActionListener(this);(2)實現ActionListener介面publicclassmAudioextendsAppletimplementsActionListener{publicvoidactionPerformed(ActionEvente)

{…

}}步驟一:創建一個Applet小程式這裡需要根據事件源即按鈕的不同作出分別動作,可以通過e.getActionCommand()來判斷是哪個按鈕被按下。AudioClip類中的play,stop,loop方法分別對應播放、停止和迴圈播放功能。功能擴展在上面程式的基礎上要求增加一套按鈕用於播放另一個音樂,2個音樂可以同時播放,製造一種混音效果。運行情況如下:擴展步驟一:增加一套按鈕定義令一組成員屬性包含新的3個成員屬性,分別表示播放的第二段聲音的URL相對位址,當前播放的音訊流和聲音播放狀態。

改寫init()方法在其中調用getAudioClip來初始化另一個要播放的音訊流:Audio2=getAudioClip(newURL(getDocumentBase(),hurl2));並且添加一套新按鈕,重新佈局。擴展步驟二:對Applet容器中的按鈕重新進行事件處理為Applet容器中的新按鈕添加事件監聽器由於要對Applet容器中發生的三種按鈕按下事件進行分別回應,可以直接在init()方法中對三個按鈕添加語句:addActionListener(this);(4)實現ActionListener介面,在actionPerformed方法中對六個事件源作出相應publicclassmAudioextendsAppletimplementsActionListener{publicvoidactionPerformed(ActionEvente)

{…

}}完成情況評價標準功能擴展之案例二編寫一個applet讓用戶從幾個音訊片段中選擇來播放,程式運行畫面如下:功能擴展之案例二功能擴展之案例二//控制播放停止的按鈕

privateButtonplayClip;privateButtonloopClip;privateButtonstopClip;privateButtonstopAllClips;//跟蹤當前哪些音訊片段在播放

privateboolean[]clipsPlaying;應用升級問題陳述:在電梯系統的類比程式裡,公司要求在模擬中加入聲音。例如,當一個人走路時,應能聽到腳步聲。每當按下或者重定一個樓層按鈕或者電梯按鈕時,應當聽到按一下聲。電梯到達時鈴聲應當響起,且在門打開時或者關上時,門應當吱吱作響。最後,當電梯在樓層間運行時,應播放“電梯音樂”。應用升級解決思路:編寫類SoundEffects,將音效檔轉換成對象關鍵代碼try{returnApplet.newAudioClip(getClass().getResource(prefix+soundFile));}//returnnullifsoundFiledoesnotexistcatch(NullPointerExceptionnullPointerException){returnnull;}}應用升級應用升級(2)編寫一個類,通過播放AudioClip物件來產生聲音。(學生自主完成)

Java遊戲開發(貪吃蛇、電梯模擬遊戲)

學習情境6:小蟲動畫程式設計08遊戲3-2目標與任務學習過程項目核心功能擴展應用升級教師學生提供:繪製圖像案例模仿完成:繪製圖像案例提供:執行緒控制圖像間歇顯示協作完成:執行緒控制圖像間歇顯示成動畫提供:電梯遊戲的動畫和介面協作完成:電梯遊戲的場景動畫載入詳細步驟Java在螢幕上畫圖的方法paint,repaint,update,superpaint都可在螢幕上畫圖注意幾個方法的區別repaintsuperpaintupdatepaint幾個方法的區別

paint在當前容器中繪製圖形,要這個類中存在這個方法則自動載入。repaint重繪當前圖形,會先執行update中的方法,再執行paint中的方法。update更新當前圖形,通過repaint來調用。superpaint是隱式調用,當繼承一個容器後會自動調用此方法,用於顯示當前容器中的元件。屏外繪製緩衝器緩衝螢幕真實螢幕項目核心:屏外緩衝繪圖屏外緩衝繪圖步驟:Imagememoryimage,pic;

//1創建兩個Image對象,一個用於屏外繪圖,一個用於屏內繪圖Graphicsmemoryg;//2創建一個屏外繪圖的畫筆memoryimage=createImage(x,y);//3在記憶體中創建屏外繪圖區的大小memoryg=memoryimage.getGraphics();//4獲取屏外繪圖區的畫筆項目核心:屏外緩衝繪圖動畫和執行緒動畫是遊戲開發中常用的技術。動畫是一幀接一幀的連續播放圖像。用執行緒控制連續變化的一系列圖像間歇顯示就能形成動畫。

執行緒相關概念程式:靜態的電腦高階語言編寫的代碼。進程:程式的一次執行。執行緒:程式中的部分代碼的一次執行過程。多進程:作業系統中多個程式併發執行。多執行緒:程式中多個片斷併發執行。Java通過繼承Thread類和實現Runnable介面創建執行緒。執行緒的狀態和生命週期新建狀態就緒狀態阻塞狀態運行狀態死亡狀態執行緒的狀態和生命週期新建:新建的執行緒處於新建狀態就緒:在創建執行緒後,它將處於就緒狀態,等待start()方法被調用執行:執行緒在開始執行時進入運行狀態阻塞:在執行緒等待一個事件時(例如輸入/輸出操作),就稱其處於阻塞狀態。死亡:在run()方法已完成執行或其stop()方法被調用之後,執行緒就處於死亡狀態。執行緒的調度和優先順序Java中的執行緒優先順序是在Thread類中定義的常量NORM_PRIORITY:值為5MAX_PRIORITY:值為10MIN_PRIORITY:值為1缺省優先順序為NORM_PRIORITY有關優先順序的方法有兩個:finalvoidsetPriority(intnewp):修改執行緒的當前優先順序finalintgetPriority():返回執行緒的優先順序多執行緒的實現方法通過以下兩種方法創建Thread對象:1.聲明一個Thread類的子類,並覆蓋run()方法。

classmythreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}2.聲明一個實現Runnable介面的類,並實現run()方法。classmythreadimplementsRunnable{publicvoidrun(){/*實現該方法*/}}多執行緒的控制1.終止執行緒

stop()方法。2.測試執行緒狀態

isAlive()方法。3.執行緒的暫停和恢復

sleep()suspend()和resume()join()

stop()resume()sleep()新建狀態就緒狀態阻塞狀態運行狀態死亡狀態join()run()多執行緒的互斥有時兩個或多個執行緒可能會試圖同時訪問一個資源例如,一個執行緒可能嘗試從一個檔中讀取資料,而另一個執行緒則嘗試在同一檔中修改資料在此情況下,資料可能會變得不一致為了確保在任何時間點一個共用的資源只被一個執行緒使用,使用了“互斥”兩種方式實現互斥:使用互斥方法synchronizedvoidmethodA(){}使用互斥塊synchronized(object){ //要互斥的語句}多執行緒的同步為避免輪流檢測,Java提供了一個執行緒間通信機制,使用wait()、notify()和notifyAll()方法。這些方法僅在synchronized方法中才能被調用。wait()方法告知被調用的執行緒退出監視器並進入等候狀態,直到其他執行緒進入相同的監視器並調用notify()方法。執行緒的鎖死當兩個執行緒迴圈依賴於一對同步物件時將發生鎖死。例如:一個執行緒進入物件ObjA上的監視器,而另一個執行緒進入對象ObjB上的監視器。如果ObjA中的執行緒試圖調用ObjB上的任何synchronized方法,就將發生鎖死。鎖死很少發生,但一旦發生就很難調試使用執行緒來創建動畫一幀就是指動畫中的一幅圖像動畫就是由一定時間間隔播放的幀圖像構成的。幀更換的速度直接影響動畫的效果幀速與進程調度間的關係。通過屏外緩衝方式,利用執行緒間隔顯示連續變化的圖像,形成動畫,程式運行結果如圖所示。用執行緒實現圖形的間歇顯示例二程式運行結果如圖所示,螢幕中有一個移動的方塊,當它與其它方塊重合(遊戲中叫碰撞)時,會用不同的顏色顯示重合部分Java動畫中消除屏閃的兩招(1)通過覆蓋update(Graphicsg)來消除閃爍在動畫的實現中,經常用到repaint()函數來重畫螢幕,實現動畫的載入,其實在java中repaint()是通過兩個步驟來實現刷新功能的,首先它調用publicvoidupdate()來刷新螢幕,其次再調用paint(Graphcisg)來重畫螢幕,這就容易造成閃爍,特別是一些需要重畫背景的程式,如果下一楨圖像可以完全覆蓋上一楨圖像的話,便可以重寫update函數如下來消除閃爍:(2)通過雙緩存消除閃爍為了防止螢幕重畫出現的閃爍,先創建一個屏外繪圖區,重畫完畢,直接將成品再繪製到小程式螢幕上去。offScreenImage=createImage(w,h);//創建屏外繪圖區

offScreen=offScreenImage.getGraphics();//取得繪圖環境應用升級:為“電梯模擬遊戲”添加人行走,電梯運行的動畫

電梯模擬遊戲中,人走向、離開電梯;電梯開、關門;燈閃爍;電梯上、下運行;都是動畫,它們只在遊戲劇情需要時才播放,我們將使用多執行緒和synchronized方法,保證這些動畫符合遊戲規定的邏輯正確播放。應用升級:為“電梯模擬遊戲”添加人走進電梯,電梯運行的動畫(事件處理方法之一)

publicvoidpersonEntered(PersonMoveEventpersonEvent){//findPanelassociatedwithPersonthatissuedeventAnimatedPanelpanel=getPersonPanel(personEvent);if(panel!=null){//determinevelocitydoubletime=TIME_TO_ELEVATOR/ANIMATION_DELAY;doubledistance=elevatorPanel.getPosition().getX()-panel.getPosition().getX()+2*OFFSET;panel.setVelocity(distance/time,-1.5);//Personstartswalkingpanel.setMoving(true);panel.playAnimation(0);panel.setLoop(true);}}//endmethodpersonEntered應用升級:為“電梯模擬遊戲”

添加電梯關門的動畫

//invokedwhenDoorhasclosedinmodelpublicvoiddoorClosed(DoorEventdoorEvent){//getDoorEventLocationStringlocation=doorEvent.getLocation().getLocationName();//playanimationofDoorclosingdoorPanel.playAnimation(1);doorPanel.setAnimationRate(2);doorPanel.setDisplayLastFrame(true);//playsoundclipofDoorclosingif(doorCloseClip!=null)doorCloseClip.play();}//endmethoddoorClosed應用升級:為“電梯模擬遊戲”

添加按鈕被按下的動畫

//invokedwhenButtonhasbeenpressedinmodelpublicvoidbuttonPressed(ButtonEventbuttonEvent){//getButtonEventLocationStringlocation=buttonEvent.getLocation().getLocationName();//pressElevatorButtoniffromElevatorif(location.equals(ELEVATOR_NAME)){elevatorButtonPanel.playAnimation(0);elevatorButtonPanel.setDisplayLastFrame(true);}課後創新作業。自主設計一個程式實現:顯示向左滾動的字幕。前一幀後一幀Java遊戲開發(貪吃蛇、電梯模擬遊戲)

學習情境7:網路對弈程式08遊戲3-2目標與任務目標:為遊戲添加網路通信功能和遊戲邏輯,利用Socket進行網路通信,C/S架構伺服器端和用戶端編寫,B/S架構實現。任務:開發網路對弈程式目的程式完成專案開發:程式運行時,有兩個用戶端通過網路進行對奕。學習過程網路通信基礎網路通信就是通過某種方法讓一台電腦與其它電腦交換資料。通信就是給其它電腦傳資料,或者接收其它電腦發來的資料。對網路的任何形式的訪問最後都歸結為從網卡接收資料或向網卡傳送資料。網路通信解決兩個問題:(1)如何識別不同的電腦。(2)如何傳送資料。網路通信問題網路中的兩台電腦靠協定進行通信網路中用IP標識不同的通信實體IP:10IP:08httpftpmail網路通訊協定在兩台電腦間傳送資料時,傳送或接收資料的先後順序,資料的格式等內容的約定構成通信的協議。Internet網的資料傳送有很多協定,如TCP/IP,UDP,FTP等,協定不同,具體到網路通信程式,接收和發送資料部分的代碼會有不同。本次的例子都是採用TCP/IP協議。用IP識別網路中的電腦網路上不同的電腦用IP來標識。實際上一個IP對應一張網卡。如果一台電腦上有多張網卡,那麼就需要多個IP來標識每一張網卡。每個網卡有多個埠,供應用程式採用不同的通信協定傳輸資料。每種協定都採用不同的埠號,埠號可以設置,如設置某網卡用8080號埠進行TCP/IP協定方式的資料傳輸。網路程式的架構一般網路上程式都是一個伺服器,一個用戶端,這種程式的總體結構叫架構,如上圖所示這種總體結構叫C/S架構(即客戶/伺服器)架構。C/S架構中,提出資料訪問要求的程式叫用戶端,被提出資料訪問要求的程式叫伺服器端。一個用戶端可能是一台配置很高的電腦,一個伺服器端可能只是一台普通電腦。用戶端和伺服器端可以是同一台電腦。CSCSCS網路程式設計工具網路很普遍,所以,幾乎所有的程式設計語言都提供網路程式設計的元件。Java提供Socket元件供網路程式設計使用。Socket是一個類。在用Java進行網路程式設計時,只需使用Socket的有關方法,按照一定步驟編寫出接收資料,處理資料,或處理資料,發送資料的代碼即可。JavaSocket程式設計Socket程式設計步驟Java提供了對TCP通訊端的良好的支持,有兩種通訊端類:;;當編寫連接到已有服務的用戶端軟體的時候使用Socket類。當編寫綁定到本地埠以提供服務的伺服器軟體的時候使用ServerSocket類。這是與DatagramSocket的UDP工作方式不同的地方--在TCP中,連接伺服器地和從用戶端接收資料的函數被分為兩個獨立的類。Socket程式設計步驟Java中Socket可以理解為用戶端或者伺服器端的一個特殊的物件,這個物件有兩個關鍵的方法,一個是getInputStream方法,另一個是getOutputStream方法。getInputStream方法可以得到一個輸入流,用戶端的Socket對象上的getInputStream方法得到的輸入流其實就是從伺服器端發回的資料流程。GetOutputStream方法得到一個輸出流,用戶端Socket對象上的getOutputStream方法返回的輸出流就是將要發送到伺服器端的資料流程,(其實是一個緩衝區,暫時存儲將要發送過去的資料)。Socket程式設計步驟要完成這個工作,需要完成三個部分的工作,以下依次說明:

1、建立伺服器類

2、建立用戶端代碼

3、建立使用者介面1、建立伺服器類創建伺服器物件:ServerSocketserver=newServerSocket(9998)建立一個Socket連接:Socketincoming=server.accept()輸入流和輸出流:BufferedReaderin=newBufferedReader(newInputStreamReader(incoming.getInputStream()));

PrintWriterout=newPrintWriter(incoming.getOutputStream(),true);

隨後,就可以使用in.readLine()方法得到用戶端的輸入,也可以使用out.println()方法向用戶端發送資料。關閉這兩個資料流程

out.close();in.close();2、建立用戶端代碼創建一個Socket對象:Socketsocket=newSocket("2",9998);資料的輸入和輸出in=newBufferedReader(newInputStreamReader(socket.getInputStream()));

out=newPrintWriter(socket.getOutputStream(),true);客戶機/伺服器的典型通信過程:

1、伺服器監聽相應埠的輸入;

2、客戶機發出一個請求;

3、伺服器接收到此請求;

4、伺服器處理這個請求,並把結果返回給客戶機;

5、重複上述過程,直至完成一次會話過程。服務方:importjava.io.*;import.*;publicclassMyServer{

publicstaticvoidmain(String[]args)throwsIOException{

ServerSocketserver=newServerSocket(5678);

Socketclient=server.accept();

BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));

PrintWriterout=newPrintWriter(client.getOutputStream());

while(true){

Stringstr=in.readLine();

System.out.println(str);

out.println("hasreceive....");out.flush();

if(str.equals("end"))

break;

}client.close();

}}這個程式的主要目的在於伺服器不斷接收客戶機所寫入的資訊只到,客戶機發送"End"字串就退出程式,並且伺服器也會做出"Receive"為回應,告知客戶機已接收到消息。客戶機代码:import.*;importjava.io.*;publicclassClient{

staticSocket

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论