Cranky

Development remains slow after trying to fit time for it into a surprisingly busy schedule. Happily the only deadlines I have are the one I impose upon myself. A weekly update seems a reasonable pace, and here is the next one.

The Taito DS Paddle Controller in white.

The crank was the primary draw to the Playdate for me. Rotational controls are rare on consoles. The Atari 2600 had probably the most widely-known paddle controller, and the latest official paddle controller I’m aware of is the one for Nintendo DS that Taito produced, and that was only released in Japan. Thumbsticks can approximate rotational control, but they’re not ideal for it.

So here on the Playdate we have, not a paddle, knob or dial, but a crank, and to my knowledge the first time I’ve seen a crank used as a video game control. My first thought upon seeing it was that it might be used to charge the Playdate’s battery, like it’s a wilderness survival console. This is unfortunately not the case, but it is still a unique control that opens up some fun interaction possibilities.

Photo of a standard yellow mechanical tally counter with the parts labelled.
This looks just like the one I keep on my desk except that it’s yellow. Seemed an appropriate color for this post.

On a standard mechanical tally counter, twisting the knob on the side advances all four tumblers. This can be used to to quickly reset the count to 0, or technically it can also be used to assist with setting the count to a specific amount, but the user would still need to use the plunger to fine tune the number by 1’s.

With the Playdate’s crank I can provide a way to rapidly change numbers with ease and also at a finer level than 1,111 at a time.

Unlike a dial, a crank is easy to turn by accident when it is open, and in order to stow it, one must rotate it into the correct position, so I can’t simply have the crank alone drive setting the count. In order to have the user only change the count deliberately when using the crank, they must hold the A button while cranking in order to engage it.

My first attempt used playdate.getCrankTicks(ticksPerRevolution), initially with a value of 10, which advanced the counter by 10 for every complete rotation. This worked well enough but required a lot of tedious cranking to set the count to higher numbers. However, setting getCrankTicks() to a much higher amount turned out to pass multiple ticks in a single frame if I spun the crank fast enough. Fortunately the ticks queue up so the number comes out correct in the end, but after spinning the crank very quickly, the count would continue to catch up after stopping. I want the crank to feel as though it is driving the count mechanically, so having it continue to count when not physically rotating the crank doesn’t do the trick.

A screenshot showing the current state of development. Who needs fancy shaders, or any graphics for that matter?

Fortunately, the SDK provides a number of ways to determine what the player is doing with the crank, so next I plan to try using playdate.getCrankChange(), which simply returns how much the crank has changed since the last time it was called, and calculating the angle-to-number value manually instead of relying on the crank passing fixed positions. This should feel more like the crank is driving a gear that can be engaged at any arbitrary point.