亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

桌面彈球--學(xué)習(xí)筆記(三)

系統(tǒng) 1844 0

下面來完成桌面彈球游戲中最關(guān)鍵的一個(gè)類BallService(業(yè)務(wù)處理類)。

編寫draw方法,分別將擋板、彈球、磚塊、道具在畫板中繪制出來,當(dāng)游戲勝出,繪制勝出畫面,當(dāng)玩家失敗,繪制失敗畫面。

?

擋板和彈球不難繪制,下面主要看下磚塊和道具的繪制。

磚塊類與控制臺(tái)五子棋中的棋盤類很相似,可以用二維數(shù)組來表示所有的磚塊,磚塊的位置是不發(fā)生變化的,也就說不會(huì)涉及元素的移動(dòng),所以使用二維數(shù)組來表示是合理的。


在繪制磚塊的時(shí)候,涉及兩個(gè)問題,一個(gè)是創(chuàng)建和初始化磚塊數(shù)組,另一個(gè)是繪制磚塊。

?

在創(chuàng)建磚塊的過程中,要掌握初始化二維數(shù)組和二重循環(huán)的知識(shí)。磚塊的創(chuàng)建是有技巧的,首先磚塊不是擺滿的,假設(shè)這里設(shè)成11列6行,并且空缺的磚塊是隨機(jī)產(chǎn)生的,畫板的寬度已設(shè)定為307,因此11列表示每塊磚的大小為28,所以根據(jù)每塊磚的大小、列號(hào)、行號(hào)就可以計(jì)算磚塊的坐標(biāo):
x = i*imageSize;
y = j*imageSize;


那么如何決定哪些坐標(biāo)有磚塊,哪些坐標(biāo)沒有磚塊呢?


通過隨機(jī)函數(shù)Math.random()來決定
isDisable = Math.random()>0.8?true:false;


每個(gè)磚塊還有類型,0表示普通磚塊,沒有魔法,1表示變長魔法,2表示變短魔法


那么如何決定哪些磚塊有魔法,哪些沒有呢?


當(dāng)然初始化時(shí)沒有顯示出來的磚塊一定是沒有魔法,其余的磚塊還是使用隨機(jī)函數(shù)來決定是否有魔法。

?

    if(isDisable){
					//如果該磚塊不存在,其魔法也不存在
					random = 0;
				}
random = (int)(Math.random()*3);
  

還需要注意的是在設(shè)置磚塊的坐標(biāo)的時(shí)候,如果該磚塊有道具,還要設(shè)置道具的坐標(biāo)。同樣,在繪制磚塊時(shí),還要注意為有道具的磚塊繪制相應(yīng)的道具。


繪制磚塊和道具的時(shí)候,分別使用了兩個(gè)畫圖方法:
drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)

繪制指定圖像中已縮放到適合指定矩形內(nèi)部的圖像。
drawImage(Image img, int x, int y, ImageObserver observer)
繪制指定圖像中當(dāng)前可用的圖像。

?

判斷玩家是否勝出的方法,其實(shí)很簡單,就是所有的磚塊的狀態(tài)都變?yōu)榱瞬豢捎脮r(shí),也就是所有磚塊都被消除時(shí),玩家就勝出了。

?

碰撞檢測(cè)問題

1.彈球是否與磚塊有碰撞

桌面彈球--學(xué)習(xí)筆記(三)
?當(dāng)磚塊的中心與彈球的中心兩點(diǎn)之間的距離小于n+r 時(shí),就認(rèn)為磚塊與彈球碰撞上了。

2.道具或者彈球是否與擋板有碰撞:
判斷道具與擋板是否碰撞上和判斷彈球與擋板是否碰撞上的方法是一樣的,碰撞檢測(cè)的方法是這樣設(shè)計(jì)的:

public boolean isHitStick(BallComponent bc)

不管是彈球?qū)嵗€是道具實(shí)例都可以使用該方法。


桌面彈球--學(xué)習(xí)筆記(三)

小球最左面的點(diǎn)的橫坐標(biāo)最大不能超過檔板的最右面點(diǎn)的橫坐標(biāo)(藍(lán)線標(biāo)記)
并且
小球最右面的點(diǎn)的橫坐標(biāo)最小不能小于檔板的最左面點(diǎn)的橫坐標(biāo)(紅線標(biāo)記)
并且
小球最下面的點(diǎn)的縱坐標(biāo)大于擋板的縱坐標(biāo)

?

同時(shí)滿足了以上三個(gè)條件,就認(rèn)為彈球與擋板相撞了。

?

坐標(biāo)變換

?

下面是時(shí)候讓擋板、彈球、道具動(dòng)起來了,擋板是靠玩家鍵盤操作控制的,而小球和道具則由程序來控制,下面分別實(shí)現(xiàn)擋板、小球、道具的坐標(biāo)變換。

1.設(shè)置擋板圖片的位置
判斷鍵盤輸入,來作出相應(yīng)的處理。


2.設(shè)置道具的位置


3.實(shí)施魔法

調(diào)用magicDo(Stick stick)來實(shí)現(xiàn)。


4.設(shè)置彈球圖片的位置

在移動(dòng)彈球之前,先要保證小球的移動(dòng)是合法的,也就是要判斷彈球移動(dòng)后,是否會(huì)碰到上、下、左、右邊界。其中還有彈球碰到磚塊、彈球碰到擋板這些特殊情況。


當(dāng)彈球碰到左邊界時(shí),要將彈球的運(yùn)動(dòng)的X軸方向變?yōu)橄蛴遥?
當(dāng)彈球碰到右邊界時(shí),要將彈球的運(yùn)動(dòng)的X軸方向變?yōu)橄蜃螅?
當(dāng)彈球碰到上邊界,要將彈球的運(yùn)動(dòng)Y軸方向改變?yōu)橄蛳拢?
當(dāng)彈球碰到擋板或者磚塊時(shí),都要改變彈球的Y軸方向?yàn)橄喾捶较颍?

?

如果ball.getSpeedY()為正時(shí),彈球向上運(yùn)動(dòng),相反,如果ball.getSpeedY()為負(fù)時(shí),向下
所以初始狀態(tài)時(shí),
private int speedX = 10;
private int speedY = 8;
彈球會(huì)向上走,這也就是玩家一移動(dòng)擋板時(shí),小球就向上走。

?

設(shè)定彈球的坐標(biāo):

    // 設(shè)置x坐標(biāo)
ball.setX(ball.getX() - (int) (Math.random() * 2)- ball.getSpeedX());
// 設(shè)置y坐標(biāo)
ball.setY(ball.getY() - (int) (Math.random() * 2)- ball.getSpeedY());
  

?

調(diào)試

?

程序?qū)懲炅耍前l(fā)現(xiàn)總是沒有道具出現(xiàn),初步判斷創(chuàng)建磚塊時(shí),沒有創(chuàng)建出類型為1或2的帶魔法的磚塊,發(fā)現(xiàn)在創(chuàng)建和設(shè)置磚塊createBrickArr()中,打印出random,結(jié)果發(fā)現(xiàn)random這個(gè)值一直是0。
于是發(fā)現(xiàn)是這條語句發(fā)生了錯(cuò)誤:

    //創(chuàng)建一個(gè)新的磚塊
random = (int)Math.random()*3;
  

應(yīng)該是:

    random = (int)(Math.random()*3);
  

?馬上檢查了程序中其它使用Math.random()的代碼,發(fā)現(xiàn)了并改正了:

    //設(shè)置小球的坐標(biāo)
            ball.setX(ball.getX()-ball.getSpeedX()-(int)(Math.random()*2));
            ball.setY(ball.getY()-ball.getSpeedY()-(int)(Math.random()*2));
  

怪不得在測(cè)試過程中總感覺小球的路徑變化不大的緣故,因?yàn)槿绻患永ㄌ?hào)的話,這個(gè)值(int)Math.random()*2也總是0。改正了上面存在的問題后,發(fā)現(xiàn)之前的問題是解決了,但是落下來的道具竟然是磚塊!

找到LongMagic這個(gè)類,發(fā)現(xiàn)magicDo方法中:

    double imageWidth = this.getImage().getWidth(null);
  

應(yīng)該是:

    double imageWidth = stick.getImage().getWidth(null);
//當(dāng)擋板沒有變長過
		if (stick.getPreWidth()<=imageWidth){
			//加長變?yōu)樵瓉淼膬杀?			stick.setPreWidth((int)(stick.getPreWidth()*2));
//			System.out.println("變長了");
		}
  
?

打包

?

打包后運(yùn)行,遇到Exception in thread "main" javax.imageio.IIOException: Can't read input file!錯(cuò)誤。

?

在Eclipse中開發(fā)時(shí),使用的是以當(dāng)前工作路徑為基準(zhǔn)來尋找圖片文件的:

    stick = new Stick(width,height,"img/stick.jpg");
  

?在創(chuàng)建Image圖像時(shí),使用的如下方法:

    this.image = ImageIO.read(new File(path));
  
?

但是打包后,當(dāng)前用戶路徑有可能發(fā)生變化,因此無法找到圖片,解決辦法是使用以當(dāng)前類為基準(zhǔn)的路徑指定方式。

    this.image = ImageIO.read(getClass().getResource(path));
  

這時(shí)就可以找到圖片了。

為了確定指定的路徑是否正確,可以打印出來:

    System.out.println(getClass().getResource(path).toString());
  

桌面彈球--學(xué)習(xí)筆記(三)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 影音先锋在线亚洲精品推荐 | 人成在线免费视频 | 亚洲午夜精品 | 色综合中文字幕天天在线 | 国产一区在线观看免费 | 久久伊人中文字幕有码 | 精品一区二区三区四区乱码90 | 亚洲伊人久久大香线蕉结合 | 九九热精品在线观看 | 日本色综合 | 夜夜爱夜夜做夜夜爽 | 天天夜夜操 | 欧美成人伦理 | 国产精品亚洲第五区在线 | 91久国产在线观看 | 欧美成人精品欧美一级乱黄 | 妖精视频永久在线入口 | 又粗又硬又大久久久 | 欧美综合国产精品日韩一 | 一区二区三区鲁丝不卡麻豆 | 在线播放国产视频 | 欧美亚洲国产第一页草草 | 操天天操 | 五月一区二区久久综合天堂 | 国产在线观看自拍 | 国产精品青草久久福利不卡 | 香蕉网久久 | 日韩在线视频免费播放 | 视频二区 中文字幕 欧美 | 超碰最新上传 | 日韩在线无 | 久久99热精品免费观看 | 四虎影院在线播放 | 男人天堂a在线 | 香蕉一区二区 | 久久久久久久久久综合情日本 | 国产合集福利视频在线视频 | 香蕉成人啪国产精品视频综合网 | 国产精品视频专区 | 香蕉视频黄在线观看 | 激情婷婷网 |