主題

RM MZ學習筆記(1) 限時輸入數字

路漫行 | 2021-06-29 10:48:59 | 巴幣 120 | 人氣 250

HI~大家好,久違的巴哈。
最近因為疫情的關係,兩隻不用上課的小羅每天在家裡碰碰跳跳到半夜2點,然後再陪半夜不睡覺一直笑的羅baby到凌晨6點,非常的現充,阿宅都不阿宅了。唯一的娛樂就是去Steam上刷一堆沒時間玩的特價遊戲,享受花錢的快感。

今年六月Steam夏特,我晃啊晃的,發現RM系列又出新作了,這次叫做MZ,剛好也在特價,本來也還在猶豫要不要買,但想到我RM系列已經收全套了,獨缺這款也說不過去,所以也刷了,打開來試用時,羅哥哥跑過來吵著說要玩我做的迷宮。哦他還記得我多年前曾經做過迷宮給他玩,他現在又要玩,我就想反正也要暑假了,我就想乾脆來個闖迷宮做數學的happy暑假day吧。

前面弄了一些很簡單的題目,他們玩得很開心,後來做到了限時輸入答案的部分,不知怎樣,總是不成功。


我的JavaScript 還在復健中,MZ插件的規格又整個翻新,所以希望能盡量用內建功能達到我想要的效果,所以這是內建的計時器,內建的文字變數顯示,內建的數字輸入視窗。我覺得這組合起來應該也是內建的功能,但很快碰到第一個問題:

(1) 當啟動輸入視窗時候,玩家的時間停下了

換句話說,雖然最上方計時器會倒數,但是要「判斷」時間到了,卻沒辦法。解決方式是另開一個並行事件,把條件寫到並行事件裡面。在主事件裡面透過[開關0011]的啟動與關閉來控制公用事件。

註:每秒播放音效可增加緊張感

接著碰到了第二個問題,就是時間到了以後,要怎樣停掉主事件。

我的需求很簡單,就是時間到了以後,要把整個畫面清空重來,但在公用事件裡面,沒辦法跳回主事件,也沒辦法停掉主事件的劇情,所以文字視窗跟輸入視窗會一直停留在畫面上,看起來像是BUG。想到第一個解法是利用腳本代碼強關文字視窗跟數字輸入視窗。我花了好多時間回想指令怎麼用,為了以後不用再找一次,決定貼在下面:

我試了這三個
$gameMessage.clear();
SceneManager._scene._messageWindow._closing = true SceneManager._scene._numberInputWindow._closing = true

直接報告結果:
$gameMessage.clear();
文字視窗跟輸入視窗依然停在畫面上,只有解除人物的鎖定,BUG更嚴重了

SceneManager._scene._messageWindow._closing = true
關不掉,推測是Message Window在輸入時被做了特殊處理

SceneManager._scene._numberInputWindow._closing = true
可以順利關掉,但上面那個Message Window關不掉,反而卡死整個遊戲

後來我找到其他指令強關Message Window,但這樣更糟糕的還是,文字視窗跟數字輸入視窗再也沒辦法用正常方式開啟了。就這樣瞎忙了一整個晚上,今早睡醒忽然靈機一動,我不關視窗了,改成按下Enter。

就變成上圖中使用的code:

SceneManager._scene._numberInputWindow.onButtonOk();

簡單說就是時間到,我不管內容如何就幫玩家按enter,答案錯了會扣血,對了一樣過關。雖然我是希望時間到是強制失敗重來,但勉強能夠將就一下,總之終於搞定了計時器,也不用為了這個重寫一份插件,只用一行就搞定了。

寫到這裡時,小羅羅們都醒了,然後羅Baby也昏倒了,我要去補眠了....




PS.最後小羅去玩NS的game build garage了...這是家學淵源嗎...

PS2.寫到最後要連結遊戲標籤時候,巴哈的資料庫裡面竟然沒有MZ的選項,我還用手打的標籤,還是只單純因為新版比較難用?




補記:

找到插件:MZ Message Timer

完美達成我心目中想要的效果,而且非常美觀,效果演示請看原始網站的影片介紹。不過原插件是針對文字視窗跟選項視窗的,所以我額外增加了數字輸入視窗的版本。

使用方法等同MZ Message Timer
點我下載(Dropbox)

點了就知道我最後是用什麼東西成功關閉視窗,又不會出一堆問題了...
上面都是廢話,只有插件才是真的


Window_Message.prototype.terminateMessage = function() {
    this.close();
    this._goldWindow.close();
    //關閉數字輸入視窗
    this._numberInputWindow.processCancel();
    $gameMessage.clear();
};


Window_NumberInput.prototype.processCancel = function() {
    this.playOkSound();
    $gameVariables.setValue($gameMessage.numInputVariableId(), this._number);
    this.updateInputData();
    this.deactivate();
    this.close();
};

其實我只是把Window_NumberInput.prototype.processOk()複製了一份,
改名成Window_NumberInput.prototype.processCancel()
然後在時間到的時候執行他,其實好像不改名也沒差...


最後一句廢話,MZ內建的TimeLimitedChoice,不支援MZ,只能在MV中使用...

送禮物贊助創作者 !
0
留言

創作回應

疾風星星
好久沒看到路大了@@
2021-06-29 11:02:40
路漫行
我也好久沒畫圖了...
2021-06-29 11:23:12

更多創作