謝云山
(湖南科技學院 電子與信息工程學院, 湖南 永州 425199)
最近幾年,移動通信和互聯網成為當今世界發展最快、市場潛力最大、前景最誘人的兩大業務。它們的增長速度是任何預測家都未曾預料到的。迄今,全球移動用戶已超過15億,互聯網用戶也已逾7億,中國移動通信用戶總數超過3.6億,互聯網用戶總數則超過1億。移動互聯網正逐漸滲透到人們生活、工作的各個領域。據ComScore對蘋果應用軟件店(Apple APP Store)一份全面的研究報告中顯示,人們在iPhone和iPod touch上使用最多的軟件是游戲。其中,游戲軟件中70%~75%為3D游戲軟件。
20世紀60年代,戰爭的硝煙在整個歐洲大陸上彌漫,盟軍在大陸上的作戰陷入了焦灼狀態。為了牽制敵軍的行動并最終取得決定性的勝利,玩家的使命就是:盡最大可能消耗敵人的入侵部隊,阻止敵人的進攻。面對灘頭上潮水一般涌來的敵人,唯一能依靠的就只有身后那門威力無比強大的海防炮臺。
搶灘登錄游戲的操作很簡單,運用上下左右鍵調整大炮的方位和角度,瞄準敵方坦克,按下空格鍵就可以發射炮彈來打擊敵軍。啟動游戲后首先進入的是游戲的圖標灰度漸變界面;之后自動進入到Logo灰度漸變界面;然后自動進入游戲聲音設置界面,單擊“是”,則開啟游戲聲音;單擊“否”,則關閉游戲聲音;聲音設置完畢后,自動切換到游戲開始菜單界面;單擊“游戲幫助”,則進入游戲幫助界面;單擊“關于游戲”,則進入游戲關于界面;單擊“游戲退出”,則退出游戲;當游戲結束后,則進入游戲結束界面;當進入游戲時,會有視角旋轉來讓玩家瀏覽場景;接著旋轉視角,場景中還有堅固的炮臺和威武的大炮,在鎮守著海濱要塞;游戲中水上坦克將會逐漸駛向陸地,當其登錄后,則會由陸地坦克進行登陸作戰;進行游戲時玩家可以用上下左右鍵來控制大炮的轟擊方向和位置,按下空格鍵發射炮彈;如果玩家轟擊陸地,則播放爆炸效果動畫;若玩家發射炮彈擊中陸地坦克,則播放爆炸效果動畫并擊毀坦克,同時會有新的敵軍來進攻,并且游戲左上角擊中坦克計數加1;若玩家發射炮彈擊中水上坦克,則播放爆炸效果動畫并擊毀坦克;如果玩家轟擊水面,則播放爆炸效果動畫。
隨著網絡的不斷發展,戰爭類游戲越來越受到玩家的喜愛,可以單機對戰,可以聯網對戰,驚險刺激,驚心動魄?!稉尀┑顷憽纷鳛橐豢顟馉庮惿鋼粲螒?,模擬了登陸戰爭中激烈的戰爭場面。只要帶著手機,玩家便可以隨時隨地進入虛擬戰爭世界,享受轟擊敵軍帶來的游戲快感,滿足玩家對游戲娛樂性的要求。
程序中的公司界面、Logo界面、開始菜單界面、聲音設置界面、幫助界面、關于界面及結束界面均用2D技術實現。以上界面大部分繼承和擴展自SurfacView并重寫了其中的onDraw方法,并且所有的按鈕均是筆者用貼圖實現的,避免了使用Android自帶控件,使游戲畫面更加絢麗、個性。
游戲時的界面使用3D技術實現,游戲界面繼承和擴展了GLSurfaceView并實現了Renderer接口,通過重寫onKeyDown方法實現與用戶的交互。
游戲開始菜單是游戲的一個重要界面,當一開始進入游戲設置完音樂后,就會進入這個界面。下面闡述一種橫屏模式下帶有滾動效果的菜單界面。開始菜單SurfaceViewMenu.java類是本設計最主要的類之一,其實現比較復雜。
(1)onDraw繪制方法,用于繪制位圖。
@Override
public void onDraw(Canvas canvas){……}
(2)初始化菜單的方法,初始化當前及靠其左右的菜單項的位置大小參數。
public void initMenu(){……}
游戲菜單界面的實現,難點在ThreadMenu.java方法。該方法是用于控制菜單拖動的動畫效果的線程,在特定的時間間隔后就會調用一次repaint方法對菜單界面進行重繪。Repaint方法的主要作用是重繪,其中調用了onDraw方法。
游戲中山地、海洋、坦克、大炮、炮彈、炮臺、月球、星空及燈塔的創建基礎均是根據圓面、圓柱體、圓錐體、長方體、球體中的一個或者幾個拼接而成的。關于地圖的生成,水面的實現方法,是分別運用了山地生成技術和飄揚的旗幟技術來完成實現的。山地生成中為了使場景更加真實,在生成山地時做了一定的改動。對于場景中的拼裝物體,如大炮、坦克、炮臺和燈塔,實現方法都比較相似。
關于在場景中物體的運動,包括水上坦克的運動、陸地坦克的運動,以及炮彈的運動,還有光源的旋轉、攝像機的旋轉、月球的旋轉,以及星空的旋轉。由于物體的運動實現是有些相似的,所以,我們以炮彈的運動和月球的旋轉運動為例來闡述物體運動的實現。
在實現炮彈的運動中,因為炮彈同一時間存在的數量可以很多,所以將場景中存在的炮彈放在一個炮彈列表中,當需要繪制場景時從列表中逐個掃描炮彈,并用一個邏輯類LogicalBullet.java來控制當前掃描到的炮彈的位置、速度的大小和方向并檢測是否發生碰撞,若碰撞則發生爆炸并播放爆炸動畫,若沒有碰撞則引用DrawBall實例來繪制炮彈。
4.5.1 公共類
主類Activity_GL_Demo.java通過繼承和擴展基類Activity來實現的,是整個應用程序的入口。主要根據收到的Handler消息的不同切換到不同的界面,并且控制聲音播放和場景渲染的暫停和恢復。常量Constant.java類記錄程序中所有類需要用到的常量,便于以后的修改。
4.5.2 2D界面類
圖標漸變界面 Surfac洳ewTag.java類,該類用于公司圖標等的漸變實現。聲音設置界面SurfaceViewSound.java類,該類是聲音設置界面的實現類,主要負責聲音設置界面的繪制,控制游戲中聲音的開關。開始菜單界面SurfaceViewMenu.java類,這個類是開始菜單界面的實現類,實現開始菜單界面的繪制,是連接整個程序中各類的一個集中地,能根據單擊不同的菜單向Activity_GL_Demo.java發送不同的Handler消息。幫助界面SurfaceViewHelp.java類,游戲幫助界面由這個類實現,用來繪制游戲幫助界面,以顯示游戲的規則、操作等信息。關于界面SurfaceViewAbout.java類,該類是游戲關于界面的實現類,主要負責游戲關于界面的繪制,顯示游戲相關信息。游戲結束界面SurfaceViewOver.java類,該類是游戲結束界面的實現類,繪制游戲結束界面,顯示玩家的得分情況和提供再玩一次的功能。
運用高等數學中的向量理論,運用向量知識解決場景中的碰撞問題,主要包括炮彈與山地的碰撞,陸地坦克與山地的碰撞,陸地坦克與海面的碰撞,以及水上坦克與陸地的碰撞。進行炮彈與山地碰撞檢測的最終目的是為了判斷炮彈在何時爆炸,已知炮彈的實時位置和速度。思路如下。矩形為陸地平面上的一個網格,因為整個地圖都是由類似的這些生成三角形拼接而成的,只是陸地平面中的網格是按像素來劃分的,人眼很難辨別,所以看上去像是真實的山地地圖場景,所以在此我們將以拼接三角形來闡述炮彈的碰撞檢測。
對于炮彈碰撞山地的檢測。確定炮彈所在位置對應的陸地平面的行、列。求出炮彈所對應的平面位置所對應的場景中山地的高度。比較炮彈當前位置和對應山地高度的大小。如果炮彈當前位置高于對應山地的高度,則沒有碰撞,炮彈繼續運動;否則,發生碰撞。
基本算法思想:首先分別求出0號點到1,2號點的矢量,然后由兩個矢量求叉積,得到三角形平面的法矢量(B,C),接著通過法矢量和o號點坐標可以寫出三角形平面的方程A(x-xo)+B(Y-Yo)+C(z-zo)=0,然后可以推導出在xz平面上的點對應點的y坐標的求值公式y=(C(zo-z)+A(xo-x)/B+Yo,最后通過該求值公式求出指定xz平面上的點對應的地圖上點的y的值。
在本游戲中,關于陸地坦克與山地的碰撞檢測、陸地坦克與水面的碰撞檢測,以及水上坦克與陸地的碰撞檢測的方法和炮彈與山地的碰撞檢測相似。
如果能在游戲的最后加上游戲成績的存儲與排行,會大大提高玩家對本游戲的體驗。另外,游戲應該開發成多種模式,不同的模式帶來不一樣的體驗,單一的模式會讓游戲很快失去對玩家的吸引力。同時應該添加游戲難度的選擇功能,使玩家根據自己的情況選擇不同的等級進行游戲,這樣才更加合理。
[參考文獻]
[1]吳亞峰,于復興.Android 3D游戲開發技術詳解與典型案例[M].北京:人們郵電出版社,2012.
[2]謝明山,鄧艷芳.Android環境下開發五子棋游戲關鍵技術研究[J].電子世界,2014(14):390.
[3]于寶華,賈于博,谷蘇港.基于Android的高校學生畢業設計管理系統設計[J].福建電腦,2017(12):390.