Вчера я спросил, как я могу функционально обрабатывать ввод с клавиатуры (с помощью ScalaFX). Благодаря помощи @alfilercio я придумал что-то вроде этого:
class InputHandler {
private val goUp: Int => State => State = step => state => State(state.x, state.y - step)
private val goDown: Int => State => State = step => state => State(state.x, state.y + step)
private val goLeft: Int => State => State = step => state => State(state.x - step, state.y)
private val goRight: Int => State => State = step => state => State(state.x + step, state.y)
private val doNothing: Int => State => State = step => state => state
private var behaviour: Int => State => State = doNothing
def keyPressedHandler(key: KeyEvent): Unit = {
behaviour = key.getCode match {
case KeyCode.Up.delegate => goUp
case KeyCode.Down.delegate => goDown
case KeyCode.Left.delegate => goLeft
case KeyCode.Right.delegate => goRight
case _ => doNothing
}
}
def keyReleasedHandler(key: KeyEvent): Unit = behaviour = doNothing
def update: Int => State => State = behaviour
}
Затем есть средство обновления (рабочее название), которое обновляет состояние в зависимости от прошедшего времени, некоторой внутренней логики и/или пользовательского ввода:
def update(state: State)(implicit inputHandler: InputHandler): State = { ... }
При таком подходе основные классы могут оставаться чистыми, и не требуется ни одной переменной. Но все еще есть проблема с самим InputHandler. Я имею в виду, что переменная поведения делает его с полным состоянием. Этот InputHandler добавляет некоторую абстракцию в ScalaFX, используемую для создания графического интерфейса. Метдоды keyPressedHandler/keyRelasedHandler устанавливаются как обработчики событий сцены ScalaFX соответственно. В заключение я ищу способ удалить переменную состояния (поведение) из этого InputHandler. Я пытаюсь понять функциональный подход из образовательных соображений, поэтому постоянно беспокою вас этим случаем :)