aboutsummaryrefslogtreecommitdiff
path: root/selection/selection.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-05-07 10:31:42 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-05-07 10:31:42 +0200
commitb2ca89d8193d98aa21e9637257c3e7a7216b9bd8 (patch)
treee87be16d5a92ad88070f3c96976174cab683f571 /selection/selection.go
parent2e8da8cb6948664a77fa73cb0c66e0cc27419dc5 (diff)
Add viewport/camera system with pan, zoom, and world-space cursor conversion
- New camera.go: Camera struct with arrow-key pan, scroll-wheel zoom toward cursor, middle-mouse drag, exponential velocity decay, and world-bounds clamping - Layout() now returns screen dimensions (960x640) instead of world size so the camera GeoM transform drives all rendering - All world entities, halos, text, path lines and spawn target converted via camera transform in draw.go; banners remain in screen space - selection.go: separate startScreen field so the drag-select box draws in screen space while selection logic stays in world space - Banner heights and font sizes scaled down to fit the 640px logical screen - Three new integration tests: ScreenToWorld round-trip, bounds clamping, zoom-toward-cursor stability Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'selection/selection.go')
-rw-r--r--selection/selection.go17
1 files changed, 11 insertions, 6 deletions
diff --git a/selection/selection.go b/selection/selection.go
index e4afdaa..1c702ee 100644
--- a/selection/selection.go
+++ b/selection/selection.go
@@ -32,10 +32,11 @@ type selectItem struct {
}
type GlobalSelection struct {
- isActive bool
- start physics.Point
- buffer []selectItem
- Selected []ecs.Entity
+ isActive bool
+ start physics.Point
+ startScreen physics.Point
+ buffer []selectItem
+ Selected []ecs.Entity
}
func (s GlobalSelection) IsActive(cursor physics.Point) bool {
@@ -56,6 +57,10 @@ func (s *GlobalSelection) Start(point physics.Point) {
s.start = point
}
+func (s *GlobalSelection) StartScreen(point physics.Point) {
+ s.startScreen = point
+}
+
type SelectTarget struct {
Selectable *Selectable
Position physics.Point
@@ -134,6 +139,6 @@ func (s *GlobalSelection) Unselect(selectables []Selectable) {
s.Selected = []ecs.Entity{}
}
-func (s *GlobalSelection) Draw(dst *ebiten.Image, cursor physics.Point) {
- vector.StrokeRect(dst, float32(s.start.X), float32(s.start.Y), float32(cursor.X-s.start.X), float32(cursor.Y-s.start.Y), 10.0, color.RGBA{256 * 3 / 16, 256 * 3 / 16, 256 * 3 / 16, 256 / 4}, true)
+func (s *GlobalSelection) Draw(dst *ebiten.Image, screenCursor physics.Point) {
+ vector.StrokeRect(dst, float32(s.startScreen.X), float32(s.startScreen.Y), float32(screenCursor.X-s.startScreen.X), float32(screenCursor.Y-s.startScreen.Y), 10.0, color.RGBA{256 * 3 / 16, 256 * 3 / 16, 256 * 3 / 16, 256 / 4}, true)
}