2013-05-10 6 views
7

मैं अपने यात्री में बिंदु पर हूं, मैं खेल राज्य में खिलाड़ी-स्वतंत्र अपडेट को संभालने की कोशिश कर रहा हूं। संदर्भ के लिए, परियोजना here है (इस प्रश्न के लिए डेवेल शाखा प्रासंगिक है)।कार्यात्मक केला यात्री - टाइमर और खिलाड़ी स्वतंत्र घटनाक्रम

Libraries/Universe/GameState.hs में एक फ़ंक्शन, updateGS है जो गेम स्थिति के सभी प्लेयर अपडेट को संभालता है। EventNetwork अभी इस तरह दिखता है।

makeNetworkDescription :: AddHandler PlayerCommand -> 
          AddHandler() -> 
          TChan GameState -> 
          IO EventNetwork 
makeNetworkDescription addCommandEvent tickHandler gsChannel = compile $ do 
    eInput <- fromAddHandler addCommandEvent 
    eTick <- fromAddHandler tickHandler 
    let bGameState = accumB initialGS $ updateGS <$> eInput 
    eGameState <- changes bGameState 
    reactimate $ (\n -> (atomically $ writeTChan gsChannel n)) <$> eGameState 

इस टाइमर को लागू करने में समस्या सारे उदाहरण मैं पर ध्यान दिया है एक उपयोग के मामले मेरा, भौतिकी सिमुलेशन से अलग होता है। इस खेल में कोई भौतिकी शामिल नहीं है। मैं गेम टाइम्स को प्लेयर क्रियाओं से स्वतंत्र मूल्यांकन करने के लिए टाइमर का उपयोग करने की कोशिश कर रहा हूं। अभी के लिए, केवल एक चीज जिसे मैं प्रबंधित करना चाहता हूं वह हाइपरस्पेस यात्रा है। पूरी तरह कार्यान्वित होने पर, एक ग्रह से दूसरे में जाने से Agent के location से Right Hyperspace बदल जाएगा। अब क्या होने की आवश्यकता है, यह है कि जब tick होता है, तो distanceTraversed एक से बढ़ता है। फिर distanceTraversed बराबर totalDistanceAgent का स्थान Left Planet बन जाता है।

तो EventNetwork के दृष्टिकोण से यह कैसा दिखता है?

let bHyperspace = accumB initialGS $ foo <$> eTick 

अब व्यवहार

let bBaz = (++) <$> bGameState <*> bHyperspace 

इस सही रास्ते है गठबंधन करने के लिए?

उत्तर

2

प्रश्न कुछ अस्पष्ट है और उत्तर देने में आसान नहीं है, लेकिन मैं अपना सर्वश्रेष्ठ प्रयास करूंगा।

पहले, अपने कोड को देखते हुए, मैं यह अजीब आप अखंड GameState प्रकार और updateGS कार्य करने के लिए "आउटसोर्स" है वास्तविक गेमप्ले तर्क यह है कि लगता है। अब, यह करने के लिए एक बुरी बात नहीं है, यह सिर्फ इस शैली में एफआरपी का उपयोग करने से कोई फायदा नहीं है। आप makeNetworkDescription फ़ंक्शन को पूरी तरह से हटा सकते हैं और इसके बजाय हाथ से addCommandEvent के साथ एक थैंडलर भी पंजीकृत कर सकते हैं।

एफआरपी का लाभ यह है कि आप खेल राज्य को व्यवहार और घटनाओं के नेटवर्क के रूप में मॉडल कर सकते हैं। यदि राज्य मॉड्यूलर पर्याप्त है, तो यह कोड को काफी सरल बना देगा।


दूसरा, हाइपरस्पेस यात्रा मॉडलिंग के बारे में आपके प्रश्न से संबंधित दूसरा।

-- indicates whether hyperspace travel is currently happening 
bTravelling :: Behavior t Bool 

-- increment travel distance, but only when travelling 
bTravelDistance :: Behavior t Distance 
bTravelDistance = accumB 0 $ (+1) <$> whenE bTravelling eTick 

-- calculate player location from travel distance 
bPlayerLocation :: Behavior t Location 
bPlayerLocation = 
    (\distance -> if distance > total then Left Planet else Right HyperSpace) 
    <$> bTravelDistance 

आप शायद एक खेल में इस प्रक्रिया को कई बार दोहराना चाहते हैं, हालांकि:

यहाँ एक तरह से यह करने के लिए है। दुर्भाग्य से, प्रतिक्रियाशील-केला वर्तमान में "पहले ऐसा करें, फिर ऐसा करें" अमूर्तता की पेशकश नहीं करता है। गतिशील घटना स्विचिंग है, लेकिन यह थोड़ा अनावश्यक हो सकता है।

+0

मुझे एहसास हुआ कि अद्यतन जीएस एक समस्या होगी, लेकिन मैं उस प्रश्न को दूसरे दिन के लिए सहेज रहा था। –

संबंधित मुद्दे