創作內容

2 GP

9/12起,格鬥遊戲連招程式實作的思考與嘗試,招式跟連招想做在文件檔,9/12更,第一招完成

作者:李兒諳│2018-09-12 13:46:25│巴幣:4│人氣:193
假日心血來潮,突然想處理格鬥遊戲的連招(也類似音樂遊戲,在一段時間內要做些操作)
在講連招之前
先介紹下 有限狀態機!!
(縮寫是fsm因為 有限(finite) 狀態(state) 機(machine))

有限狀態機以程式實作的話,可以看為一連串的if-else
或者是以switch-case來實作的話看起來較簡潔些
若只看程式碼的話,大概很難聯想到有限狀態機那麼帥的名稱
(其實資料結構跟演算法也差不多,光看名字就很嚇人
看程式碼就覺得還好
不過共通點是通常把程式碼遮掉之後,有很大機率實作不出來
因為正常程式寫不多不夠熟的人,是運用不了的
只是有限狀態機應該算是一看就大致上會的)

有限狀態機在遊戲出名的運用就是
1.小精靈(pac-man,對岸叫做 吃豆人)
遊戲畫面是長這樣的,共256關的樣子(我好像還沒打超過10關過)
有點年紀的人或者是玩紅白機舊卡帶長大的新生代應該不陌生
吃了比較大的圓點之後可以反過去吞噬...鬼魂?
就原先被追逐的反而變成要閃躲的
它遊戲中鬼魂的狀態
可大致分為 遊走、追逐、閃躲

那程式碼大概會像
switch(state)
{
case hang_around:
    if(小精靈吃到大力丸)
        if (看見小精靈)
           state = evade;
       else //(也就是沒看見小精靈)
           state = hang_around;
    else //(也就是小精靈處於正常狀態)
       state = hang_around;
       
   break;
case chase:
    if(小精靈吃到大力丸)
        if (看見小精靈)
           state = evade;
       else //(也就是沒看見小精靈)
           state = hang_around;
    else //(也就是小精靈處於正常狀態)
       if (看見小精靈)
           state = chase;
       else //(也就是沒看見小精靈)
           state = hang_around;
   break;
case evade:
    if(小精靈吃到大力丸)
        if (看見小精靈)
           state = evade;
       else //(也就是沒看見小精靈)
           state = hang_around;
    else //(也就是小精靈處於正常狀態)
       state = hang_around;

   break;
}

2.生命遊戲(就那種桌面飼養小動物,很會繁殖的)
其中每個動物的狀態可以大致分為 尋找食物,返回巢穴,死亡
若是桌面飼養動物那種生命遊戲的話,可能飼料會做成隱形的

3.格鬥遊戲
這個範例我沒見過(主因是我也沒怎麼看格鬥遊戲的程式碼)
僅聽說過寫格鬥遊戲會用到有限狀態機
我直覺想到的是 空中 站立 蹲下  然後是是否處於防禦狀態

簡單來說
有限狀態機就是不管何時
if-else或switch-case都處在個狀態
不過發生些事件時,會在狀態間切換這樣的東西

連招我早上想了陣子
理論上可以用有限狀態機來做
但是會很麻煩

例如能出的招式有
↓A,↓↓A,↓↑↑A
這麼多的可能性列舉起來會很麻煩
此外每步都要重新計時
例如↓接A中間間距不能超過0.3秒(假設啦,我對時間沒什麼概念)
超過時間就直接先執行後退的動作

雖然過往就我感覺《小朋友齊打交一代》的做法是移動時就直接移動
輸入攻擊時在看之前的移動鍵是什麼來出招
可能是後來覺得這做法不太好
所以《小朋友齊打交二代》印象中發招
陸地招的第一個鍵好像都是防禦鍵

所以說,有限狀態機應該不是這麼用的
要用在連招感覺也需要一個完整的狀態
也就是說狀態是以招為單位
若上一招是哪招的話,接下來可以接哪招
想了一陣子
覺得《小朋友齊打交一代》的做法感覺也不錯
可以考慮實作個類似的
只是移動不是一按就發動

雖然聽說正規的做法是
根據手邊的動畫檔來做
在哪幾幀的時候才開始接收鍵盤輸入
這方法聽起來比較好
但我其實也不知道具體該怎麼實作
此外我手邊也沒檔案,就先把這做法往旁邊擺下
先用別的方法
不行或者是會碰上哪些問題時再回頭來看這方法

唔,那開始實作吧
看在哪邊會出問題
我想到的做法是
每隔段時間讀取輸入
符合出招條件就出招
出招先做完再做連招

我招式與連招是想寫在文件檔
要改時在從文件改這樣

13:46開始

14:31檔案
但目前輸入招式很看運氣
因為運氣最好時只有0.2秒可以輸入 ↓↑Z
應該是先按按鍵再計時
招式就比較容易發出來

14:58修正
嗯,修正之後招式好發多了
後來發現是每100毫秒(0.1秒)差不多一個鍵
但其實每100毫秒一個鍵算招式要按很快了
雖然若亂按的話400毫秒能5個鍵(但要打出特定五個鍵有困難)
這樣會有個問題
問題就是若有招式需要按的鍵特別多的話~
會有些麻煩
嗯...不過後來想了下,若真如此
可以採用模式切換,按些鍵進入詠唱模式
詠唱模式就是設置個允許輸入時間比較長的timer

嗯,總覺得好像還有哪邊想得不周全
但先別管那麼多了
等下直接進入連招模式吧
(我會把招式寫在文件檔中,所以下步大概要比較久)
那等下預計會碰到的問題是
沒圖檔的狀況下,連招要怎麼看出來呢?

15:28
有個隱約覺得沒想周全的地方是
我不清楚有多少時間是花在對鍵盤輸入與螢幕顯示的計算上
因此多少毫秒按幾個鍵的數據可能是不準的

16:13
第一招完成
目前的問題是,輸入完的招式應該要立刻放
不過現在會等到時間到
再去找所施放的最長招式
(因為我招式檔combo.txt的排序關係)

17:34
吃飯過程中突然覺得自己腦殘了一下
我不需要過0.75秒才檢查輸入(那樣必然會拖到0.75秒後才放招)
只要在按第一個鍵後,開始計時0.75秒
0.75秒後清空輸入過的按鍵
然後每次按鍵檢查輸入
(看招式設計,若招式一定以攻擊鍵結尾的話,就可以不用檢查方向鍵
但方向鍵當作招式的
SEGA的《幽遊白書》 飛影的殘影→→→→
跟《流星蝴蝶劍》忘記幾版後的忍刀兩次方向鍵有先例
所以我程式還是檢查方向鍵)
不過這麼做會有什麼問題嗎?
嗯,暫時想不到,就先這樣吧~
9/12,大概就先寫到這樣
還在想連招該怎麼存?
連招該怎麼存取決於連招的狀況
例如有些招式不能輸入後立刻連招
要等一下子才能連的這種
處理起來就會比較麻煩
不過有沒有需要把遊戲做到這樣子就看開發團隊自己喜好了
(看玩家喜好?
格鬥遊戲若只能玩家跟玩家間對決的話
是對較弱的玩家很不友好的遊戲
那也肯定會是小眾遊戲
大眾遊戲還是小眾遊戲不是重點,反正我都做不出來
重點是
我自己本身就是較弱的玩家啦!!
對格鬥遊戲沒什麼理解、手速慢
因此看玩家喜好的話,看我是不準的,可是我也只能看我自己!!
況且目前也沒動畫檔或圖檔讓玩家試玩啊!!)

17:55 哦,想到目前實作的問題了
目前的實作雖然可以輸入完就發招
可是若不按移動鍵就移動的話
那移動要等0.75秒才會移動
看樣子要觀察下其它遊戲怎麼移動的
(也許是按方向鍵時間久一些才會觸發移動?)
手邊的遊戲測試了下
按夠快的話是有可能不移動的
然後發現按下個鍵的時候就會暫停目前的動畫去播那個鍵的動畫
所以只要動畫檔的前幾幀變化不明顯,按快些就可能不移動
或者說是移動是取決於動畫檔的第幾幀的話就有可能辦到
我後來才想起來,有些格鬥遊戲的攻擊動畫也是有移動效果的
不過這具體是怎麼做的我不太清楚
我過往都是處理圖片檔,在我的認知中,不去處理圖片左上角,應該是做不到移動的
有想到個可能性是,手動去處理各圖片,顯示第幾幀時,再去改變圖片左上角座標
所以確實是有機會辦到的
應該跟哪種動畫檔無關,單純一連串的圖片(sprite動畫那種)變化也做得到

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4127427
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★y541258 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:9/8,試著與說下為何要... 後一篇:9/12第二篇,小說《離...

追蹤私訊切換新版閱覽

作品資料夾

pauk0308台股
不要再跌了拜託看更多我要大聲說昨天22:05


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】