1

私が開発している Elm (0.13) ゲームでは、再構成可能な入力が必要です。これのために私が持っているモデルの簡略化されたバージョンは

type Controls = {
    up:    KeyCode,
    down:  KeyCode,
    left:  KeyCode,
    right: KeyCode
}

type Player = {
    ...
    controls: Controls,
    ...
}

type Game = {
    state: State,
    players: [Player]
}

ゲーム ループについてはfoldp、入力がゲームの現在の状態に依存する標準的な構造を使用しています。これまでのところ、次のことを試しました。

gameState =
    let 
        initialGame = (newGame initialActive)
    in
        foldp update initialGame (input initialGame)

しかしもちろん、入力信号生成関数 ( input : Game -> Signal Input) は、変更されたゲーム状態ではなく、最初のゲームを使用し続けます。

これに対する解決策を見つけるためにインターネット全体を検索しましたが、この方向には何も見つかりませんでした。(モデルにコントロールを含めることによって) 私が試みていた方法でそれを行う方法はありますか、またはコントロール自体に信号を送ることによってモデルからコントロールを解放する必要がありますか?

4

1 に答える 1

2

ここに密接に関連する質問があります:カスタム キーボード コントロールの作成 [Elm]

Controls必要に応じて、ゲームの状態 の一部を保持できます。これを行う方法は、 に基づいて入力するのではinitialGameなく、必要なものをいつでも抽出できる、より一般的な入力を取得することです。この場合、それは になりますKeyboard.keysDown。次に、次を使用して各プレーヤーの入力を取得できます。

playerInput : Controls -> [KeyCode] -> { x : Int, y : Int }
playerInput {up,down,left,right} kd = 
  List.filter (\ky -> List.member ky [up,down,left,right]) kd |>
    List.foldl (\ky st -> if | ky == up    -> { st | y <- st.y + 1 }
                             | ky == down  -> { st | y <- st.y - 1 }
                             | ky == left  -> { st | x <- st.x - 1 }
                             | ky == right -> { st | x <- st.x + 1 }
    ) {x=0,y=0}

Controlsから削除したい場合Gameは、 の入力の定義に引き上げることができますfoldp

于 2014-12-21T11:59:25.003 に答える