桌面彈球是游戲中常見的游戲,從以前的掌上游戲機到如今的手機游戲,都是一個十分經典的游戲。玩家控制一個可以左右移動的擋板去改變運動中小球的移動方向,目的是用小球消除游戲屏幕中的所有 磚塊 , 不同顏色的磚塊有著不一樣的效果, 例如: 黃色磚塊五魔法效果 、 粉色的磚塊彈球可以穿越 , 咖啡色的磚塊可以使小球加速,綠色的磚塊可以使小球發色子彈 等等。本 節 主要介紹如何實現一個簡單的彈球游戲,讓讀者了解“動畫”的實現原理。
其實所謂的動畫就是一張一張圖片的不斷演示,讓人看上去有動感,最后 使用 Java 中的 雙緩沖 去重復繪圖, 防止游戲的屏幕閃爍 , 我開發的 桌面彈球游戲的效果如圖所示 :
一、 動畫原理
簡單地來說,動畫是利用人的視覺暫留的生理特性,實現出來的一種假象,只要每隔一段時間(這個時間少于人的視頻暫留時間)就重新繪制一幅狀態改變的圖片,就能造成這種“動”的假象。我們在程序中不斷的進行 擦除,然后不斷的畫出新的圖片 ,對程序來講,只需要在短時間內進行多次的繪畫,并且每次繪畫都需要改變繪畫的相關值,就可以達到“動畫”的效果。
二、 彈球游戲開發
在做游戲前,得先實現一個主界面,然后往界面上添加各種物件以及圖片。在這個游戲的開發中,我們有 6 個類( BallUI?? 主界面, Ball??? 彈球類, MapUI?? 地圖類, Stick??? 擋板類, Shot??? 子彈類, Magic?? 魔法類),這些類實現不同的效果,使彈球游戲玩的更有意思。在下面將介紹主要的幾個類
三、 Ball 彈球類
這個類是一個線程,當游戲啟動的時候,界面中會出現一個小球,點開始按鈕后,線程啟動,小球開始運動,其中小球的速度是線程的 sleep 時間和小球在界面中位置的改變這兩個因素決定的。實現小球的動其實很簡單,看下代碼就知道:
// 先擦除,把顏色設為背景色(黑色)
g .setColor(Color. BLACK );
g .fillRect( x0 ,? y0 ,?15,?15);
// 再在下一刻畫出小球(白色),假設坐標都加 1
g .setColor(Color. WHITE );
g .fillRect( x0 +1 ,? y0 +1 ,?15,?15);
然后這個處理很多主要的操作:
1. 游戲輸贏的操作。當小球移動時,用擋板來實現小球的反彈,但當沒接住的時候,小球會往下掉,這時就會判游戲結束。如圖:
<!--EndFragment-->
判斷游戲是否勝利,只有把所有的磚塊都打掉,這時彈出對話框,顯示你已經勝利,如圖:
?
1. 這個類最主要的任務是來判斷小球與磚塊的碰撞、與墻壁的碰撞以及與擋板的碰撞。當碰撞時,用不同的方法來處理小球下一時刻的運動,也就是說,當小球碰到擋板時要反彈,碰到墻壁時也要反彈,這些都還好處理;但是當小球碰到不同磚塊時候,要產生不同的效果,這是游戲比較難的地方,不同的效果調用的方法也就不同。
四、 MapUI 地圖類
這個類是來創建地圖,在文檔存儲了一份文件,是對這個地圖的解釋,當調用這份文件的時候,地圖自動會在界面中創建。
由于涉及到文件,那么不可避免的要使用文件輸入流,創建文件輸入流的對象去讀取文件,把讀到的內容用一個 char 二維數組存儲起來,然后再主界面中調用這個類,實現二維數組轉換成地圖的方法,這樣地圖就形成了。
五、 主界面 BallUI
這個類是去調用所用的類,從而實現彈球游戲。啟動不同的線程,使小球的運動形式不一樣以及游戲的可玩性得到提高。在調用線程后,當游戲結束時,記得關閉所有線程,不然浪費 CPU 資源。
最后我想談的是雙緩沖處理屏幕的閃爍問題,在游戲的開發中,讓我頭疼的就是屏幕的閃爍,不僅看的不爽,且對眼睛的傷害也是極大的。這里我們有三個主要的實物(小球、磚塊、擋板),我們分別對這些物體進行重繪,從而解決閃屏的問題。看如下代碼:
public ? void ?paint(Graphics?g){
//?在重繪函數中實現雙緩沖機制?
offSreenImage ?= this .createImage(500,490);
//?獲得截取圖片的畫布?
Graphics?gImage= offSreenImage .getGraphics();
// System.out.println(gImage.getColor());
//?獲取畫布的底色并且使用這種顏色填充畫布,如果沒有填充效果的畫,則會出現拖動的效果?
gImage.setColor(gImage.getColor());
? //?有清楚上一步圖像的功能,
gImage.fillRect(0,?0,?500,?490);
//?調用父類的重繪方法,傳入的是截取圖片上的畫布,防止再從最底層來重繪
super .paint(gImage);
//重繪地圖,也即是重繪磚塊
for ( int ?i=0;i< chars . length ;i++){
for ( int ?j=0;j< chars [i]. length ;j++){
if ( chars [i][j]!=0){
char ?c?=? chars [i][j];
if (c!= '?' ){
String?path?=? "images/" +c+ ".jpg" ;
//根據路徑構造圖片對象
ImageIcon ? icon?=?MapUI. createImageIcon (path);
gImage.drawImage(icon.getImage(),?35*j,?15*i,? null );
}
}
}
}
//擋板的重繪
Stick?stick?= new ?Stick();
int ?x=Stick. x0 ;
gImage.setColor(Color. red );
stick.createStick(gImage,?x-2-1,460-2-2-1-2-2,?100,?15);
//小球的重繪
Ball?ball= new ?Ball();
ball.createBall(gImage,?Ball. x0 ,?Ball. y0 );
//?將接下來的圖片加載到窗體畫布上去,才能得到每次畫的效果?
g.drawImage( offSreenImage ,?0,?0,? null );
}
最后,由于本人知識的不足,游戲中還存在很多問題,且游戲的效果也不是特別的好,游戲的可玩性不高。但總體來說,這次游戲的開發讓我的編程能力得到提升,同時也能處理一些簡單的問題。
<!--EndFragment--><!--EndFragment-->
<!--EndFragment-->
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
