Making a free cursor feel good on gamepad

Though I wasn’t involved in the initial creation of the free cursor feature for the original release of Destiny, I was involved extensively in the rework and updates to the feature as part of my work on Destiny 2: Forsaken, in order to make it meet the expanding needs of new systems and features in that release. I’ve worked on a number of projects since to help build free cursors for various games, as well as help consult on projects looking to build their own. 

There are four key components needed in order to make a free cursor that feels good to use on gamepad:

  1. Size

  2. Speed & Counterscrolling

  3. Friction

  4. Feedback


Size

Gamepad analog sticks do not have the movement dexterity of a mouse, therefore a free cursor intended for gamepad input needs to be significantly larger. Ideally, it should be about 50-100% of the size of the average hit-testable object in the UI. Additionally, screens should be designed with a lower content density than something intended for mouse & keyboard only hardware, to reduce the amount of precision required by the gamepad cursor.


Counter-scrolling & Speed

This is an aspect that many games attempting to mimic Destiny’s cursor miss, and the result is a much less responsive-feeling gamepad input. The speed of the cursor itself isn’t that quick in Destiny, but because both the foreground UI and background layers parallax counter to cursor input, the end result feels a lot more responsive. The movement of the cursor should remain constant, but counter-scrolling parallax of background layers and foreground and UI elements will make the movement feel a lot snappier, especially across large distances. When implementing parallax scrolling, the most wide/open/large UI screen should be used as a baseline, and allow for each screen to be tuned individually, as well as per layer. Having at least one (preferably two or more) layers of background and UI-level assets counter-scrolling with cursor movement will help the UI to feel a lot more dynamic. It doesn’t need to be a ton of movement, a little goes a long way. With the example of the subclass screen in Destiny seen here, there are 4 different parallax layers: the UI assets in the foreground, then in the background there are 3 different parallax layers for the key art, smoke, and ember VFX.


Friction

Rather than using a gravity or auto-aim method of cursor movement, friction tends to feel the best for players. A lot of games have tried using stickiness or suction into elements instead, but that tends to feel sludgy and in some cases even reduces the usability of a cursor. Hit-testable widgets should trigger cursor friction when the cursor passes over them. This should be tunable both on a per-widget and per-screen basis, as screens with a higher density of objects will need to have less friction in order to feel good to navigate.  There should be enough “stickiness” that it’s easy to select things, but not so sticky it feels like a slog to move around the screen.


Feedback

The best-feeling UI always gives players a variety of subtle feedback in multiple forms including visual, audio, and haptic. In addition to receiving feedback when passing over a hit-testable element, the cursor should also provide feedback when an action happens, and differentiate between constructive/destructive and other types of actions.

Visual

For the Destiny cursor, we used a slight reduction in size, which paired with the aforementioned friction makes it easier to navigate without over-shooting movement. We also implemented a subtle “focus in” animation as a visual indication to show players when they had hit a selectable object.

On some titles I’ve worked on, we went even further with this, using animation and visual states of the free cursor to communicate information to the player about the action they were taking, or about the type of object they were highlighting, or using it for narrative emphasis.

Haptic

Haptic feedback should be tuned alongside friction levels – when the cursor starts getting friction from a widget, it should trigger a very subtle haptic “bump.” We don’t want to overload the player with vibration, and only use extended haptic triggers for important moments like notable destructive actions etc. One of the best examples of this around is the Nintendo Switch platform UI, which I always point to as the goalpost for haptic feedback.
Haptic feedback can be tricky for titles launching on multiple platforms or PC, as vibration will need to be tuned for different hardware types individually in order to feel good. The motors in various controllers from Xbox to Playstation use different motors and often interpret vibration levels differently, so vibrations can feel drastically different from one gamepad type to the next. Additionally, many gamepads will have multiple motors for vibration, which allow for fine-tuning of haptics, as different motors are used for strong vs subtle vibrations, but some gamepads use their motors differently from others. For example, Xbox controllers tend to rumble a lot more intensely than Playstation or Switch, and the high-speed motor on the Switch gamepad is often far more subtle than Playstation.