bittyBIG Easy Input System
Setup guide, action maps, controller events, examples, and block glossary

Easy Input System

The bittyBIG Easy Input System gives Stencyl projects one global controller-input layer. It translates common controllers into consistent position-based input names, stores named Action Maps, tracks button and action state per controller port, and exposes controller, button, and analog events.

Project Setup in Stencyl

The extension loads globally. You do not attach an Input Manager or Action Map behavior to every scene, and there is no separate initialization block.

1. Install the extension

  1. Place the extension folder in Stencyl's engine-extensions folder.
  2. Keep the folder name as bittybig-easy-input-system.
  3. Restart Stencyl so the extension files and event menu are reloaded.

2. Enable it for the game

  1. Open the game in Stencyl.
  2. Enable bittyBIG Easy Input System in the game's Extensions settings.
  3. Reopen the project if Stencyl asks to reload extension blocks.
Ready check: the palette should contain four tabs: Action Maps, Input, Controllers, and Event Data. The Add Event menu should contain a separate bittyBIG Easy Input System section.
Do not rename the extension folder with spaces. Stencyl uses the folder name while generating conditional Haxe code. Spaces can compile the extension's event registration out of the game.

Quick Start Guide

Start by creating one named Action Map, assigning a few universal inputs, and making that map active. Action Maps are created automatically when they are first used.

Set Action Jump to Button South for Action Map Gameplay
Set Action Pause to Start for Action Map Gameplay
Set Active Action Map to Gameplay
What this creates: pressing the bottom face button produces the action Jump, and pressing Start produces Pause, while the Gameplay map is active.

Receive the action in a scene behavior

  1. Add a Stencyl Custom Event named JumpPressed.
  2. Add another named JumpReleased when release logic is needed.
  3. Place the gameplay logic inside those Custom Events.
Button South
Gameplay Action Map
Jump
JumpPressed / JumpReleased

Read the action continuously

Action Jump is Down for Controller Port 0

Use Down for held movement or continuous behavior. Use Pressed and Released for one-update checks.

Read the physical input directly

Input Button South is Pressed for Controller Port 0

This bypasses the Action Map and checks the universal controller input itself.

Action Maps

An Action Map converts controller inputs into game-specific action names. The active map stays selected as scenes change until another map is activated.

Create and update maps

Using Set Action Binding creates the named map when needed. Binding the same input again replaces its previous action inside that map.

Switch game contexts

Use separate maps such as Gameplay, Menu, and Vehicle. Only the active map resolves input into actions.

Action MapUniversal InputAction
GameplayButton SouthJump
GameplayStartPause
MenuButton SouthConfirm
MenuButton EastCancel
Event naming: mapped actions are delivered as the action name plus the phase. For an action named Jump, the generated Custom Events are JumpPressed and JumpReleased.

Receiving Actions in Actors

Scene behaviors receive mapped action Custom Events automatically. Actors opt in so the system does not shout every action to every actor in the scene.

Receive bittyBIG Action Events in this Actor
  1. Place this block once in the actor behavior's Created event.
  2. Add Custom Events such as JumpPressed to that actor behavior.
  3. The actor will then receive mapped actions while it is registered and active.
Current Action: inside mapped action logic, use the Current Action reporter to retrieve the base action name without the Pressed or Released suffix.

Analog Input and Digital Vectors

Analog values

Get Left Stick X for Controller Port 0

Stick axes return values from -1 to 1. Trigger reporters return values from 0 to 1.

Digital vectors

A digital vector combines a negative action and positive action into one number.

Set Digital Vector Move X Negative Action Move Left Positive Action Move Right for Action Map Gameplay
Get Digital Vector Move X for Controller Port 0
Held actionsDigital vector result
Negative action only-1
Positive action only1
Neither action, or both actions0

Input Events

Open Add Event → Extensions → bittyBIG Easy Input System. These events are for input routing, rebinding screens, multiplayer assignment, diagnostics, and other advanced workflows.

Any Button

Add Event → Extensions → bittyBIG Easy Input System
When Any Input is Pressed
Input Name
Input Phase
Controller Port
Controller Name
Controller ID
Runs when a controller input is pressed or released. Mapped inputs report their universal name. Unsupported or unmapped buttons can report their raw numeric input value.
Current Action is available here. When the active Action Map resolves this input, the Current Action reporter contains the mapped action before the Any Input callback runs. Unassigned raw input returns empty text.

Controller Connected

Add Event → Extensions → bittyBIG Easy Input System
When a Controller Connects
Controller Port
Controller Name
Controller ID
Connected
Runs once for the controller port whose connection state changed. Use the attached reporters to identify the exact device and assigned port.

Analog Input

Add Event → Extensions → bittyBIG Easy Input System
When an Analog Input Changes
Analog Input
Analog Value
Controller Port
Controller Name
Controller ID
Runs when a stick axis or trigger changes enough to pass the analog event threshold.
Attached reporters are local to the callback. Use them inside the event when you need data from that exact invocation. The Event Data palette contains shared Current Event Data reporters for reusable logic and mapped action events.
Raw fallback is event-only. A raw numeric button reported by Any Button is not added to normal Input State tracking or Action Maps. It is provided so unsupported controller buttons can still be identified.

Controllers and Ports

The system supports controller ports 0 through 3. A newly detected controller is assigned to the first empty port.

Detected controllerMapping path
Xbox and XInput controllersXInput preset
DualSense, DualShock, or PlayStation-named controllersPS5-style preset
Nintendo Switch Pro controllersSwitch Pro preset
HTML5 browser gamepadsHTML Gamepad mapping path
Unknown native controller namesXInput fallback, with raw Any Button reporting for buttons the preset does not translate

Universal face-button names

Physical positionUniversal name
BottomButton South
RightButton East
LeftButton West
TopButton North
HTML5 note: browsers may not expose a gamepad until the game has focus and the user presses a controller button.

Block Glossary

The glossary follows the same order as the Stencyl palette: commands first, getters after them, with the generated Haxe call shown under each block.

Action Maps

Setters

Set Action Binding

Action Maps → Setters
Set Action to Button South for Action Map
Assigns the selected universal input to an action in the named Action Map. The Action Map is created automatically if it does not exist.
Code
scripts.BittyInputBlocks.setActionBinding(~,~,~);

Set Active Action Map

Action Maps → Setters
Set Active Action Map to
Makes the named Action Map the map used to translate input into actions.
Code
scripts.BittyInputBlocks.setActiveActionMap(~);

Remove Input Binding

Action Maps → Setters
Remove Button South from Action Map
Removes the selected universal input from the named Action Map.
Code
scripts.BittyInputBlocks.removeInputBinding(~,~);

Clear Action Map

Action Maps → Setters
Clear Action Map
Removes every input-to-action assignment from the named Action Map without deleting other maps.
Code
scripts.BittyInputBlocks.clearActionMap(~);

Getters

Get Active Action Map

Action Maps → Getters
Get Active Action Map
Returns the name of the currently active Action Map.
Code
scripts.BittyInputBlocks.getActiveActionMap()

Get Bound Action

Action Maps → Getters
Get Action assigned to Button South in Action Map
Returns the action assigned to the selected input in the named Action Map, or an empty string when unassigned.
Code
scripts.BittyInputBlocks.getBoundAction(~,~)

Action Map Exists?

Action Maps → Getters
Action Map exists
Returns true if the named Action Map has been created.
Code
scripts.BittyInputBlocks.actionMapExists(~)

Input

Setters

Receive Action Events in This Actor

Input → Setters
Receive bittyBIG Action Events in this Actor
Registers this actor to receive mapped action custom events such as JumpPressed and JumpReleased. Add it once in the actor's Created event.
Code
scripts.BittyInputBlocks.receiveActionEventsInActor(actor);

Set Digital Vector

Input → Setters
Set Digital Vector Negative Action Positive Action for Action Map
Creates or replaces a digital vector. The vector returns -1 for the negative action, 1 for the positive action, and 0 when neither or both are held.
Code
scripts.BittyInputBlocks.setDigitalVector(~,~,~,~);

Getters

Get Action State

Input → Getters
Action is Down for Controller Port
Returns whether an action is down, was pressed this frame, or was released this frame for the selected controller port.
Code
scripts.BittyInputBlocks.getActionState(~,~,~)

Get Input State

Input → Getters
Input Button South is Down for Controller Port
Returns whether a universal input is down, was pressed this frame, or was released this frame for the selected controller port.
Code
scripts.BittyInputBlocks.getInputState(~,~,~)

Get Analog Value

Input → Getters
Get Left Stick X for Controller Port
Returns the current analog value for a stick axis or trigger. Stick axes use -1 to 1. Triggers use 0 to 1.
Code
scripts.BittyInputBlocks.getAnalogValue(~,~)

Get Digital Vector

Input → Getters
Get Digital Vector for Controller Port
Returns the current -1, 0, or 1 value of the named digital vector using the active Action Map.
Code
scripts.BittyInputBlocks.getDigitalVector(~,~)

Controllers

Getters

Controller Connected?

Controllers → Getters
Controller is connected at Port
Returns true if a controller is currently assigned to the selected controller port.
Code
scripts.BittyInputBlocks.isControllerConnected(~)

Connected Controller Count

Controllers → Getters
Connected Controller Count
Returns the number of currently connected controllers.
Code
scripts.BittyInputBlocks.getConnectedControllerCount()

Get Controller Name

Controllers → Getters
Get Controller Name for Port
Returns the connected controller name for the selected port, or an empty string when the port is empty.
Code
scripts.BittyInputBlocks.getControllerName(~)

Get Controller ID

Controllers → Getters
Get Controller ID for Port
Returns the internal device identifier assigned to the selected controller port.
Code
scripts.BittyInputBlocks.getControllerID(~)

Event Data

Getters

Current Action

Event Data → Getters
Current Action
Returns the mapped action currently being delivered, such as Jump. Use it inside a mapped action custom event.
Code
scripts.BittyInputBlocks.getCurrentAction()

Current Input Name

Event Data → Getters
Current Input Name
Returns the universal input name associated with the current Any Input event.
Code
scripts.BittyInputBlocks.getCurrentInputName()

Current Input Phase

Event Data → Getters
Current Input Phase
Returns Pressed or Released for the current Any Input event.
Code
scripts.BittyInputBlocks.getCurrentInputPhase()

Current Analog Input

Event Data → Getters
Current Analog Input
Returns the analog input name associated with the current Analog Input Changes event.
Code
scripts.BittyInputBlocks.getCurrentAnalogInput()

Current Analog Value

Event Data → Getters
Current Analog Value
Returns the new analog value associated with the current Analog Input Changes event.
Code
scripts.BittyInputBlocks.getCurrentAnalogValue()

Current Controller Port

Event Data → Getters
Current Controller Port
Returns the controller port associated with the current input, action, analog, connect, or disconnect event.
Code
scripts.BittyInputBlocks.getCurrentControllerPort()

Current Controller Name

Event Data → Getters
Current Controller Name
Returns the controller name associated with the current event.
Code
scripts.BittyInputBlocks.getCurrentControllerName()

Current Controller ID

Event Data → Getters
Current Controller ID
Returns the internal device identifier associated with the current event.
Code
scripts.BittyInputBlocks.getCurrentControllerID()

Current Controller Is Connected

Event Data → Getters
Current Controller is Connected
Returns true when the current Controller Connection event is a connection and false when it is a disconnection.
Code
scripts.BittyInputBlocks.getCurrentControllerConnected()

FAQs and Troubleshooting

Problem: The extension blocks or Add Event entries do not appear.

Solution: Confirm the extension is enabled, the folder is named bittybig-easy-input-system, and Stencyl was restarted.

Problem: A mapped action Custom Event does not run.

Solution: Confirm the correct Action Map is active, the input is assigned in that map, and the Custom Event exactly matches ActionNamePressed or ActionNameReleased.

Problem: A scene behavior receives the action, but an actor behavior does not.

Solution: Put Receive bittyBIG Action Events in this Actor in the actor's Created event.

Problem: An unusual controller button reports a number instead of a name.

Solution: The current controller preset did not translate that button. The Any Button event is exposing the raw input value so the controller can be diagnosed.

Problem: A controller is connected, but my logic reads the wrong port.

Solution: Use the Controller Connected event or controller getter blocks to confirm the assigned port. Controllers use the first empty port when detected.

Problem: Current Event Data seems to change during nested or additional input processing.

Solution: Use the reporters attached directly to the Add Event callback when the value must belong to that exact invocation.

For support, include the target platform, controller name, controller ID, assigned port, and the Input Name reported by the Any Button event.

Release Notes

Current documented build

  • Global extension-owned input runtime; no per-scene manager behavior required.
  • Named Action Maps that remain active across scene changes.
  • Mapped action Custom Events for scene behaviors and registered actors.
  • Any Button, Controller Connected, and Analog Input Add Event entries with attached reporter blocks.
  • Current Action available during mapped action handling and the Any Button event.
  • Raw Any Button fallback for unsupported or unmapped controller buttons.
  • Palette organized into Action Maps, Input, Controllers, and Event Data.

Current controller presets

PS5-style, XInput, Switch Pro, and HTML Gamepad mappings are included.

Planned, not currently included: user-editable controller presets.