繼坦克大戰後的馬里奧

2021-08-26 15:18:54 字數 3510 閱讀 6983

用的是frame這個框架?還是叫窗體,不清楚,反正是個類沒錯,我新建了乙個類,名字叫做gameframe, 把他繼承這個frame類.就是可以用來畫窗體,畫小人什麼的.

然後在這個類中先確定視窗的大小,我寫的是800*600,把它寫成靜態全域性final變數,只需要去用它就可以了.

窗體裡面寫什麼呢? 首先先得搞乙個載入視窗的類吧,姑且就叫launchframe好了,在這個方法裡面

我們需要做幾件事:

要不然,只能通過stop來關閉….太難受了.

直接上圖看吧

順序是一致的.

所以需要我們往裡面新增一些小玩意,比如說主角,還有地面!

我們又需要做幾件事:

很簡單的三件事,首先建立主角類:

首先你得有乙個座標,確定豬腳在**生成,其次,你需要把豬腳的樣子給描繪出來,本來吧,我是想畫個小人的,但是呢…請看下圖

哇? 這麼逼真的嗎?? 不不不,其實它張這樣

所以我放棄了…主角..你就默默的當個方框吧. 方塊還是很好畫的,但在畫前,記得把畫筆的顏色儲存下來再進行操作.

地形類一樣如此.做好這些之後,我信心慢慢的開始執行,emmm? 怎麼什麼也沒有.原來是沒在窗體中把這倆東西畫出來.我們使用重寫了的paint方法,將這倆給方進去就好了,這裡有個神奇的事,你不需要呼叫paint方法,他會自己呼叫,所以說了半天,結果是怎麼樣的?看下圖

誒嘿嘿,紅色的就是豬腳了,藍色的是地面? 地面沒錯了…

話說先前做坦克大戰的時候,坦克是在螢幕上,上下左右的移動,可是我們馬里奧同學只會左右走走,最多跳一跳.這個跳就有點意思了

我們不妨想想,跳起來,再落下去怎麼落到」地面上」,還有怎麼往下落的問題.前者可以設定個碰撞檢測,就和坦克大戰一樣,問題不大,但是讓豬腳往下落就是個問題了,我們可以把」跳」設定成往下走,並且設定個引數讓它使豬腳一直往下走,但是遇到地面,碰撞檢測.這樣就可以模擬重力啦!!

怎麼新增呢? 我們是實現keylistener介面呢?還是說繼承keyadpter類呢? 一般我們可能會盡量不使用繼承,而是使用介面,但是,實現keylistener介面需要把這個介面的方法都重寫了,但是我們並不需要全部都要.所以我們選擇繼承keyadpter就可以了,選擇我們需要重寫的方法就好啦.在這裡,我們只需要keypressed()方法和keyreleadsed()方法.顧名思義,就是按鍵,和抬起按鍵的方法.然後去載入窗體(launchframe)中新增監聽事件addkeylistener(new keymonitor());

我們需要把keypressed方法和keyreleased方法寫在豬腳類裡面.首先我們先確定豬腳的方向,豬腳只會往左往右走,還有跳! 將來還可能會發射子彈… 所以我們需要寫4種狀態,左,右,下和停止.

public

void

keypressed(keyevent e)

}public

void

keyreleased(keyevent e)

}

這裡我們可以用列舉 enum direction 這樣就可以了,然後設定乙個預設狀態,就是停止,direction dir = direction stop;

我們不妨想想,怎麼實現豬腳運動? 其實每次運動都是在螢幕的下乙個位置畫了乙個豬腳,再把前面的豬腳給覆蓋掉,這樣就實現了豬腳的移動,我們可以定義乙個類來實現runnable介面,

public

class

paintthread

implements

runnable catch (interruptedexception e) }}

}

每隔50毫秒重新整理一次,這樣在我們眼裡就能看到豬腳移動了.(這裡直接複製的坦克大戰的)

之後我們需要定義乙個方法,讓豬腳動起來的方法move(),然後用switch case語句判斷當前方向,如果是當前方向,就向當前方向移動. 這樣我們的豬腳就動起來了,但是,到現在我們會發現好多問題,比如,豬腳他喵的壓根不會動啊,這是因為,沒有指定方向啊,我們預設的方向是停止的…無事發生.

private

void

locatedirection()

這樣就可以確定豬腳的方向了,我們只需要在按鍵方法裡面使用locatedirection()這個方法就好了,不使用的話你會發現豬腳不是不會動就是沾到地板上了… 說道沾!我們還沒有寫碰撞檢測!!!

在這了裡需要用到碰撞檢測.也就需要引入rectangle這個方法來輔助我們進行碰撞檢測了.你問我什麼是rectangle??? 這玩意就是指定座標空間的乙個區域,引數有4個 x,y,with,height. 很簡單的.

x,y是座標,剩下倆是寬和長.我們把豬腳和地圖都用這個rectangle給』包』起來.再借助intersects來判斷倆矩形是否交叉就可以做到碰撞檢測了!

在豬腳類中新增:

public rectangle getrect()
在地圖類中新增:

public rectangle getrect()
所謂地圖類,就是和豬腳類一毛一樣的…這裡都有相同的方法,我爵的可以寫乙個抽象類,…但是,我們先把基本的做完,理解了大概邏輯再進行這個操作吧. 下面是碰撞邏輯

public

boolean

collideswithwall(gamemap g)

return

false;

}

我們懷著激動的心情執行程式,結果!! 誒?? 怎麼沒了,,,, 原來豬腳跑到地圖下面了… 為啥??因為我們沒呼叫方法啊!!! 然後我們又一次執行,???? 怎麼還是沒有?? 你原來在騙我..我不幹了.~

噓~ 之所以會這樣是因為,我們碰撞邏輯沒寫完全,再主角和地面碰撞時,什麼也沒有做,當人就沒了啊…怎麼辦呢? 我們可以再寫乙個類,用來記錄豬腳在y軸方向上的操作,

private

void

stay()

然後在碰撞檢測裡呼叫這個方法,當檢測到碰撞時,我們把y軸此時的值記錄下來,然後覆蓋掉豬腳原來的y值,這樣豬腳就不會繼續往下走了,這也就實現了豬腳真正的站在了地面上.我們來看看豬腳的移動的方法move

void move()

//假裝是重力

y+=20;

}

重力就用簡單粗暴的y軸向下就好了.具體的值大家可隨意調,

誒嘿嘿,乙個傻傻方塊在跳來跳去的….. 大功告成

今天就先這樣啦.2018/9/1

長翅膀的馬里奧

文科大三體驗工科研究生,想都不敢想 一 二零二零這一年感覺誰也挺不容易的,我也是換了一種形式沉澱了下來很多,摸索出適合自己的一套系統學習方法。二 最近一兩個月,除了要正常本科安排的培養課程,我還加入了一位教授的大資料開發專案團隊。在文科專業中能有工科的實驗專案機會去鍛鍊實屬難得,這也符合我自身向文工...

玩NDS的超級馬里奧感想!!

超級馬里奧 這個遊戲相信大家都非常熟悉,不用多介紹了吧!記得小的時候為之瘋狂 2007年的2月,再次在nds上玩到 現在玩遊戲的意義跟以前大大不同,以前好玩的遊戲就會玩,享受過程 現在玩遊戲就辛苦了,好玩不好玩似乎沒那麼重要了,當然還會盡量選擇好玩的遊戲,遊戲過程中還要思考究竟這是如何實現的?這個功...

Uva 10269 馬里奧與公主的歸途

馬里奧n次解救了公主,現在需要從魔王的宮殿返回。英文題,述大意 給定乙個點數不超過100的無向圖,其中的點分為兩類 鄉村和城堡。輸入a個鄉村,b個城堡 鄉村編號1 a,城堡編號a 1 b 並給出m條無向路徑及其需要花費的時間。不過還輸入了k,l,表示馬里奧有一雙可以使用k次的高階鞋子,使用一次可前往...