文/83872309

前言

繼上篇日志分享了第一次使用 PICO-8 開發(fā)游戲之后,我已經(jīng)沉迷在 PICO-8 無限魅力之中。這次準(zhǔn)備提高點難度開發(fā)一款動作游戲,嘗試下如何處理物體移動 碰撞等。估計要分多篇日志才可以分享完,第一篇先把主要的游戲機(jī)制完成。好了先上游戲截圖,介紹下游戲玩法。

104313cbyi1cd0ugnc2umd.png
前兩幀為角色攀爬在墻上時的動畫,即 1,2 兩幀循環(huán)切換。

2,3,4,5 幀為蓄力的動畫,身體靠近墻邊的距離表示蓄力的程度。

第 6 幀為角色死亡掉落時的 sprite。

首先是角色攀爬在墻上時 1,2 兩幀循環(huán)切換的方法。為了做動畫首先我們得用一個變量記錄時間的變化,我使用 player1.time 來記錄,在 _update() 中執(zhí)行 player1.time = player1.time + 1。

實際上 time 記錄了角色初始化以來的幀數(shù),我們就可以根據(jù)這個 time 計算出當(dāng)前該顯示哪個 sprite。
?

  1. if flr(flr(player1.time/10) % 2) == 0 then
  2. player1.frame = 1
  3. else
  4. player1.frame = 2
  5. end

復(fù)制代碼
這里的 player1.frame 記錄的就是 sprite 的索引。關(guān)鍵代碼是 flr((player1.time/10) % 2),這里的 flr 是向下取整函數(shù)。

這里 flr(player1.time/10) 是對 time 取商,然后又對商取余。取商的操作實際上控制了切換的速度,我們的 update 是以 30fps 的速度運(yùn)行的,如果每幀都替換 sprite 那動畫 1 秒將運(yùn)行 15 次,顯然太快了。我們 time/10 取商相當(dāng)于慢了 10 倍,time 的值 1 秒鐘增加 30 變成了增加 3,每次增加的時候切換 sprite,就相當(dāng)于 1 秒鐘執(zhí)行了 1.5 次動畫。后面 %2 取 2 的余數(shù),是為了獲得 0 ,1;當(dāng)為 0 的時候顯示第一幀, 1 的時候顯示第二幀。這里是只有兩個 sprites 就完成動畫的情況,如果需要 n 張 sprites 完成動畫循環(huán),就 %n 就可以了;再根據(jù)返回的 0 到 n-1 順序顯示 sprite。

總結(jié)下 flr((time/m) % n),先取商 flr(time/m);m 越大播放速度越慢。再取余數(shù) %n,有幾幀 n 就等于幾。

蓄力動畫,我們設(shè)定蓄力時間最長是 2s,也就是按下按鍵后蓄力動畫要在 2s 之內(nèi)以均勻的速度播放完畢。在 2s 內(nèi)執(zhí)行 4 幀動畫,2s 中會執(zhí)行 60 幀,60/4=15 也就是說,m=15,n=4。flr((time/15) % 4),剩下的就是根據(jù)值更換 sprite 了。

角色碰撞

上一篇日志說到了根據(jù) fget mget 來獲取當(dāng)前坐標(biāo)值下地圖中的 flag,使用這種方法可以方便的判斷角色是否碰到墻壁,或者下方的巖漿。但是游戲中另外一個角色 2P 并不是在地圖編輯器中繪制出來的,所以此方法已無法獲取到。我們需要新的方法判斷是否于 2P 產(chǎn)生來碰撞。

當(dāng)然這個新方法也十分簡單,就是判斷兩個角色的 xy 坐標(biāo)之差的絕對值是否同時小于 8(角色 sprite 的寬高都是 8)。當(dāng)然也可以減小閾值 8,使碰撞更難發(fā)生。

?

?

  1. if abs(player1.x - player2.x) < 8 and abs(player1.y - player2.y) < 8 then
  2. end
復(fù)制代碼
其實就是簡單的 aabb 盒模型判斷碰撞,pico 里幾乎所有東西都是矩形,簡單的矩形碰撞檢測就可以通吃,可以不用復(fù)雜的碰撞檢測算法。

當(dāng)檢測到角色碰撞后,在下方(y 比較?。┑慕巧珪徊韧O侣?,把下方的角色的 vx vy 都賦為 0,角色就會在 gravity 的加速度下自由落體。

2P 顏色處理

為了跟 1P 區(qū)分,2P 至少在顏色上應(yīng)該有所不同。但是僅僅是顏色不同就在 sprite sheet 上再畫一遍 2P 是不是太麻煩了,而且又浪費(fèi)了 6 個 sprite,要是知道 pico 只有最多 255 個 sprites。

當(dāng)然 pico 提供了更好的解決方法,就是在執(zhí)行 2P 繪制之前替換色板的顏色:

?

?

  1. pal(8,12)
  2. pal(2,3)
  3. spr(player2.frame,player2.x,player2.y,1,1)
  4. pal()
復(fù)制代碼
這里在 spr 繪制之前調(diào)用了 pal(x,y) 方法,這個方法就是將調(diào)色板的 x 位置用 y 位置的顏色替換,這里是用 12 號藍(lán)色替換了 8 號紅色,3 號綠色替換 2 號紫色。最后在執(zhí)行完 spr 繪制后,調(diào)用不帶參數(shù)的 pal() 將調(diào)色板還原回去。

2P AI

這里的 AI 只做了簡單的處理,就是隨機(jī)取 0-2s,作為蓄力的時間,后面加入更多元素之后應(yīng)該還會增加 AI 的復(fù)雜度。

目前游戲還是只是簡單的模型,下面將會加入空中可以釋放的道具(飛鏢之類),移動的墻壁之類的豐富玩法的內(nèi)容;還將加入更多的動畫,爆炸,火焰等;當(dāng)然還有音樂,雖然這對我來說實在是太困難了。

如果你對此游戲有任何好的建議請給我留言,當(dāng)然還有文章中的錯誤,歡迎指正。

via:indienova


銳亞教育

銳亞教育,游戲開發(fā)論壇|游戲制作人|游戲策劃|游戲開發(fā)|獨(dú)立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運(yùn)營| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛