13.4-全棧Java筆記:打飛機游戲?qū)崙?zhàn)項目|offScreenImage|GameObject|Plane

雙緩沖技術(shù)解決閃爍問題

上節(jié),我們實現(xiàn)了動畫效果惠呼,但是發(fā)現(xiàn)窗口會不停的閃爍,體驗度非常差峦耘。在實際開發(fā)中剔蹋,繪制圖形是非常復(fù)雜的,繪圖可能需要幾秒甚至更長時間辅髓,也經(jīng)常發(fā)生閃爍現(xiàn)象泣崩, 為了解決這個問題,我們通常使用“雙緩沖技術(shù)”洛口。

1)“雙緩沖技術(shù)”的繪圖過程如下:

a. 在內(nèi)存中創(chuàng)建與畫布一致的緩沖區(qū)

b.?在緩沖區(qū)畫圖

c. 將緩沖區(qū)位圖拷貝到當前畫布上

e. 釋放內(nèi)存緩沖區(qū)

雙緩沖即在內(nèi)存中創(chuàng)建一個與屏幕繪圖區(qū)域一致的對象矫付,先將圖形繪制到內(nèi)存中的這個對象上,再一次性將這個對象上的圖形拷貝到屏幕上第焰,這樣能大大加快繪圖的速度买优。

我們只需將如下“雙緩沖”實現(xiàn)代碼,放入MyGrameFrame類中,即可:

【示例1】添加雙緩沖技術(shù)

privateImageoffScreenImage=null;

publicvoidupdate(Graphics g) {

if(offScreenImage==null)

offScreenImage=this.createImage(500,500);//這是游戲窗口的寬度和高度

Graphics gOff =offScreenImage.getGraphics();

paint(gOff);

g.drawImage(offScreenImage, 0, 0,null);

}

GameObject類設(shè)計

1) GameObject類的定義

我們發(fā)現(xiàn)杀赢,窗口中所有的對象(飛機烘跺、炮彈等等)都有很多共性:“圖片對象、坐標位置葵陵、運行速度液荸、寬度和高度”。為了方便程序開發(fā)脱篙,我們需要設(shè)計一個GameObject類娇钱,它可以作為所有游戲物體的父類,方便我們編程绊困。

【示例2】GameObject類

packagecn.sxt.game;

importjava.awt.Graphics;

importjava.awt.Image;

importjava.awt.Rectangle;

publicclassGameObject {

Imageimg;//該物體對應(yīng)的圖片對象

doublex,y;//該物體的坐標

intspeed;//該物體的運行速度

intwidth,height;//該物體所在矩形區(qū)域的寬度和高度

/**

*怎么樣繪制本對象

*@paramg

*/

publicvoiddrawMySelf(Graphics? g){

g.drawImage(img, (int)x, (int)y,null);

}

publicGameObject(Image img,doublex,doubley) {

this.img= img;

this.x= x;

this.y= y;

if(img!=null){

this.width= img.getWidth(null);

this.height= img.getHeight(null);

}

}

publicGameObject(Image img,doublex,doubley,intspeed,intwidth,

intheight) {

this.img= img;

this.x= x;

this.y= y;

this.speed= speed;

this.width= width;

this.height= height;

}

publicGameObject() {

}

/**

*返回物體對應(yīng)矩形區(qū)域文搂,便于后續(xù)在碰撞檢測中使用

*@return

*/

publicRectangle getRect(){

returnnewRectangle((int)x,(int)y,width,height);

}

}

2)設(shè)計飛機類

有了GameObject這個父類,我們設(shè)計飛機類特別簡單秤朗,目前飛機類沒有特別復(fù)雜的要求煤蹭。我們只需簡單的繼承,即可使用:

【示例3】Plane類

packagecn.sxt.game;

importjava.awt.Graphics;

importjava.awt.Image;

publicclassPlaneextendsGameObject {

@Override

publicvoiddrawMySelf(Graphics g) {

super.drawMySelf(g);

this.x+=3;//飛機水平飛取视,我們也可以調(diào)整x硝皂、y算法,按照我們指定的路徑飛行

}

publicPlane(Image img,doublex,doubley) {

super(img,x,y);

}

}

通過繼承作谭,我們發(fā)現(xiàn)實現(xiàn)新的類稽物,爽了很多!

3) MyGameFrame類調(diào)用方式的調(diào)整

我們將Plane類封裝后折欠,也無需在MyGameFrame類中添加那么多飛機的屬性贝或,我們?nèi)糠庋b到了Plane類里面,因此锐秦,調(diào)用也變得更加簡單咪奖。

【示例4】封裝后的MyGameFrame類

publicclassMyGameFrameextendsFrame {

ImagebgImg= GameUtil.getImage("images/bg.jpg");

ImageplaneImg= GameUtil.getImage("images/plane.png");

Planeplane=newPlane(planeImg,300,300);

//paint方法作用是:畫出整個窗口及內(nèi)部內(nèi)容。被系統(tǒng)自動調(diào)用酱床。

@Override

publicvoidpaint(Graphics g) {

g.drawImage(bgImg, 0, 0,null);

plane.drawMySelf(g);//畫出飛機本身

}

//其余代碼羊赵,沒有任何變化,不在附上扇谣,自行參考上一個版本慷垮。

}

通過面向?qū)ο蠓庋b后,如果我們要再創(chuàng)建多個飛機揍堕,也變得異常簡單。

【示例5】創(chuàng)建多個飛機

publicclassMyGameFrameextendsFrame {

ImagebgImg= GameUtil.getImage("images/bg.jpg");

ImageplaneImg= GameUtil.getImage("images/plane.png");

Planeplane=newPlane(planeImg,300,300);

Planeplane2=newPlane(planeImg,300,350);

Planeplane3=newPlane(planeImg,300,400);

//paint方法作用是:畫出整個窗口及內(nèi)部內(nèi)容汤纸。被系統(tǒng)自動調(diào)用衩茸。

@Override

publicvoidpaint(Graphics g) {

g.drawImage(bgImg, 0, 0,null);

plane.drawMySelf(g);//畫出飛機本身

plane2.drawMySelf(g);//畫出飛機本身

plane3.drawMySelf(g);//畫出飛機本身

}

//其余代碼,和上個版本一致贮泞,為節(jié)省篇幅突出重點楞慈,不在附上幔烛。

}

示例5運行效果圖



「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G囊蓝,10年Java研發(fā)經(jīng)驗饿悬,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作聚霜,從小白逐漸做到工程師狡恬、高級工程師、架構(gòu)師蝎宇。精通Java平臺軟件開發(fā)弟劲,精通JAVAEE,熟悉各種流行開發(fā)框架姥芥。

筆記包含從淺入深的六大部分:

A-Java入門階段

B-數(shù)據(jù)庫從入門到精通

C-手刃移動前端和Web前端

D-J2EE從了解到實戰(zhàn)

E-Java高級框架精解

F-Linux和Hadoop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兔乞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凉唐,更是在濱河造成了極大的恐慌庸追,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台囱,死亡現(xiàn)場離奇詭異淡溯,居然都是意外死亡,警方通過查閱死者的電腦和手機玄坦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門血筑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人煎楣,你說我怎么就攤上這事豺总。” “怎么了择懂?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵喻喳,是天一觀的道長。 經(jīng)常有香客問我困曙,道長表伦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任慷丽,我火速辦了婚禮蹦哼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘要糊。我一直安慰自己纲熏,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著局劲,像睡著了一般勺拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鱼填,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天药有,我揣著相機與錄音,去河邊找鬼苹丸。 笑死愤惰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谈跛。 我是一名探鬼主播羊苟,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼感憾!你這毒婦竟也來了蜡励?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阻桅,失蹤者是張志新(化名)和其女友劉穎凉倚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫂沉,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡稽寒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趟章。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杏糙。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚓土,靈堂內(nèi)的尸體忽然破棺而出宏侍,到底是詐尸還是另有隱情,我是刑警寧澤蜀漆,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布谅河,位于F島的核電站,受9級特大地震影響确丢,放射性物質(zhì)發(fā)生泄漏绷耍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一鲜侥、第九天 我趴在偏房一處隱蔽的房頂上張望褂始。 院中可真熱鬧,春花似錦描函、人聲如沸病袄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽益缠。三九已至,卻和暖如春基公,著一層夾襖步出監(jiān)牢的瞬間幅慌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工轰豆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胰伍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓酸休,卻偏偏與公主長得像骂租,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斑司,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容