Я пытался заставить поля работать, но продолжаю терпеть неудачу. Я также пытался найти примеры, но единственные примеры, которые я смог найти, — это использование Elm 0.14, в котором используется новый Channel API, которого нет в Elm 0.13.
Поэтому я начал с примера, предложенного в каталоге< /а>
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
Почему элемент больше не является сигналом... В определении функции ясно сказано, что он должен выводить сигнал, верно? Теперь, как я смогу ввести имя, которое затем смогу использовать внутри переменной?
display
. Затем они будут игнорироваться, когда меню не отображается, и станут актуальными, когда меню всплывет. Это имеет большой смысл. Теперь меня беспокоит только то, как я смогу отправить информацию обратно в поля? Как я могу отправить текущее значение обратно? 23.12.2014name
будет полем типаPlayer
. Когда открывается меню, оно зачитывает имя игрока за пределами поля и заполняет его на поле. Теперь пользователь может изменить имя в поле, если он захочет играть под другим именем, и поле будет обновлено с новым именем. 23.12.2014name = input { noContent | string <- "InitialName"}
. В противном случае он должен быть частью вашегоGameState
, и вы можете использовать стандартные конструкции if или case для разделения возможных состояний в функцииdisplay
и использовать что-то другое, кромеcurrentContent
. 23.12.2014Content
. Все это работает, но это заставило меня задуматься о том, что делает этот параметр name.handle? Я могу изменить его с помощью дескриптора другого ввода, и он все еще работает, как и раньше, ничего не меняется. Так что дает? 23.12.2014Input
во время выполнения программы, изменения, внесенные кем-то, должны быть отправлены этому другомуInput
. Если вы видите другое поведение, это может быть ошибкой. 23.12.2014