期刊VIP學(xué)術(shù)指導(dǎo) 符合學(xué)術(shù)規(guī)范和道德
保障品質(zhì) 保證專業(yè),沒有后顧之憂
來源:期刊VIP網(wǎng)所屬分類:計(jì)算機(jī)應(yīng)用時(shí)間:瀏覽:次
Java3D是由SUN公司在1998年年底正式推出的交互式三維圖形應(yīng)用編程接口。它的思想來源于現(xiàn)存的各種圖形API及多種新技術(shù),它包含了實(shí)現(xiàn)三維交互真實(shí)感圖形的基本類和接口,用于實(shí)現(xiàn)三維動(dòng)畫的生成及多媒體程序和交互程序的編寫,是Java語(yǔ)言在三維領(lǐng)域的擴(kuò)展。
近幾年來,3D硬件繪圖技術(shù)的突破,使得實(shí)時(shí)描繪的畫面越來越精致,3D游戲更多元化,更逼近真實(shí)世界,因此在游戲產(chǎn)業(yè)中,3D游戲已經(jīng)逐漸取代2D游戲而成為游戲市場(chǎng)的主流,即使是網(wǎng)絡(luò)游戲,也慢慢趨向3D化。雖然開發(fā)3D游戲存在著諸如技術(shù)更新快、程序人員與美工的配合要求高、各廠商所生產(chǎn)的3D硬件規(guī)格和特性不同、失敗率高等問題,但不可否認(rèn),3D游戲己是大勢(shì)所趨。目前Java3D在游戲開發(fā)領(lǐng)域已經(jīng)占到了重要的地位,可應(yīng)用在三維動(dòng)畫、三維游戲、機(jī)械CAD等多個(gè)領(lǐng)域,在許多情況下已成為游戲開發(fā)者的首選。Java3D也是目前在Interact上實(shí)現(xiàn)三維動(dòng)畫的主要手段之一。
Java3D是建立在Java2基礎(chǔ)之上的,Java語(yǔ)言的簡(jiǎn)單性使Java3D的推廣有了可能。Java3D給我們編寫三維應(yīng)用程序提供了一個(gè)非常完善的API,它可以幫助我們生成簡(jiǎn)單或復(fù)雜的形體。因此,利用Java3D設(shè)計(jì)一個(gè)具有互動(dòng)性的坦克射擊游戲,對(duì)于三維技術(shù)的探索和研究,具有實(shí)際意義。
1、Java3D介紹
利用Java3D提供的API,可以編寫出基于網(wǎng)頁(yè)的三維動(dòng)畫、各種計(jì)算機(jī)輔助教學(xué)軟件和三維游戲等等。Java3D的這種體系結(jié)構(gòu)既可以使其開發(fā)的程序“到處運(yùn)行”,又使其能充分利用系統(tǒng)的三維特性。
Java3D的數(shù)據(jù)結(jié)構(gòu)采用Scene Graphs Structure,這種靈活的樹狀結(jié)構(gòu)與顯示列表多少有些相似之處,但更具有健壯性。Java3D的場(chǎng)景圖由Java3D在計(jì)算機(jī)上顯示出三維效果,顯示內(nèi)存不斷接受JavaSD運(yùn)行的最新結(jié)果并直接顯示出來,從而產(chǎn)生三維動(dòng)畫效果。
2、系統(tǒng)的設(shè)計(jì)與分析
2.1基本形體的生成
Java3D編程過程中,三維形體是重要的處理對(duì)象??梢杂脙煞N方式生成Java3D所需要的三維形體:一是利用Java3D提供的用于編寫點(diǎn)、線、面的類生成點(diǎn)、線、面對(duì)象;二是通過調(diào)用外部其他格式的三維圖形文件,生成復(fù)雜的三維形體對(duì)象。
(1)面的生成
Java3D的點(diǎn)、線、面時(shí),需要給出頂點(diǎn)坐標(biāo)數(shù)組、頂點(diǎn)坐標(biāo)對(duì)應(yīng)的顏色數(shù)組等內(nèi)容。輸入這些內(nèi)容需要用到GeometryArray提供的多個(gè)方法,因?yàn)樗械狞c(diǎn)、線、面類都是GeometryArray的子類或?qū)O類,因而都繼承了它所有的方法。Java3D程序中的面有多個(gè)屬性,可通過PolygonAttributes對(duì)象設(shè)定具體的屬性。
Java3D可以通過變換生成三角形和四邊形的面,Tiangle為三角形面,Quad為四邊形面。
(2)形體組合編程
Java3D應(yīng)用程序中,一般都擁有多個(gè)三維形體,需要對(duì)其進(jìn)行合理的組合,這樣才能對(duì)指定的形體進(jìn)行幾何變換,對(duì)指定的形體進(jìn)行某種操作,生成所需要的交互式三維應(yīng)用程序或三維動(dòng)畫。
Java3D為此提供了多個(gè)用于形體組合的對(duì)象。組合各種對(duì)象所用的是Group及其子孫類。
Java3D場(chǎng)景圖的底部為Virtual Universe。每一個(gè)場(chǎng)景圖只能有一個(gè)VirtuaUniverse,上面為L(zhǎng)ocale。
Group類型對(duì)象只能有一個(gè)父類,對(duì)于BranchGroup對(duì)象來說是Locale。而其他的Group類型的對(duì)象,則可以將其他Group類型的對(duì)象做為父類。如TransformGroup對(duì)象可以將Group對(duì)象做為父類,也可以將另一個(gè)TransformGroup對(duì)象做為父類。Group類型的對(duì)象可以有任意多的子類。
2.2鍵盤輸入控制
Java通過一系列的監(jiān)聽器(listener)方法提供一種與用戶交互的方式。向Java輸入想要監(jiān)聽鍵盤輸入事件的指令,Java會(huì)把鍵盤事件發(fā)送給監(jiān)聽器方法,此時(shí),可以檢查按碼來判斷是哪個(gè)鍵被按下或者釋放。Java通知程序某一個(gè)按鍵被按下的方法是通過程序所使用的接口實(shí)現(xiàn)的。
KeyListener接口監(jiān)聽鍵盤事件,并且把事件發(fā)送給程序中所實(shí)現(xiàn)的回調(diào)方法(callback method)。這些方法叫做keyPressed、keyRelesed和keyTyped,他們都只有一個(gè)名為KeyEvent的參數(shù)。
編寫一個(gè)使用KeyListener的程序時(shí),需要使用implements關(guān)鍵字來修改程序的類定義:
pubHc class KeyboardTest extends Applet implementsKeyListener。
2.3實(shí)體元素的碰撞檢測(cè)
本游戲中有坦克與坦克之間的碰撞檢測(cè),坦克與障礙物之間的碰撞檢測(cè),炮彈與坦克之間的碰撞檢測(cè),炮彈與障礙物之間的碰撞檢測(cè)。
當(dāng)坦克碰到障礙物或其他坦克時(shí)將不能再繼續(xù)往前移動(dòng);當(dāng)炮彈打中障礙物時(shí)炮彈爆炸,障礙物不損;當(dāng)主體坦克炮彈打中敵對(duì)坦克時(shí),敵對(duì)坦克爆炸且ENEMY數(shù)量減少1格;當(dāng)敵對(duì)坦克炮彈打中主體坦克時(shí),主體坦克ENERGY減少1格。
當(dāng)主體坦克發(fā)出子彈打中敵對(duì)坦克或障礙物,發(fā)生碰撞沖突時(shí),播放聲音效果co1lide.au。其主要代碼為:
fCollldeSnd=getAudioClip(getCodeBase(),〝collide.au〞):
若打中的是敵對(duì)坦克,敵對(duì)坦克發(fā)生爆炸,還會(huì)播放聲音效果explode.au。其主要代碼為:
fExplodeSnd=getAudioClip(getCodeBase(),〝explode.au〞):
當(dāng)主體坦克與敵對(duì)坦克或障礙物發(fā)生碰撞沖突時(shí),播放聲音效果veollide.au。其主要代碼為:
fViewerCollisionSnd=getAudioClip(getCodeBase(),〝vcollide.au〞):
3、結(jié)束語(yǔ)
本文結(jié)合了Java3D的特點(diǎn),利用Java3D設(shè)計(jì)了一個(gè)坦克射擊游戲,對(duì)Java3D的系統(tǒng)結(jié)構(gòu)和開發(fā)本游戲所涉及到的關(guān)鍵技術(shù)作了詳細(xì)的介紹,確定了游戲需要實(shí)現(xiàn)的總體功能,論述了實(shí)現(xiàn)方法。該游戲的設(shè)計(jì)方案可供3D游戲的開發(fā)者參考。