亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

跟我學Java Swing之游戲設計(2)

2020-01-31 16:52:42
字體:
來源:轉載
供稿:網友
文章來源:電腦愛好者 作者:張劍

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

  前言

  從本期開始,我們為大家提供完整的游戲源代碼(點擊下載)。Java咖啡館倡導大家理論與實踐并重,我們在連載中將給大家介紹關鍵技術以及實現思路,朋友們自行結合文章閱讀源代碼,好比一邊讀報一邊喝咖啡,這才是滴滴香濃意猶未盡。

  游戲布局

  “連連看”屬于一款二維戰棋類游戲,要設計棋盤類的游戲,GridLayout應該是不二之選?,F在讓我們一起來看看GridLayout的構造函數:

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

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

  現在讓我們來確定游戲的格子數目。究竟多少格子比較合適呢?太少會降低游戲的難度,太多又會造成視覺影響。所以,我們應該通過一對常量來表示,將來即使要修改,也是舉手之勞。

  在Java中,常量的定義需要寫成public final static的形式,假如我們規定游戲的棋盤在橫向有8個格子,縱向也有8個格子,那么,我們應該這樣定義:

public final static int ROW = 8;

public final static int COLUMN = 8;

  然后,我們使用GridLayout的第二種構造函數來創建布局:

GridLayout gridLayout = new GridLayout(ROW, COLUMN);

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

contentPanel.setLayout(gridLayout);

  如果你此時編譯并運行程序的話,你可能會奇怪:界面怎么沒有發生任何改變,是不是哪出錯了?雖然我們指定了布局,可是什么控件也沒有添加,當然就看不出變化?,F在讓我們一起在布局上添加按鈕吧:

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

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

 巧用JButton做文章

  JButton是一個按鈕控件,它也是Swing中普通得不能再普通的控件了,盡管如此,我們還是需要花費一點功夫來了解和使用它,因為當你能夠熟練使用JButton后,你會發現其他的Swing控件也是如此的相似。

  如果你將剛才寫好的程序拿來運行,你會發現:游戲區的按鈕總是排得滿滿的,這對實際游戲的操作非常不便,所以,我們得想辦法讓一部分格子空出來。GridLayout布局什么都好,就是在添加控件的時候不能跳過某一個格子,這下可怎么辦呢?

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

  在上一次實現“關于”功能的時候,我們使用了e.getSource()方法來判斷鼠標點擊事件產生的源,然而,那只對已經命名好了的控件比較有效。這里,使用數組表示按鈕無疑是最好的方法了,首先讓我們將上面的代碼修改一下:

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);
}

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

  關于事件響應的代碼,我們可以在原來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用來判斷產生的事件是否是由JButton型的控件產生的,然后又將產生事件源的控件進行強制型類轉換,再使用Integer.parseInt(button.getActionCommand())方法將取得的事件名稱轉化為整數,后面的代碼就將這個整數還原成行和列的信息。

  好了,現在運行程序,然后點擊每個按鈕,看看是否會出現如右圖的對話框?

  注意哦,我們的下標是從0開始的。本期程序源代碼(點擊下載)。

 在Swing中使用圖片

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

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

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

  我們這里選用第一種方法。為了方便今后再次獲得Image對象,我們可以將此寫為一個函數:

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;
}

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

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

  小結

  今天我們介紹了Swing中JButton控件。對于大多數Swing控件來說,JButton的用法一樣可以照搬過去。別小看這個JButton,當你能夠很好地掌握它的時候,你的Swing功底就已經提升一個臺階了。此外,我們也學會了在Java中加載圖片文件的兩種方法。最后,我們還將以上的兩部分內容結合在一起創造出了漂亮的游戲界面。雖然我沒有在這里寫出完整的代碼,但相信大家參考我的源程序,經過自己的努力,一定能夠達到目標。如果遇到解決不了的問題,可以通過leftmoon@163.com信箱與我聯系。

  不知道大家對今天的內容感覺到滿意嗎?精彩還在后面,大家要繼續光顧我們的咖啡館哦!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2019中文字幕在线免费观看| 欧美大片免费观看在线观看网站推荐| 91精品视频免费看| 亚洲欧美日韩精品久久亚洲区| 8x海外华人永久免费日韩内陆视频| 国产精品91免费在线| 欧美激情videos| 中日韩美女免费视频网站在线观看| 91精品国产777在线观看| 亚洲国产精品久久91精品| 国产精品69精品一区二区三区| 岛国视频午夜一区免费在线观看| 91亚洲精品一区二区| 日韩精品电影网| 亚洲精品国产免费| 亚洲精品一区久久久久久| 精品国产一区二区在线| 欧美中文字幕在线观看| 中文字幕av一区二区三区谷原希美| 亚洲免费中文字幕| 国产精品久久久久久五月尺| 日韩精品极品毛片系列视频| 最近2019好看的中文字幕免费| 日韩av在线影院| 97在线视频观看| 亚洲第一免费网站| 国产成人精品在线观看| 亚洲国产成人久久| 国产精品观看在线亚洲人成网| 97国产精品视频人人做人人爱| 成人h视频在线观看播放| 国产一区二区三区三区在线观看| 亚洲国产一区二区三区在线观看| 亚洲自拍偷拍福利| 日韩人在线观看| 久久综合久中文字幕青草| 欧美精品性视频| 欧美成人免费大片| 91美女高潮出水| 亚洲女同精品视频| 精品日本美女福利在线观看| 国产性色av一区二区| 国产精品永久免费观看| www日韩欧美| 国产精品免费观看在线| 国内精品一区二区三区| 亚洲无限av看| 久久久久久久久久久久久久久久久久av| 欧美丝袜一区二区| 亚洲字幕在线观看| 久久久精品视频成人| 久久久久久国产精品久久| 91精品国产综合久久久久久久久| 国产精品日韩欧美综合| 庆余年2免费日韩剧观看大牛| 亚洲自拍偷拍网址| 精品中文视频在线| 久久人人爽亚洲精品天堂| 亚洲综合大片69999| 国产精品男女猛烈高潮激情| 九九精品视频在线| 精品在线观看国产| 日韩精品欧美激情| 国产精品激情av在线播放| 亚洲大尺度美女在线| 欧美另类交人妖| 91精品国产综合久久香蕉的用户体验| 欧美男插女视频| 日韩中文字幕免费| 国产精品亚洲网站| 亚洲第一视频在线观看| 亚洲www在线| 欧美激情一区二区久久久| 亚洲最新av网址| 91豆花精品一区| 成人黄色av网| 伊人伊成久久人综合网小说| 欧美高清第一页| 中文字幕欧美视频在线| 正在播放欧美视频| 久久久成人精品视频| 91精品国产91久久久久久最新| 国产91精品在线播放| 在线中文字幕日韩| 亚洲国产婷婷香蕉久久久久久| 在线播放日韩专区| 国产精品入口免费视| 国产精品入口免费视频一| 青青久久av北条麻妃海外网| 亚洲欧洲在线播放| 91理论片午午论夜理片久久| 亚洲欧洲日产国产网站| 欧美日韩精品二区| 日韩中文字幕网| 欧美午夜宅男影院在线观看| 亚洲一区二区中文| 98精品国产高清在线xxxx天堂| 久久精品成人欧美大片| 久久成人精品一区二区三区| 精品高清美女精品国产区| 亚洲a成v人在线观看| 日本精品久久中文字幕佐佐木| 亚洲男人第一av网站| 中文字幕av一区| 国产精品久久久久久久app| 97人人做人人爱| 青青青国产精品一区二区| 亚洲自拍高清视频网站| 免费不卡欧美自拍视频| 国产手机视频精品| 精品国产一区二区在线| 日韩精品视频免费| 另类少妇人与禽zozz0性伦| 亚洲天堂一区二区三区| 亚洲欧美变态国产另类| 亚洲女性裸体视频| 最新91在线视频| 亚洲午夜精品视频| 欧美精品999| 成人看片人aa| 欧美裸体xxxx极品少妇软件| 国语自产精品视频在线看| 国产一区二区在线播放| 成人免费在线网址| 国产精品久久久久久久久借妻| 久久成人这里只有精品| 国产欧美日韩免费看aⅴ视频| 亚洲欧美日韩国产精品| 全亚洲最色的网站在线观看| 久久精品一本久久99精品| 欧美日韩激情美女| 欧美亚洲日本网站| 欧美高清无遮挡| 亚洲精品98久久久久久中文字幕| 国产成人福利视频| 日韩成人在线网站| 97精品在线视频| 成人久久18免费网站图片| 精品国产91久久久久久老师| 成人美女av在线直播| 日韩欧美主播在线| 欧美视频精品一区| 欧美日韩亚洲精品一区二区三区| 最近2019中文字幕mv免费看| 国产精品精品一区二区三区午夜版| 国产精品第一区| 国产视频欧美视频| 欧美日韩激情视频8区| 国产丝袜一区二区| 亚洲最新av在线| 亚洲二区中文字幕| 色婷婷亚洲mv天堂mv在影片| 午夜精品久久17c| 亚洲国产精品yw在线观看| 久久久久久久久久久91| 久久视频这里只有精品| 亚洲性视频网站| 午夜精品久久久久久久男人的天堂| 97视频在线观看免费高清完整版在线观看| 欧美日韩福利电影| 亚洲乱亚洲乱妇无码| 欧美成人精品在线| 欧美视频中文在线看| 亚洲曰本av电影|