Skip to content

VibrationIndicator and ContinuousPatternVibrationController

VibrationIndicator and ContinuousPatternVibrationController (both from scenerystack/tappi) are the UI and control-flow pieces alongside vibrationManager: VibrationIndicator is a Node that visually represents whether vibration is currently active (useful for development/QA on a desktop where you can't feel the device vibrate), and ContinuousPatternVibrationController manages smooth transitions between vibration patterns so a pattern change doesn't feel like an abrupt jolt.

ts
import { VibrationIndicator, ContinuousPatternVibrationController } from 'scenerystack/tappi';
import { BooleanProperty } from 'scenerystack/axon';

A minimal example — VibrationIndicator

ts
const vibratingProperty = new BooleanProperty( false );

// A small phone icon whose screen color and zig-zag "vibration lines" reflect vibratingProperty.
const vibrationIndicator = new VibrationIndicator( vibratingProperty );

this.addChild( vibrationIndicator );

// In your animation-frame loop:
vibrationIndicator.step( dt ); // dt in seconds -- jostles the icon while vibratingProperty is true

Constructor — VibrationIndicator

ts
new VibrationIndicator( vibratingProperty: Property<boolean> )

Takes no options object — it draws a fixed-size phone icon (a dark panel, a white phone body, a screen, a home button, a speaker, and two zig-zag "vibration" Paths) and links directly to vibratingProperty to toggle the screen color ('lightblue' vibrating / 'grey' idle) and the visibility of the zig-zag lines.

VibrationIndicator methods

MemberDescription
step( dt )While vibratingProperty is true, jostles the two vibration-line Paths with a sinusoidal offset so they visibly shake; a no-op (net-zero motion) while idle

A minimal example — ContinuousPatternVibrationController

ts
// NOTE: requires a VibrationManageriOS instance -- see the warning below.
const controller = new ContinuousPatternVibrationController( vibrationManageriOS, {
  activePattern: [ 0.1, 0.1, 0.1, 0.3 ], // on/off intervals, in seconds
  repeat: true
} );

controller.start();
// In your animation-frame loop:
controller.step( dt ); // dt in seconds

// Queue up a different pattern -- it takes effect at the end of the current loop, not mid-pattern.
controller.setPattern( [ 0.05, 0.05 ] );

controller.stop();

Constructor — ContinuousPatternVibrationController

ts
new ContinuousPatternVibrationController( vibrationManageriOS: VibrationManageriOS, providedOptions: ContinuousPatternVibrationControllerOptions )

Options

OptionDefaultEffect
activePattern[]Initial on/off interval pattern, in seconds (unlike vibrationManager's millisecond patterns); even indices are "on"
repeattrueWhether the active pattern loops after finishing
intensity1Forwarded to vibrationManageriOS.vibrateContinuous() during "on" intervals
sharpness1Forwarded to vibrationManageriOS.vibrateContinuous() during "on" intervals

Methods

MemberDescription
start()Begins playing activePattern from the beginning
stop()Stops vibration and resets pattern position
step( dt )Advances pattern timing (dt in seconds); must be called every frame while running
setPattern( pattern )Sets a new pattern. If nothing is currently running, it becomes the active pattern immediately; if a pattern is running, it becomes "pending" and swaps in only once the current pattern loop finishes, to avoid an audible/tactile stutter mid-pattern
setNewActivePattern( pattern )Forces the active pattern immediately (used internally by setPattern/step at a loop boundary)
setIntensity( intensity ) / setSharpness( sharpness )Update the values forwarded to vibrationManageriOS.vibrateContinuous() for subsequent "on" intervals
setRepeat( repeat )Toggles whether the active pattern loops

ContinuousPatternVibrationController depends on a class that isn't exported

Its constructor requires a VibrationManageriOS instance — the class that bridges to a native iOS WebView vibration handler. VibrationManageriOS's own source marks it @deprecated - This strategy is being abandoned for an android specific solution, and it is not re-exported from tappi.ts — so there's no supported way to construct one from outside the SceneryStack repository itself. VibrationIndicator was verified against scenerystack@3.0.0 source; ContinuousPatternVibrationController is documented here from source for completeness but is not usable through the public API.