2014-12-21 3 views
1

필드를 작동 시키려고했지만 계속 실패하고 있습니다. 또한 예제를 찾으려고했지만 엘름 0.14를 사용하는 유일한 예제는 Elm 0.13에서 사용할 수없는 새로운 채널 API를 사용하는 경우입니다. Elm의 필드 사용 방법 0.13

그래서 나는 catalog

import Graphics.Input.Field (..) 
import Graphics.Input (..) 

name : Input Content 
name = input noContent 

nameField : Signal Element 
nameField = field defaultStyle name.handle identity "Name" <~ name.signal 

에서 제공되는 예에서 시작 그리고 필드를 사용하기 위해 나는

main : Signal Element 
main = Signal.lift2 display Window.dimensions gameState 

display : (Int,Int) -> GameState -> Element 
display (w,h) g = 
    container w h middle <| 
     collage gameWidth gameHeight 
      (if | g.state == Menu -> 
        [ rect gameWidth gameHeight 
         |> filled black 
        , toForm nameField 
        , plainText "*The name entered in the nameField*" 
        ] 
       | otherwise -> [] 
      ) 

을 시도하지만 다음과 같은 오류

Expected Type: Signal.Signal Graphics.Element.Element 
Actual Type: Graphics.Element.Element 
가 계속

요소가 더 이상 신호가 아닌 이유 ... 함수 정의에 명확하게 명시되어 있습니다. 신호를 출력해야합니다, 맞습니까? 이제 어떻게하면 변수를 사용할 수 있을까요?

답변

1

Elm 0.13에는 다소 혼란스러운 유형 오류 메시지가 있습니다. 예상/실제는 일반적으로 바뀝니다. 이 경우 문제는 을 display : (Int,Int) -> GameState -> Element에 사용하면 발생합니다. display은 순수한 (신호가 아닌) 기능이지만 순수하기 때문에 아무 곳에 나 신호를 사용할 수 없습니다. 이 문제를 해결하려면 nameField 신호를 레벨 위로 올리면 main이됩니다. 필드에 입력 된 것을 사용하려면 입력 신호를 사용하십시오.

main : Signal Element 
main = Signal.lift4 display Window.dimensions gameState name.signal 

nameField : Content -> Element 
nameField = field defaultStyle name.handle identity "Name" 

display : (Int,Int) -> GameState -> Content -> Element 
display (w,h) g currentContent = 
    container w h middle <| 
     collage gameWidth gameHeight 
      (if | g.state == Menu -> 
        [ rect gameWidth gameHeight 
         |> filled black 
        , toForm (nameField currentContent) -- use something other than `currentContent` here to influence the field content. 
        , plainText currentContent.string 
        ] 
       | otherwise -> [] 
      ) 
+0

그래서이 동작을 게임의 메뉴로 확장하고 싶습니다. 귀하의 회신에서 내가 이해 한 것은, 그 신호가 시간과 관련이 있는지 여부에 상관없이 모든 신호를 '표시'에 대한 추가 입력으로 보내야한다는 것입니다. 그러면 메뉴가 표시되지 않을 때 무시되고 메뉴가 팝업되면 관련성이 높아집니다. 이것은 많은 의미가 있습니다. 이제는 내 유일한 관심사는 어떻게 정보를 현장으로 보낼 수 있을까요? 현재의 가치를 어떻게 되돌려 보낼 수 있습니까? –

+0

나는 무엇을 의미하는지 완전히 모르겠다. 필드에 표시된 정보에 영향을주고 싶습니까? 코드를 편집하여 필드에 영향을 줄 수있는 곳을 더 자세히 볼 수 있습니다. – Apanatshka

+0

예를 들면. 이름이있는 플레이어가 있습니다. 그래서'name'은'Player' 타입의 필드입니다. 메뉴가 열리면 플레이어 이름이 필드 밖으로 나와 필드에 채워집니다. 이제 사용자는 다른 이름으로 재생하려는 경우 필드의 이름을 변경할 수 있으며 필드는 새 이름으로 업데이트됩니다. –