-
-
Notifications
You must be signed in to change notification settings - Fork 2
Mouse Input Quick Start
A compact, code-first reference for mouse clicks, movement, dragging, and wheel input in Gondwana.
- The Basic Pattern
- Show a Left Mouse Click
- Show a Right Mouse Click
- Track Pointer Movement
- Implement a Drag
- Read the Scroll Wheel
- Convert the Pointer to World Coordinates
- Use Modifier Keys
- Control Event Frequency
- Cleanup
- Cheat Sheet
- Common Problems
- Further Reading
Mouse input uses one consolidated event:
Initialize adapter
↓
Subscribe to MouseEvent
↓
Start monitoring
↓
Inspect position, buttons, wheel, and modifiers
In a Gondwana game host:
protected override void OnMouseAdapterInitialized()
{
var mouse = Engine.Input.MouseEventPoller;
if (mouse is null)
return;
mouse.MouseEvent += OnMouseEvent;
mouse.StartMonitoringMouse(
trackMouseMovement: true);
}using Gondwana.Input.Mouse;private void OnMouseEvent(MouseEventArgs e)
{
if (e.LeftButtonJustPressed)
{
Console.WriteLine(
$"Left mouse pressed at {e.CurrentPosition}.");
}
}LeftButtonJustPressed is true only when the button transitions from up to down.
To act when the button is released:
if (e.LeftButtonJustReleased)
{
Console.WriteLine(
$"Left mouse released at {e.CurrentPosition}.");
}private void OnMouseEvent(MouseEventArgs e)
{
if (e.RightButtonJustPressed)
{
OpenContextMenu(
e.CurrentPosition);
}
}Middle-button helpers are available too:
e.MiddleButtonDown
e.MiddleButtonJustPressed
e.MiddleButtonJustReleasedOr use the generic form:
if (e.IsButtonJustPressed(MouseButton.Middle))
{
}private void OnMouseEvent(MouseEventArgs e)
{
if (e.CurrentPosition == e.PreviousPosition)
return;
int dx =
e.CurrentPosition.X -
e.PreviousPosition.X;
int dy =
e.CurrentPosition.Y -
e.PreviousPosition.Y;
Console.WriteLine(
$"Mouse moved by ({dx}, {dy}).");
}Make sure movement tracking is enabled:
mouse.StartMonitoringMouse(
trackMouseMovement: true);private Point? _dragStart;private void OnMouseEvent(MouseEventArgs e)
{
if (e.LeftButtonJustPressed)
{
_dragStart = e.CurrentPosition;
return;
}
if (e.LeftButtonDown &&
_dragStart is { } start)
{
var delta = new Point(
e.CurrentPosition.X - start.X,
e.CurrentPosition.Y - start.Y);
DragSelection(
start,
e.CurrentPosition,
delta);
return;
}
if (e.LeftButtonJustReleased)
{
_dragStart = null;
}
}For Gondwana widgets, prefer the widget input router and widget drag events. Use raw mouse dragging for world interaction, camera controls, editors, and custom tools.
private void OnMouseEvent(MouseEventArgs e)
{
if (e.ScrollDelta > 0)
{
ZoomIn();
}
else if (e.ScrollDelta < 0)
{
ZoomOut();
}
}The magnitude is adapter-defined. On WinForms it commonly arrives in wheel-detent-sized increments.
For smooth zoom, convert the delta into a target and let the view animate:
if (e.ScrollDelta != 0)
{
var view =
RenderSurface.Host.ViewManager.Views[0];
var layer = Scene![0];
float targetZoom = Math.Clamp(
view.Viewport.Zoom +
e.ScrollDelta * 0.001f,
view.MinZoom,
view.MaxZoom);
view.ZoomAroundScreenPoint(
layer,
e.CurrentPosition,
targetZoom,
0.25f);
}The mouse reports render-surface coordinates. Convert through the intended View.
private void OnMouseEvent(MouseEventArgs e)
{
var view =
RenderSurface.Host.ViewManager.Views[0];
var layer = Scene![0];
PointF worldPx =
view.ScreenPxToWorldPx(
layer,
e.CurrentPosition);
Console.WriteLine(
$"World pixel: {worldPx}");
}Convert directly to the layer's grid:
PointF grid =
view.ScreenPxToGrid(
layer,
e.CurrentPosition);Select a tile:
var tile = layer[grid];
if (tile is not null &&
e.LeftButtonJustPressed)
{
SelectTile(tile);
}Mouse events include keyboard modifiers:
e.IsShift
e.IsCtrl
e.IsAltExample:
if (e.LeftButtonJustPressed)
{
if (e.IsCtrl)
AddToSelection(e.CurrentPosition);
else
ReplaceSelection(e.CurrentPosition);
}Use the engine default:
mouse.StartMonitoringMouse(
trackMouseMovement: true,
timeBetweenEvents: -1);No added throttle:
mouse.StartMonitoringMouse(
trackMouseMovement: true,
timeBetweenEvents: 0);Disable free movement events:
mouse.StartMonitoringMouse(
trackMouseMovement: false);Pause:
mouse.Configuration!.IsPaused = true;Resume:
mouse.Configuration!.IsPaused = false;Stop monitoring:
mouse.StopMonitoringMouse();protected override void UnhookEvents()
{
if (Engine.Input.MouseEventPoller is { } mouse)
mouse.MouseEvent -= OnMouseEvent;
}if (e.LeftButtonJustPressed)
{
}if (e.LeftButtonDown)
{
}if (e.LeftButtonJustReleased)
{
}Point p = e.CurrentPosition;int dx =
e.CurrentPosition.X -
e.PreviousPosition.X;if (e.ScrollDelta != 0)
{
}PointF world =
view.ScreenPxToWorldPx(
layer,
e.CurrentPosition);Enable pointer movement tracking:
mouse.StartMonitoringMouse(
trackMouseMovement: true);That is expected while a button remains held. Use:
JustPressed
JustReleasedfor edge-only behavior.
Use the correct View and SceneLayer when converting screen coordinates.
Reduce timeBetweenEvents. A value of 0 removes interval throttling, but it also increases event frequency.
Mouse handlers normally run in the engine cycle. Dispatch platform UI changes:
Engine.UiDispatcher?.Post(() =>
{
label.Text = "Clicked";
});- Home
- Make Your First Game in 30 Minutes
- Engine Architecture Overview
- Gondwana Engine Lifecycle
- Gondwana CLI Cheatsheet
- Assets Files
- Tilesheets
- Scenes and SceneLayers
- Sprites
- Views, Cameras, and Viewports
- DirectDrawing
- Game State Files
- Logging
- Movement and Controllers
- Input Handling
- Collision Detection
- Timers and Engine Timing
- Using the Effects System
- Engine Configuration