2012-10-04 42 views
0

我正在嘗試在ActionScript 3中編寫一個roguelike遊戲。在這種遊戲類型中,角色和項目以複雜和不可預知的方式進行交互,例如遊戲中發生的長鏈可能發生在單圈的空間中,每一圈都是從最後一圈開始發生,而且經常發生在前一圈之前已經正確完成。當我發現在這樣混亂的情況下,我需要立即提示玩家輸入並立即採取行動,在其他事情繼續發生之前,似乎會出現一個問題。ActionScript 3:在複雜的操作鏈中等待用戶輸入

如果用戶界面運行在一個單獨的線程上,使得玩家可以輸入輸入,並且我可以在不必從當前正在執行的整個函數堆中返回的情況下接收它,那麼理智的方法就是直接調用無論嵌套的功能調用,我碰巧在裏面)一個函數,等待玩家輸入,然後作用於它。但在AS3中,這是不可能的;在返回之前等待輸入的函數只會導致程序掛起。

爲了迴應這種問題,人們說正確的解決方案是將我的操作分解成幾塊,以便我可以等待用戶輸入,然後恢復我正在做的事情。這很可愛,適合於那些通常提供這些建議的微不足道的例子,但在這種情況下,不可預知的和經常隨機發生的事件可能導致一次連鎖數十個複雜的事件,其中任何一個都可能突然需要用戶在任何時候都可以輸入,「恢復我在做的事情」的想法似乎是一項艱鉅的任務。

我沒有別的選擇,只能將遊戲中發生的所有事情都作爲一個數據結構來存儲,這個數據結構描述了事件的所有細節,包括它到目前爲止的進展情況,以便我可以突然退出我正在做什麼等待玩家的輸入,然後重新構建事物的前一個狀態,無論它可能有多精細?與簡單地從任何地方調用「get_input」函數然後繼續我的快樂方式相比,這項任務的繁瑣程度似乎足以阻止我或任何人使用AS3。我錯過了什麼?有沒有辦法解決這個問題,這不會讓我瘋狂,或者我應該把這個看作AS3是這個工作的錯誤工具?

+0

我沒有一個很好的直接回答的方法來做到這一個同步呼叫,但你可能會從AS3相當新的東西中受益的是工人,這實質上是我見過的最多在單獨的Thread上做事情的條款,儘管我從閱讀了解實現後知道它不像Java線程那樣靈活,但爲了簡化操作,有一些更嚴格的限制。 – shaunhusain

+0

我可以看到的另一個選擇是讓遊戲邏輯基於計時器執行,並簡單地停止該計時器並適當地重新啓動計時器,但這可能會導致這些進程的整個問題出現問題,因此它們只會暫停一半根據計時器是否正在運行,允許完全執行一些功能或不調用它。 – shaunhusain

回答

0

關於數據結構 - 我想是的,你做對了。關於用戶輸入的「即時」請求 - 您應該在某個地方定義一段時間,任何持續時間少於此時間的事件都被認爲是即時事件,並且不應要求用戶輸入「continue?」行。現在,你希望有一個事件觸發比主事件更短的事件,這可以完成,AS3對於這種類型的事件處理是正常的 - 但是,爲了讓玩家能夠提供輸入,你有釋放enterFrame監聽器或用於處理事件鏈的任何過程。因此,舉例來說,你可以這樣做:

var userInputRequested:Boolean=false; 
while (!userInputRequested && (yourEventsToBeProcessed>0)) { 
    userInputRequested=processOneTurnOfOneEvent(); 
} 

顯然,你的遊戲應該然後能夠處理的時間一次量子事件,稱事件「你的性格是在裝甲將」因爲我已經看到了像這樣漫長事件的roguelike。好的,這個事件被推送到你的事件鏈中,你的事件處理器現在是非零的。這個循環可以處理一個敷料事件和計數遊戲時間(如果你錯過了這個,你遇到了很大的麻煩,它應該符合「當我們到達最後一個事件來處理這個量子,推進一個量子和),直到事件成功完成,或者會彈出另一個隨機事件(「狗頭人進入視圖!」 - 它可能不需要用戶輸入,但「狗頭人在攻擊範圍內」可能)。基本上,「移動你的世界」這個事件在這個鏈條中總是非常活躍,但是不會計入在該循環中檢查的櫃檯中,否則你的玩家將永遠等待這個世界。現在,玩家可以看到這樣的事件,如果「processOneTurnOfOneEvent()」將返回true,循環結束,那麼enterFrame偵聽器可能會爲用戶提供一種輸入方式,耐心等待,直到接收到輸入。