A Clickteam Fusion 2.5/Construct inspired visual scripting addon for Godot 4, enabling event-driven programming through an intuitive event sheet interface.
FlowKit brings the power of visual event-based programming to Godot, allowing you to create game logic without writing code. Inspired by popular event sheet systems like Clickteam Fusion and Construct, FlowKit provides a familiar workflow for non-programmers and rapid prototyping enthusiasts.
- π― Event Sheet System: Create game logic using intuitive event blocks with conditions and actions
- π Node-Based Architecture: Target specific nodes in your scene tree for granular control
- π¦ Extensible Provider System: Easily add custom events, conditions, and actions
- β‘ Runtime Engine: Efficient event processing during gameplay with automatic scene detection
- π¨ Editor Integration: Seamless integration with Godot's editor interface
- πΎ Resource-Based Storage: Event sheets saved as
.tresresources for version control friendliness
- Download or clone this repository
- Copy the
flowkitfolder into your Godot project'saddons/directory - Enable the plugin in Project β Project Settings β Plugins
- The FlowKit panel will appear at the bottom of the editor
- Open a scene in the Godot editor
- Click the FlowKit tab in the bottom panel
- Click "Create Event Sheet" to initialize an event sheet for the current scene
- Add an event block:
- Click "Add Event" and select an event type (e.g.,
On Process) - Select the target node from your scene tree
- Click "Add Event" and select an event type (e.g.,
- Add conditions (optional):
- Click "Add Condition" on the event block
- Choose condition type and configure parameters
- Add actions:
- Click "Add Action" on the event block
- Select target node and action type
- Configure action parameters using expressions
- Save your event sheet (File β Save)
Event sheets are automatically loaded and executed when their associated scene runs.
FlowKit operates as a dual-mode system:
- Visual Authoring: Bottom panel UI for creating and editing event sheets
- Node Selection: Integration with Godot's scene tree for target selection
- Expression Editor: Configure action/condition parameters with GDScript expressions
- FlowKit Engine: Autoloaded singleton (
FlowKit) that executes event sheets - Scene Detection: Automatically loads event sheets matching the current scene
- Event Loop: Processes events, conditions, and actions every frame
FKEventSheet (Resource)
ββ events: Array[FKEventBlock]
ββ event_id: String (e.g., "on_process")
ββ target_node: NodePath
ββ conditions: Array[FKEventCondition]
β ββ condition_id: String
β ββ target_node: NodePath
β ββ inputs: Dictionary
ββ actions: Array[FKEventAction]
ββ action_id: String
ββ target_node: NodePath
ββ inputs: Dictionary
- On Ready: Triggered once when the node enters the scene tree
- On Process: Triggered every frame
- On Key Pressed: Triggered when a keyboard key is pressed
- Get Key Down: Check if a specific key is currently pressed
Node Actions:
- Print: Output text to the console
CharacterBody2D Actions:
- Move and Collide: Move with collision detection
- Move and Slide: Move with sliding collision response
- Normalize Velocity: Normalize the velocity vector
- Set Position X/Y: Set horizontal/vertical position
- Set Rotation: Set rotation angle
- Set Velocity X/Y: Set horizontal/vertical velocity
Note: More providers will be added in future updates, and this list is not exhaustive.
FlowKit's provider system makes it easy to extend functionality. Providers are automatically discovered through the registry system.
- Create a new
.gdfile inaddons/flowkit/actions/{NodeType}/ - Extend the
FKActionbase class - Implement required methods:
extends FKAction
func get_id() -> String:
return "my_custom_action"
func get_name() -> String:
return "My Custom Action"
func get_supported_types() -> Array:
return ["Node2D"] # Compatible node types
func get_inputs() -> Array:
# Define parameters (empty if none needed)
return [
{"name": "amount", "type": "float"},
{"name": "message", "type": "String"}
]
func execute(node: Node, inputs: Dictionary) -> void:
var amount = inputs.get("amount", 0.0)
var message = inputs.get("message", "")
# Your action logic here
print(message, " - ", amount)- Create a new
.gdfile inaddons/flowkit/conditions/ - Extend the
FKConditionbase class:
extends FKCondition
func get_id() -> String:
return "my_custom_condition"
func get_name() -> String:
return "My Custom Condition"
func get_supported_types() -> Array:
return ["Node"]
func get_inputs() -> Array:
return [{"name": "threshold", "type": "float"}]
func check(node: Node, inputs: Dictionary) -> bool:
var threshold = inputs.get("threshold", 0.0)
# Your condition logic here
return true # or false- Create a new
.gdfile inaddons/flowkit/events/ - Extend the
FKEventbase class:
extends FKEvent
func get_id() -> String:
return "on_custom_event"
func get_name() -> String:
return "On Custom Event"
func get_supported_types() -> Array:
return ["Node"]
func poll(node: Node) -> bool:
# Return true when event should trigger
return falseThe registry will automatically discover and register your custom providers when the plugin loads.
flowkit/
βββ flowkit.gd # Main plugin entry point
βββ registry.gd # Provider discovery and management
βββ actions/ # Action providers
β βββ Node/ # Node-compatible actions
β βββ CharacterBody2D/ # CharacterBody2D-compatible actions
βββ conditions/ # Condition providers
βββ events/ # Event providers
βββ resources/ # Resource type definitions
β βββ event_sheet.gd
β βββ event_block.gd
β βββ event_action.gd
β βββ event_condition.gd
β βββ fk_action.gd
β βββ fk_condition.gd
β βββ fk_event.gd
βββ runtime/ # Runtime execution engine
β βββ flowkit_engine.gd
βββ ui/ # Editor interface
β βββ editor.gd
β βββ modals/ # Dialog windows
β βββ workspace/ # Event sheet UI components
βββ saved/ # Generated event sheets
βββ event_sheet/ # Scene-specific .tres files
- Scene Naming: Event sheets are automatically matched to scenes by filename (e.g.,
world.tscnβworld.tres) - Node Paths: All node paths are relative to the scene root
- Expressions: Action/condition inputs support GDScript expressions (e.g.,
position.x + 10,Vector2(100, 200)) - Organization: Group related providers in subdirectories for better organization
- Debugging: Check the Godot console for FlowKit engine logs during runtime
- Godot 4.5 or higher
- Basic understanding of Godot's plugin system
- GDScript knowledge for creating custom providers
Contributions are welcome! To contribute:
- Fork the repository
- Create a feature branch
- Add your custom providers or improvements
- Test thoroughly in the Godot editor
- Submit a pull request
This project is licensed under the MIT License.
Inspired by:
- Clickteam Fusion 2.5 - Event-based game development tool
- Construct - HTML5 game engine with visual scripting
- Scratch - Block-based programming language for beginners
- Godot Engine - Open-source game engine
For bug reports, feature requests, or questions, please open an issue on the GitHub repository.
Made with β€οΈ for the Godot community by LexianDEV