The ticks did change yes, I originally had it testing the state first but 
figured, eh, I was wanting to see what a keyboard action mapper would be 
(which could easily be fed into a Keyboard mapper, ignore the filters 
stuff).

I still find mapping the keyboard events 'inside' subscription to be very 
noisy.  And I still think think a single subscription for a keyboard filter 
would be best to prevent running and testing multiple.  Hmm, maybe 
something like:
```elm
  Keyboard.keyMapChar
    case d.state of
      Running ->
        [ ( 'P', KeyDown, PauseToggle )
        , ( ' ', KeyDown, JumpDown )
        , ( ' ', KeyUp,   JumpUp )
        ]
      _ ->
        [ ( 'P', KeyDown, PauseToggle )
        ]
```

I am one of those that hate inline conditionals and prefer to hoist it out, 
so yes I like the duplicated PauseToggle, makes it explicitly obvious that 
it is working in each state instead of noise like ++ and such making you 
have to think more.  However I think that is wonderfully readable and could 
easily register and unregister subscriptions as needed while making 
configurable key mapping much easier (since no need to convert to if/then 
repeating or dict lookups or so).

Or as a full example the above could be:
```elm
subscriptions : GameData -> Sub GameMsg
subscriptions =
  case d.state of
    Running ->
      Sub.batch
        [ AnimationFrame.diffs Tick
        , Keyboard.keyMapChar
          [ ( 'P', KeyDown, PauseToggle )
          , ( ' ', KeyDown, JumpDown )
          , ( ' ', KeyUp,   JumpUp )
          ]
        ]
    _ -> Keyboard.keyMapChar [ ( 'P', KeyDown, PauseToggle ) ]
```

Which I also think is far more readable (embedding state tests are always 
unreadable).

A `Keyboard.keyMapFn` could also make the first element of the tuple be a 
function that is passed in a keycode so it can do its own testing via 
returning True/False.  Or could just make it a `Keyboard.keyMap` where the 
first element is a subtype to become `( KeyMap.Char 'P', KeyDown, 
PauseToggle )` or `KeyMap.Fn` or whatever other options.  Would make it 
easier to expand later as well with more functionality if ever desired.

As always, lots of ways to go with various designs.


On Wednesday, August 10, 2016 at 8:53:32 PM UTC-6, Janis Voigtländer wrote:
>
> You did change the behavior, though. Specifically, AnimationFrame.ticks is 
> always running in your version, even when the game is paused. Similarly for 
> some of the other subscriptions. As discussed in the generic subscription 
> filtering thread, it's best to turn off subscriptions completely whenever 
> possible. Of course, you could adapt your version of the 
> subscriptions-function to bring the turning-off-of-subscriptions back. 
> However, the result will be again more complex and less readable, I think. 
> You will have the dealing with subscriptions distributed over different 
> places in the code, while the original version and also the version 
> improved by selective Keyboard functions has only one. 

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to