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
- Place the extension folder in Stencyl's engine-extensions folder.
- Keep the folder name as bittybig-easy-input-system.
- Restart Stencyl so the extension files and event menu are reloaded.
2. Enable it for the game
- Open the game in Stencyl.
- Enable bittyBIG Easy Input System in the game's Extensions settings.
- Reopen the project if Stencyl asks to reload extension blocks.
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.
Receive the action in a scene behavior
- Add a Stencyl Custom Event named JumpPressed.
- Add another named JumpReleased when release logic is needed.
- Place the gameplay logic inside those Custom Events.
Read the action continuously
Use Down for held movement or continuous behavior. Use Pressed and Released for one-update checks.
Read the physical input directly
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 Map | Universal Input | Action |
|---|---|---|
| Gameplay | Button South | Jump |
| Gameplay | Start | Pause |
| Menu | Button South | Confirm |
| Menu | Button East | Cancel |
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.
- Place this block once in the actor behavior's Created event.
- Add Custom Events such as JumpPressed to that actor behavior.
- The actor will then receive mapped actions while it is registered and active.
Analog Input and Digital Vectors
Analog values
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.
| Held actions | Digital vector result |
|---|---|
| Negative action only | -1 |
| Positive action only | 1 |
| Neither action, or both actions | 0 |
Input Events
Open . These events are for input routing, rebinding screens, multiplayer assignment, diagnostics, and other advanced workflows.
Any Button
Controller Connected
Analog Input
Controllers and Ports
The system supports controller ports 0 through 3. A newly detected controller is assigned to the first empty port.
| Detected controller | Mapping path |
|---|---|
| Xbox and XInput controllers | XInput preset |
| DualSense, DualShock, or PlayStation-named controllers | PS5-style preset |
| Nintendo Switch Pro controllers | Switch Pro preset |
| HTML5 browser gamepads | HTML Gamepad mapping path |
| Unknown native controller names | XInput fallback, with raw Any Button reporting for buttons the preset does not translate |
Universal face-button names
| Physical position | Universal name |
|---|---|
| Bottom | Button South |
| Right | Button East |
| Left | Button West |
| Top | Button North |
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
scripts.BittyInputBlocks.setActionBinding(~,~,~);
Set Active Action Map
scripts.BittyInputBlocks.setActiveActionMap(~);
Remove Input Binding
scripts.BittyInputBlocks.removeInputBinding(~,~);
Clear Action Map
scripts.BittyInputBlocks.clearActionMap(~);
Getters
Get Active Action Map
scripts.BittyInputBlocks.getActiveActionMap()
Get Bound Action
scripts.BittyInputBlocks.getBoundAction(~,~)
Action Map Exists?
scripts.BittyInputBlocks.actionMapExists(~)
Input
Setters
Receive Action Events in This Actor
scripts.BittyInputBlocks.receiveActionEventsInActor(actor);
Set Digital Vector
scripts.BittyInputBlocks.setDigitalVector(~,~,~,~);
Getters
Get Action State
scripts.BittyInputBlocks.getActionState(~,~,~)
Get Input State
scripts.BittyInputBlocks.getInputState(~,~,~)
Get Analog Value
scripts.BittyInputBlocks.getAnalogValue(~,~)
Get Digital Vector
scripts.BittyInputBlocks.getDigitalVector(~,~)
Controllers
Getters
Controller Connected?
scripts.BittyInputBlocks.isControllerConnected(~)
Connected Controller Count
scripts.BittyInputBlocks.getConnectedControllerCount()
Get Controller Name
scripts.BittyInputBlocks.getControllerName(~)
Get Controller ID
scripts.BittyInputBlocks.getControllerID(~)
Event Data
Getters
Current Action
scripts.BittyInputBlocks.getCurrentAction()
Current Input Name
scripts.BittyInputBlocks.getCurrentInputName()
Current Input Phase
scripts.BittyInputBlocks.getCurrentInputPhase()
Current Analog Input
scripts.BittyInputBlocks.getCurrentAnalogInput()
Current Analog Value
scripts.BittyInputBlocks.getCurrentAnalogValue()
Current Controller Port
scripts.BittyInputBlocks.getCurrentControllerPort()
Current Controller Name
scripts.BittyInputBlocks.getCurrentControllerName()
Current Controller ID
scripts.BittyInputBlocks.getCurrentControllerID()
Current Controller Is Connected
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.
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.