欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟我學(xué)Java Swing之游戲設(shè)計(jì)(2)

 更新時(shí)間:2006年12月23日 00:00:00   作者:  
文章來(lái)源:電腦愛(ài)好者 作者:張劍

  還記得《偷天換日》中精靈般穿梭在好萊塢車(chē)流中的Minicooper嗎?馬克·沃爾伯格和莎莉·賽隆就是駕駛著它在仇人的鼻子底下運(yùn)走了價(jià)值千萬(wàn)的黃金??墒?,如果現(xiàn)在將一輛無(wú)法奔馳的Minicooper軀殼放在你的面前,你會(huì)如何看待它?它還是那個(gè)游走自如的精靈嗎?今天,就讓我們一點(diǎn)一點(diǎn)地為這輛Minicooper組裝上零件,讓它跑起來(lái)。

  前言

  從本期開(kāi)始,我們?yōu)榇蠹姨峁┩暾挠螒蛟创a(點(diǎn)擊下載)。Java咖啡館倡導(dǎo)大家理論與實(shí)踐并重,我們?cè)谶B載中將給大家介紹關(guān)鍵技術(shù)以及實(shí)現(xiàn)思路,朋友們自行結(jié)合文章閱讀源代碼,好比一邊讀報(bào)一邊喝咖啡,這才是滴滴香濃意猶未盡。

  游戲布局

  “連連看”屬于一款二維戰(zhàn)棋類(lèi)游戲,要設(shè)計(jì)棋盤(pán)類(lèi)的游戲,GridLayout應(yīng)該是不二之選。現(xiàn)在讓我們一起來(lái)看看GridLayout的構(gòu)造函數(shù):

  ·GridLayout():默認(rèn)的情況下,將布局區(qū)域劃分為1*1的大小
   ·GridLayout(int rows,int cols):指定布局區(qū)域橫向和縱向的格子數(shù)
   ·GridLayout(int rows,int cols,int hgap,int vgap):同上,并且還指定了每個(gè)格子之間的橫向間距hgap和縱向間距vgap

  千萬(wàn)別讓這三個(gè)構(gòu)造函數(shù)把你給嚇住了,其實(shí)只要你喜歡,完全可以放心大膽地使用其中的任何一個(gè),就算不小心用“錯(cuò)”了,以后也有辦法進(jìn)行調(diào)整。惟一需要注意的是,GridLayout在添加控件時(shí),默認(rèn)順序是從左上方向右下方依次添加的。

  現(xiàn)在讓我們來(lái)確定游戲的格子數(shù)目。究竟多少格子比較合適呢?太少會(huì)降低游戲的難度,太多又會(huì)造成視覺(jué)影響。所以,我們應(yīng)該通過(guò)一對(duì)常量來(lái)表示,將來(lái)即使要修改,也是舉手之勞。

  在Java中,常量的定義需要寫(xiě)成public final static的形式,假如我們規(guī)定游戲的棋盤(pán)在橫向有8個(gè)格子,縱向也有8個(gè)格子,那么,我們應(yīng)該這樣定義:

public final static int ROW = 8;

public final static int COLUMN = 8;

  然后,我們使用GridLayout的第二種構(gòu)造函數(shù)來(lái)創(chuàng)建布局:

GridLayout gridLayout = new GridLayout(ROW, COLUMN);

  最后,我們還需要將游戲區(qū)(contentPanel)的布局改為上述布局:

contentPanel.setLayout(gridLayout);

  如果你此時(shí)編譯并運(yùn)行程序的話(huà),你可能會(huì)奇怪:界面怎么沒(méi)有發(fā)生任何改變,是不是哪出錯(cuò)了?雖然我們指定了布局,可是什么控件也沒(méi)有添加,當(dāng)然就看不出變化?,F(xiàn)在讓我們一起在布局上添加按鈕吧:

for (int i = 0; i < ROW * COLUMN; i++) {
  JButton button = new JButton("Kyodai");
  contentPanel.add(button);
}

  再運(yùn)行程序試試,是不是和我的一樣(見(jiàn)圖1)?

 巧用JButton做文章

  JButton是一個(gè)按鈕控件,它也是Swing中普通得不能再普通的控件了,盡管如此,我們還是需要花費(fèi)一點(diǎn)功夫來(lái)了解和使用它,因?yàn)楫?dāng)你能夠熟練使用JButton后,你會(huì)發(fā)現(xiàn)其他的Swing控件也是如此的相似。

  如果你將剛才寫(xiě)好的程序拿來(lái)運(yùn)行,你會(huì)發(fā)現(xiàn):游戲區(qū)的按鈕總是排得滿(mǎn)滿(mǎn)的,這對(duì)實(shí)際游戲的操作非常不便,所以,我們得想辦法讓一部分格子空出來(lái)。GridLayout布局什么都好,就是在添加控件的時(shí)候不能跳過(guò)某一個(gè)格子,這下可怎么辦呢?

  其實(shí)這也不難,既然GridLayout不讓跳過(guò),如果我們讓某個(gè)格子內(nèi)添加的控件與GridLayout布局的背景融為一體,這樣在視覺(jué)上就達(dá)到了一致的效果。此外,假如別人在無(wú)意中點(diǎn)擊到這個(gè)格子上,按鈕仍然就會(huì)原形畢露,我們還得想辦法讓按鈕不能被點(diǎn)擊,這就需要用到JButton的setEnabled()方法。最后,對(duì)于能夠點(diǎn)擊的按鈕,當(dāng)它們被點(diǎn)擊時(shí),我們還得要區(qū)分出來(lái)究竟是哪一個(gè)按鈕被點(diǎn)擊了。

  在上一次實(shí)現(xiàn)“關(guān)于”功能的時(shí)候,我們使用了e.getSource()方法來(lái)判斷鼠標(biāo)點(diǎn)擊事件產(chǎn)生的源,然而,那只對(duì)已經(jīng)命名好了的控件比較有效。這里,使用數(shù)組表示按鈕無(wú)疑是最好的方法了,首先讓我們將上面的代碼修改一下:

JButton[] dots = new JButton[ROW * COLUMN];
for (int i = 0; i < ROW * COLUMN; i++) {
  dots[i] = new JButton("Kyodai");
  dots[i].setActionCommand("" + i);
  contentPanel.add(dots[i]);
  dots[i].addActionListener(this);
}

  千萬(wàn)別忘記了在循環(huán)體中寫(xiě)上dots[i] = new JButton("Kyodai"),雖然在前面定義、使用了dots組數(shù),然而,這僅僅只是告訴程序我們需要使用一些JButton,但是,這些JButton卻依然沒(méi)有被初始化。同時(shí),我們不僅使用setActionCommand()為按鈕制定了事件名稱(chēng),還使用了addActionListener()方法為每個(gè)按鈕加上了事件響應(yīng)處理。

  關(guān)于事件響應(yīng)的代碼,我們可以在原來(lái)actionPerformed()事件代碼的后面添加:

if (e.getSource() instanceof JButton) {
  JButton button = (JButton) e.getSource();
  int offset = Integer.parseInt(button.getActionCommand());
  int row, col;
  row = Math.round(offset / COLUMN);
  col = offset - row * COLUMN;
  JOptionPane.showMessageDialog(this,"ROW="+row+",COL="
      + col, "按鈕", JOptionPane.INFORMATION_MESSAGE);
}

  在上面的代碼中,e.getSource() instanceof JButton用來(lái)判斷產(chǎn)生的事件是否是由JButton型的控件產(chǎn)生的,然后又將產(chǎn)生事件源的控件進(jìn)行強(qiáng)制型類(lèi)轉(zhuǎn)換,再使用Integer.parseInt(button.getActionCommand())方法將取得的事件名稱(chēng)轉(zhuǎn)化為整數(shù),后面的代碼就將這個(gè)整數(shù)還原成行和列的信息。

  好了,現(xiàn)在運(yùn)行程序,然后點(diǎn)擊每個(gè)按鈕,看看是否會(huì)出現(xiàn)如右圖的對(duì)話(huà)框?

  注意哦,我們的下標(biāo)是從0開(kāi)始的。本期程序源代碼(點(diǎn)擊下載)。

 在Swing中使用圖片

  目前我們已經(jīng)解決了用戶(hù)操作的問(wèn)題。為了讓界面美觀(guān)起來(lái),我們需要使用圖片來(lái)代替文字。有時(shí)間和耐心的朋友可以自己做個(gè)性圖片,只是要注意保持每張圖片大小一致,否則就太難看啦。想省事的話(huà)也可以直接使用下載包中提供的圖片。

  在Swing中,可以使用setIcon(Image image)方法來(lái)為JButton設(shè)置圖片,其中的參數(shù)image就是我們要設(shè)置的圖片對(duì)象,這個(gè)對(duì)象有多種方法可以得到:

  ·使用Toolkit類(lèi)來(lái)獲得:
    image = Toolkit.getDefaultToolkit().getImage(url);
   ·使用ImageIcon類(lèi)的getImage()方法來(lái)獲得:
     image = new ImageIcon(getClass().getResource(filename)).getImage();

  我們這里選用第一種方法。為了方便今后再次獲得Image對(duì)象,我們可以將此寫(xiě)為一個(gè)函數(shù):

Image getImage(String filename){
  URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
  URL url = null;
  Image image = null;
  url = urlLoader.findResource(filename);
  image = Toolkit.getDefaultToolkit().getImage(url);
  return image;
}

  有了這個(gè)函數(shù)之后,以后再要用到圖片就方便多了,不是嗎?

  圖片現(xiàn)在已經(jīng)有了,那么我們就可以將源代碼包中Map.Java中的地圖信息用圖片的形式表現(xiàn)出來(lái)了。由于此段代碼是關(guān)于游戲的算法代碼,因此不再列舉代碼,在這里大致解釋一下具體是怎么做的吧!在Map.Java中,我們使用了二維數(shù)組map[][]來(lái)保存圖片信息,同時(shí),我們也使用了一維數(shù)組images[]來(lái)保存每一個(gè)圖片對(duì)象,map中的每一個(gè)元素都有一個(gè)值,這個(gè)值不僅表明了在游戲界面中按鈕對(duì)應(yīng)的值,也表明了這個(gè)按鈕使用images[]數(shù)組中圖片的編號(hào),程序運(yùn)行界面便漂亮許多。

  小結(jié)

  今天我們介紹了Swing中JButton控件。對(duì)于大多數(shù)Swing控件來(lái)說(shuō),JButton的用法一樣可以照搬過(guò)去。別小看這個(gè)JButton,當(dāng)你能夠很好地掌握它的時(shí)候,你的Swing功底就已經(jīng)提升一個(gè)臺(tái)階了。此外,我們也學(xué)會(huì)了在Java中加載圖片文件的兩種方法。最后,我們還將以上的兩部分內(nèi)容結(jié)合在一起創(chuàng)造出了漂亮的游戲界面。雖然我沒(méi)有在這里寫(xiě)出完整的代碼,但相信大家參考我的源程序,經(jīng)過(guò)自己的努力,一定能夠達(dá)到目標(biāo)。如果遇到解決不了的問(wèn)題,可以通過(guò)leftmoon@163.com信箱與我聯(lián)系。

  不知道大家對(duì)今天的內(nèi)容感覺(jué)到滿(mǎn)意嗎?精彩還在后面,大家要繼續(xù)光顧我們的咖啡館哦!

相關(guān)文章

  • springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡

    springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡

    這篇文章主要介紹了springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Security攔截器引起Java CORS跨域失敗的問(wèn)題及解決

    Spring Security攔截器引起Java CORS跨域失敗的問(wèn)題及解決

    這篇文章主要介紹了Spring Security攔截器引起Java CORS跨域失敗的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java并發(fā)之異步的八種實(shí)現(xiàn)方式

    Java并發(fā)之異步的八種實(shí)現(xiàn)方式

    本文主要介紹了Java并發(fā)之異步的八種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 基于@JsonProperty的使用說(shuō)明

    基于@JsonProperty的使用說(shuō)明

    這篇文章主要介紹了基于@JsonProperty的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java抽獎(jiǎng)?chuàng)屬?gòu)算法

    Java抽獎(jiǎng)?chuàng)屬?gòu)算法

    這篇文章主要為大家詳細(xì)介紹了Java抽獎(jiǎng)?chuàng)屬?gòu)算法,ava實(shí)現(xiàn)的抽獎(jiǎng)?chuàng)屬?gòu)算法,用數(shù)據(jù)庫(kù)行鎖實(shí)現(xiàn),支持集群,感興趣的小伙伴們可以參考一下
    2016-08-08
  • mybatis實(shí)現(xiàn)讀取樹(shù)結(jié)構(gòu)數(shù)據(jù)實(shí)例代碼

    mybatis實(shí)現(xiàn)讀取樹(shù)結(jié)構(gòu)數(shù)據(jù)實(shí)例代碼

    這篇文章主要介紹了mybatis實(shí)現(xiàn)讀取樹(shù)結(jié)構(gòu)數(shù)據(jù)實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Java中StringUtils工具類(lèi)進(jìn)行String為空的判斷解析

    Java中StringUtils工具類(lèi)進(jìn)行String為空的判斷解析

    這篇文章主要介紹了Java中StringUtils工具類(lèi)進(jìn)行String為空的判斷解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java中的interrupted()和isInterrupted()

    Java中的interrupted()和isInterrupted()

    這篇文章主要介紹了Java中的interrupted()和isInterrupted()摸下面文章圍繞interrupted()和isInterrupted()的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴樂(lè)意參考下面下面文章具體價(jià)紹,希望對(duì)大家有所幫助
    2021-11-11
  • Java中List集合的常用方法詳解

    Java中List集合的常用方法詳解

    本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于Java中List集合的常用方法詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。下面我們就來(lái)學(xué)習(xí)一下吧
    2021-11-11
  • 一文帶你深入了解Java泛型

    一文帶你深入了解Java泛型

    Java?泛型(generics)是?Jdk?5?中引入的一個(gè)新特性,?泛型提供了編譯時(shí)類(lèi)型安全檢測(cè)機(jī)制,?該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類(lèi)型。本文將通過(guò)示例詳解Java泛型的定義與使用,需要的可以參考一下
    2022-08-08

最新評(píng)論