2012-11-17 89 views
0

作爲一個實驗,我已經建立了一套模擬的齒輪連接到電機並使用OpenGL/GLUT進行渲染。目前Wire網絡的唯一輸入是Time。我想用鍵盤來控制改變電機的速度。我還想按照Fix your Timestep!中所述從幀速率中分離物理時間步。將Netwire網絡連接到OpenGL/GLUT回調函數

這意味着我需要從三種不同的GLUT回調(keyboardMouseCallback,idleCallbackdisplayCallback)運行三種不同類型的輸入。我不清楚如何將Netwire與GLUT回調進行整合。

回答

3

GLUT對於需要控制諸如Netwire之類的主循環的框架有些敵意。這是可能的,但你可能不得不使用IORef或類似的東西。我知道最知道網絡友好的OpenGL管理器是SDL,但當然你也可以試試Nicol的GLFW建議。否則,你將不得不從多個事件處理程序中走線。

對於處理實際的鍵盤輸入,我建議您將事件信息添加到您正在使用的任何基礎monad(讀者monad可能是最佳解決方案)。然後執行,也就是說,一個keyDown線,只要給定鍵被按下產生:

keyDown :: (Monoid e) => Key -> Wire e (Reader GuiState) a a 

現在你可以做這樣簡單的東西:

position = integral_ 0 . speed 
    where 
    direction key dir = dir . keyDown key <|> 0 
    speed = direction Right 1 + direction Left (-1) 
1

你有沒有考慮......不這樣做?

有沒有法律說,你必須使用(免費)GLUT。 GLFW(幾乎)是可勝任的,並且它允許您根據需要控制渲染循環。這是一個基於輪詢的API,所以任何回調只會在你想要的時候纔會發生。

+0

是的,我有。但我已經有了很多GLUT的經驗,而且我只是在學習Netwire。如果可能的話,我想堅持我所知道的。 –