2013-03-01 37 views
9

我目前正在研究利用無功香蕉和SDL的小遊戲。由於目標主要是瞭解更多有關反應香蕉和FRP的知識,我嘗試使用動態切換來設置一系列遊戲對象,但目前尚未取得多大成功。無功香蕉動態事件切換

在Bartab示例中,我使用事件切換的唯一示例發現,最終觸發集合中新條目創建的事件是從事件網絡外部獲取的,而不是使用內部事件。我的問題是:這是做這件事的唯一方法,還是這個例子的特例?

在反應式香蕉中是否還有更多動態事件切換的例子?

從我所瞭解的我得到的瞬間t(任何時候行爲a)中,使用execute創建Event t(Anytime Behavior a),然後反過來用它來更新攜帶集合的行爲。 時刻t(任何時候行爲a)是使用觸發事件創建的行爲上的trimB創建的。如果此觸發事件來自事件網絡,則不會編譯錯誤消息「無法推斷(t〜t1)」。我不確定〜到底意味着什麼,但顯然會引發錯誤,因爲事件網絡的兩個Frameworks值(t)和這個新的Moment值是不同的。因此,長話短說,我不明白事件轉換在反應性香蕉的作品,我不知道爲什麼。理論上它應該相對簡單。

編輯:

-- Event Network 
-- ========================== 
setupNetwork :: forall t. Frameworks t => (EventSource Command, EventSource()) -> IORef SpriteMap -> GameMap -> Moment t() 
setupNetwork ((addHandlerE, _), (addHandlerT, _)) sprites map = do 

     -- Input Events 
     ---------------- 
     eInput <- fromAddHandler addHandlerE -- Player Commands 
     eFrame <- fromAddHandler addHandlerT -- Event on each Frame 

     let 
      [...] 


      eSpawnEvent :: Event t (DSCoord) 
      eSpawnEvent = extractCoord <$> eLeftClick 
       where 
         extractCoord (LeftClick c) = c 

      spawnPos :: Frameworks s => Moment s (AnyMoment Behavior DSCoord) 
      spawnPos = trimB $ stepper (0,0) eSpawnEvent 

     eSpawnPos <- execute $ (FrameworksMoment spawnPos <$ eSpawnEvent) 
       [...] 

我只是試圖從示例鏡像newEntry/eNewEntry,只是使用普通的事件來創建新的行爲。這會在spawnPos中產生「無法推斷(t〜s)」的錯誤。

EDIT2:

它的工作原理,但現在同樣的錯誤出現在哪裏我使用的執行創建該事件的線。 「無法演繹T〜T1」

+0

我想可能有很大的幫助,如果您發佈的示例代碼無法編譯? – 2013-03-02 08:36:46

+0

我用代碼示例更新了問題。 – AsgarZigel 2013-03-02 10:31:58

回答

4

在我看來,該代碼是除了一個小的失誤基本上是正確的:

編譯器正確地抱怨spawnPos有(多態)開始時間s而開始時間eSpawnEvent固定爲t,這是不同的。後一時間通過setupNetwork類型簽名中的forall t部分進入範圍。換句話說,t代表整個網絡的開始時間。

簡單的修復方法是有問題的行

spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord) 
+0

謝謝,它有幫助,但不完全。 – AsgarZigel 2013-03-03 21:59:15

+0

哦?我很高興透露更多信息。 :-) – 2013-03-04 08:55:45

+0

我再次編輯了這個問題,以防你沒有看到它。這仍然是一個錯誤。 – AsgarZigel 2013-03-04 09:24:01