The Clay Behavior plugin provides reusable behavior components for game entities, including movement patterns, path following, triggers, and complex object builders. It integrates with the Clay World and Physics plugins to create dynamic, interactive game behaviors.

Getting Started

To use the Clay Behavior plugin in your QML files:

import Clayground.Behavior

Core Components

  • Move - Placeholder for future movement behavior implementation.
  • MoveTo - Moves an actor entity to a specified destination using physics-based velocity control.
  • FollowPath - Makes an entity follow a predefined path of waypoints with optional looping.
  • RectTrigger - A rectangular sensor area that detects when physics entities enter it.
  • WorldChangedConnections - Utility that monitors world dimension changes and invokes a callback.
  • DoorBuilder - Factory component that creates automated doors with switches from SVG map data.

Usage Examples

Basic Movement to Target

import Clayground.Behavior
import Clayground.Physics

RectBoxBody {
    id: enemy
    bodyType: Body.Kinematic
    
    MoveTo {
        world: theWorld
        destXWu: player.xWu
        destYWu: player.yWu
        running: true
        desiredSpeed: 3
        onArrived: console.log("Reached target!")
    }
}

Path Patrol

import Clayground.Behavior

RectBoxBody {
    id: guard
    bodyType: Body.Kinematic
    
    FollowPath {
        world: theWorld
        wpsWu: [
            Qt.point(5, 5),
            Qt.point(10, 5),
            Qt.point(10, 10),
            Qt.point(5, 10)
        ]
        repeat: true
        running: true
        debug: true
    }
}

Creating Triggers

import Clayground.Behavior

RectTrigger {
    xWu: 10
    yWu: 10
    widthWu: 2
    heightWu: 2
    visible: true
    color: "yellow"
    opacity: 0.5
    
    onEntered: (entity) => {
        console.log("Entity entered:", entity)
        // Trigger game logic
    }
}

Automated Door System

import Clayground.Behavior
import Clayground.World

ClayWorld2d {
    id: theWorld
    
    // Door builder automatically creates doors from map data
    DoorBuilder {
        world: theWorld
    }
    
    // Map should contain groups named "door*" with:
    // - Door entities (component: "Door")
    // - DoorOpener entities (component: "DoorOpener")
    // - Polyline paths for door movement
}

Responding to World Changes

import Clayground.Behavior

Item {
    WorldChangedConnections {
        world: theWorld
        callback: function() {
            // Recalculate positions when world dimensions change
            updateEntityPositions()
        }
    }
}

Best Practices

  1. Performance: Use running property to disable behaviors when not needed to save CPU cycles.

  2. Debug Visualization: Enable debug property during development to visualize paths and destinations.

  3. Collision Setup: Ensure proper collision categories are set for triggers and moving entities.

  4. Path Design: Keep waypoints reasonable distances apart for smooth movement.

  5. World Units: Always use world units (Wu) for positions and dimensions to maintain consistency.

Technical Implementation

The Clay Behavior plugin implements several patterns:

  • Physics-Based Movement: MoveTo uses Box2D’s kinematic bodies with velocity adjustments
  • Waypoint System: FollowPath manages sequential waypoint navigation
  • Trigger System: RectTrigger uses Box2D sensors for enter detection
  • Builder Pattern: DoorBuilder demonstrates complex object assembly from map data

The plugin integrates tightly with Clay World for coordinate systems and Clay Physics for collision detection and movement.