Mouse Input

Handle mouse position, buttons, and scroll wheel using RaylibInput.

using Xengine.Rendering;

Mouse Position

MousePosition

static Vector2 MousePosition { get; }

Current mouse position in screen coordinates.

var pos = RaylibInput.MousePosition;
Log.Info($"Mouse at: {pos.X}, {pos.Y}");

MouseDelta

static Vector2 MouseDelta { get; }

Mouse movement since last frame.

var delta = RaylibInput.MouseDelta;
_yaw += delta.X * sensitivity;
_pitch -= delta.Y * sensitivity;

Mouse Buttons

IsMouseButtonDown

static bool IsMouseButtonDown(MouseButton button)
if (RaylibInput.IsMouseButtonDown(MouseButton.Left))
    Shoot();

IsMouseButtonPressed

static bool IsMouseButtonPressed(MouseButton button)
if (RaylibInput.IsMouseButtonPressed(MouseButton.Left))
    SelectUnit();

IsMouseButtonReleased

static bool IsMouseButtonReleased(MouseButton button)
if (RaylibInput.IsMouseButtonReleased(MouseButton.Left))
    ReleaseCharge();

Mouse Buttons

ButtonDescription
MouseButton.LeftLeft mouse button
MouseButton.RightRight mouse button
MouseButton.MiddleMiddle mouse button (scroll wheel click)

Mouse Wheel

MouseWheel

static float MouseWheel { get; }

Scroll wheel movement this frame (+1 up, -1 down).

float scroll = RaylibInput.MouseWheel;
_zoom -= scroll * zoomSpeed;

Common Patterns

Camera Look

public class MouseLook : Component
{
    public float Sensitivity = 0.2f;
    private float _yaw, _pitch;
    
    protected override void OnUpdate()
    {
        var delta = RaylibInput.MouseDelta;
        _yaw += delta.X * Sensitivity;
        _pitch -= delta.Y * Sensitivity;
        _pitch = MathHelper.Clamp(_pitch, -89f, 89f);
    }
}

Zoom Control

public class ZoomCamera : Component
{
    public float MinZoom = 5f;
    public float MaxZoom = 50f;
    public float ZoomSpeed = 5f;
    private float _zoom = 15f;
    
    protected override void OnUpdate()
    {
        _zoom -= RaylibInput.MouseWheel * ZoomSpeed;
        _zoom = MathHelper.Clamp(_zoom, MinZoom, MaxZoom);
    }
}

Click to Select

protected override void OnUpdate()
{
    if (RaylibInput.IsMouseButtonPressed(MouseButton.Left))
    {
        var mousePos = RaylibInput.MousePosition;
        Log.Info($"Clicked at {mousePos}");
        // Perform raycast or UI hit test
    }
}

Drag and Drop

private bool _dragging;
private Vector2 _dragStart;

protected override void OnUpdate()
{
    if (RaylibInput.IsMouseButtonPressed(MouseButton.Left))
    {
        _dragging = true;
        _dragStart = RaylibInput.MousePosition;
    }
    
    if (_dragging)
    {
        var current = RaylibInput.MousePosition;
        var delta = current - _dragStart;
        // Use delta for dragging
    }
    
    if (RaylibInput.IsMouseButtonReleased(MouseButton.Left))
    {
        _dragging = false;
    }
}

Hold to Charge

private float _chargeTime;

protected override void OnUpdate()
{
    if (RaylibInput.IsMouseButtonDown(MouseButton.Left))
    {
        _chargeTime += Time.Delta;
        _chargeTime = MathHelper.Clamp(_chargeTime, 0, 3f);
    }
    
    if (RaylibInput.IsMouseButtonReleased(MouseButton.Left))
    {
        float power = _chargeTime / 3f; // 0 to 1
        Fire(power);
        _chargeTime = 0;
    }
}