『事件運行的原理.EP1:順序執行』Clickteam Fusion系列教程(17)

嗨,各位好啊,又是許久未見,每每看到有人點贊亦或關注就覺得心中愧疚,想來自進入2017年後,整體的進度便大幅放緩,從周更半月更到月更,再到季更以及現在的隨緣更,究其原因,前面的文章之中多少已經透露了些端倪,既是什麼「迴旋鍋」,又是什麼「蒸汽」,不過隨之而來的卻並不是什麼好消息,我也因此祥林嫂過一段時間,好在總算是翻過新的一篇,不管在發生何事都已與我無關,但這並不意味著要就此放棄,套用某團長的一句名言——

希望の花

不要停下來啊!(霧

倒是摸魚主催還在不斷更新著預計發售日,自從16年4月公開以後,先是定檔16年7月16年12月17年8月,就在不久前的12月27日,還更新時間到18年2月14日,趕不上考試時間,趕不上成績發表,那趕上一個情人節與春節也是極好的,但果然不出所料,不僅現在依舊沒有發布,steam DB上查閱到的更新訊息還停留在8月31日的數次與9月11日的一次,從今往後就再無變動

在那以後,雖然有繼續更新的計劃,連草稿都打了好幾個,無奈學業繁忙,身體抱恙,態度怠惰,間歇性自暴自棄以及steam接連打折,任天堂大作連發……啊不,最後這個沒有……算了,摸魚是好文明

摸魚是好文明


按理說鴿了這麼久,理應閑話少提,可這麼長時間也沒說點啥,總覺得前面例行扯淡的部分反而應該加長些(……),不過要是繼續按照這個勢頭進展下去,全變成扯閑篇可就不妙了,所以話題趕快收回來,之前只是大略的介紹了如何來構建簡單的關卡以及部分基礎功能的使用,但如果繼續依照之前的思路進行下去,很容易就會遇到「有思路,但不容易實現」的問題

對象篩選這種比較玄學還有spread不會更新ID這種更玄學的東西暫且不論,想要得心應手,歸根結底還是要搞明白事件運行的原理,把黑箱拆開,知道這玩意怎麼跑的,才能更好地造自己的輪子(咦?)。這些東西比較雜亂也比較抽象,我只能盡量做到說完以後不讓人更迷糊,先說一聲抱歉

事件是什麼?就是之前打開編輯器以後那一堆對勾或者豎著排一大長串的東西,Action-Condition-Event,基於條件-動作的事件系統,而它運行的方式,說白了非常簡單,那就是「順序執行」,而在順序執行之外,心細的人可能早就發現了,這條件的顏色咋不一樣呢,有的就和路易吉與塞爾達,啊不,林克的帽子一個顏色:綠色,拖一拖拽一拽換換順序又變成了紅色——沒錯,這便是第二個要點,通常條件(Normal conditions)與立即條件(Immediate conditions),而立即條件中,最重要的一類,便是快速循環(Fastloop),立即條件的執行模式,又有些類似彙編語言中的代碼段……

舉例說明,假設有這樣一行事件

而許許多多這樣的事件連在一起,就組成了事件列表,也就是你在編輯器中所看到的東西

那麼程序就會依照事件1→事件2→事件3→……→事件N的順序運行,當事件N執行完畢後,事件指針會回到事件1,開始重複執行,這種主循環與程序的幀數有關,每幀循環一次

再次回到其中一行事件

程序在運行之時,會依次檢測條件1→條件2→……→條件N,在均滿足的情況下,繼續執行動作1→動作2→……→動作N

也就是說,如果在一次循環中,處於上方的事件A滿足條件執行的結果使得事件B滿足條件,那麼在該次循環中,事件A、B均會被執行

在special condition中,專門有一類limit conditions,限制條件,來控制事件的循環,例如該事件僅運行一次,該事件在循環中僅運行一次(與上一條不同,重新滿足條件後,依舊會執行一次),每次執行到該事件後重複N次,以及在指定時間內該事件不被執行

舉例說明,例如你要為遊戲配置一個esc選單,按下esc呼出,再次按下esc隱藏,至於按鈕與菜單底板的坐標移動外加激活與否暫且不做討論,非常直觀的一個想法便是

事件A:條件:如果ESC被按下菜單並未呼出動作:呼出菜單激活按鈕----------------------事件B:條件:如果ESC被按下菜單已經呼出動作:隱藏菜單禁用按鈕

非常完美,看不出來漏洞是不是?那麼讓我們嘗試執行——

菜單呼不出來對不對?

那麼問題出在哪裡了呢?讓我們一行一行的看,當事件A被執行後,滿足條件,菜單呼出,此時剛好滿足事件B的條件,菜單並不是沒有被呼出,而是在一幀之內呼出後便又被隱藏了!由於畫面每幀更新一次,這些操作發生在畫面更新前,自然就看不到菜單了

想要修正這個錯誤,單純的交換事件AB的位置

事件B:條件:如果ESC被按下菜單已經呼出動作:隱藏菜單禁用按鈕----------------------事件A:條件:如果ESC被按下菜單並未呼出動作:呼出菜單激活按鈕

當需要打開菜單時,程序依照預期運行,然後你就會發現:菜單又TM關不上了……

正確的解決方案有許多:

例如增加一個延時指令,在指定延時後才激活某開關,並且向菜單關閉條件中添加該開關為啟用,同時在關閉菜單後將該開關關閉;或者在那些不需要關卡運行時間的場景中,在打開菜單後將運行時間歸零,同時為菜單關閉增加「運行時間大於XX秒」條件;亦或在為關閉條件增加「restrict」指令來使其在一段時間內不被執行……


好了,這一次就先到此為止,下次我們將聊聊立即條件,也就是換了位置會變色的這哥們,官方描述為:

immediate conditions, are executed only when the originating event

occurs. For example, the mouse click condition only occurs when the user

clicks. These conditions can therefore be true at any moment in your

application

直白的理解,便是這條件一旦滿足,就會立即檢測相應的事件,在編輯器中立即條件會被標註為綠色

但立即條件不作為事件的首個檢測條件時,就會變為紅色

當立即條件變為紅色以後,會發生些什麼,說是肯定會說,只是不知道EP2會是什麼時候就是了(逃

(被打死

推薦閱讀:

如果不服輸,就接著往前走

TAG:ClickteamFusion | 獨立遊戲開發 |