2013-03-01 6 views
9

현재 리 액티브 바나나와 SDL을 사용하는 작은 게임을하고 있습니다. 목표는 주로 반응성 바나나와 FRP에 대해 더 많은 것을 배우는 것이므로 동적 인 전환을 사용하여 게임 개체 모음을 설정하려고 시도했지만 지금까지는 큰 성공을 거두지 못했습니다.리 액티브 바나나의 다이나믹 이벤트 스위칭

이벤트 전환을 사용하는 유일한 예인 Bartab 예에서 컬렉션의 새 항목 생성을 궁극적으로 트리거하는 이벤트는 내부 이벤트를 사용하는 대신 이벤트 네트워크 외부에서 수집됩니다. 내 질문은 : 이것을 수행하는 유일한 방법인가 아니면이 예를위한 특별한 경우인가?

반응성 바나나에서 사용되는 동적 이벤트 전환의 예가 더 있습니까?

나는 모멘트 t (Anytime Behavior a)를 얻었으므로 execute를 사용하여 Event t (Anytime Behavior a)를 만든 다음 컬렉션을 운반하는 Behavior를 차례로 업데이트하는 데 사용합니다. 모멘트 t (애니 타임 동작 a)는 트리거링 이벤트에서 생성 된 동작에 대해 trimB를 사용하여 생성됩니다. 이 트리거 이벤트가 이벤트 네트워크에서 시작된 경우 "Could not dell (t ~ t1)"오류 메시지와 함께 컴파일되지 않습니다. 정확히 ~는 무엇을 의미하는지 모르겠지만 이벤트 네트워크의 두 Frameworks 값 (t)과이 새로운 순간 값이 다르기 때문에 분명히 오류가 발생합니다.

짧은 이야기로, 반응 바나나에서 이벤트 스위칭이 어떻게 작동하는지 이해할 수 없으며 이유가 확실하지 않습니다. 이론적으로는 비교적 직설적이어야합니다.

편집 : 나는 단순히 새로운 동작을 만들 정상적인 이벤트를 사용하여 예로부터 newentry 파일/eNewEntry를 반영하려고 노력

-- 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) 
       [...] 

. 이렇게하면 spawnPos에서 "추론 할 수 없습니다 (t ~ s)"오류가 발생합니다.

Edit2가 : 그것은 작동하지만, 지금 같은 오류가 나는 이벤트를 생성하는 실행 사용하는 라인에 온다

. "t을 추론 할 수 없습니다 ~ T1은"

+0

에 위반 라인을 변경하는 것입니다? –

+0

질문을 코드 예제로 업데이트했습니다. – AsgarZigel

답변

4

코드가 사소한 실수를 제외하고 기본적으로 정확하다는 것을 나에게 나타납니다

컴파일러는 바르게 spawnPos은 (다형성) 시작 시간 s을 가지고 불평 시작 시간 동안 eSpawnEvent의 값은 t으로 고정되어 있습니다. 후자의 경우 setupNetwork의 형식 서명 인 forall t 부분을 통해 범위에 포함됩니다. 즉, t은 전체 네트워크의 시작 시간을 나타냅니다.

간단한 수정은 당신이 당신의 예제 코드 컴파일되지 않습니다 게시 경우가 많은 도움이 될 생각

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

감사합니다. 도움이되었지만 완전히는 아닙니다. – AsgarZigel

+0

오? 더 많은 정보를 공개하게되어 기쁩니다. :-) –

+0

나는 당신이 그것을 보지 못했을 때를 대비하여 질문을 다시 편집했다. 여전히 같은 오류입니다. – AsgarZigel