diff options
| -rw-r--r-- | events/events.go | 43 | ||||
| -rw-r--r-- | events/poll.go | 39 | ||||
| -rw-r--r-- | input/input.go | 29 | ||||
| -rw-r--r-- | input/sdl.go | 34 | ||||
| -rw-r--r-- | loop/loop.go | 4 | ||||
| -rw-r--r-- | main.go | 2 | ||||
| -rw-r--r-- | objs/cursor.go | 4 | ||||
| -rw-r--r-- | objs/paddle.go | 6 | ||||
| -rw-r--r-- | objs/root.go | 6 | ||||
| -rw-r--r-- | render/event.go | 10 | ||||
| -rw-r--r-- | tree/tree.go | 43 |
11 files changed, 150 insertions, 70 deletions
diff --git a/events/events.go b/events/events.go new file mode 100644 index 0000000..6783703 --- /dev/null +++ b/events/events.go @@ -0,0 +1,43 @@ +package events + +type DeviceID int + +type MouseMotion struct { + Which DeviceID + Dx, Dy float32 + Delta uint64 +} + +type MousePress struct { + Delta uint64 + Key uint8 + Which DeviceID + JustPressed, JustReleased, IsPressed bool +} + +type WindowChange struct { + Height, Width int32 +} + +type KeyPress struct { + Delta uint64 + Key string + Which DeviceID + JustPressed, JustReleased, IsPressed bool +} + +type Event interface { + KeyPress | WindowChange | MousePress | MouseMotion +} + +type Events []any + +func OfType[T Event](events ...any) []T { + var result []T + for _, e := range events { + if eT, ok := e.(T); ok { + result = append(result, eT) + } + } + return result +} diff --git a/events/poll.go b/events/poll.go new file mode 100644 index 0000000..faa4151 --- /dev/null +++ b/events/poll.go @@ -0,0 +1,39 @@ +package events + +import ( + "github.com/Zyko0/go-sdl3/sdl" +) + +func Poll(delta uint64) ([]any, error) { + var evs []any + var event sdl.Event + for sdl.PollEvent(&event) { + switch event.Type { + case sdl.EVENT_QUIT: + return nil, sdl.EndLoop + case sdl.EVENT_MOUSE_MOTION: + ev := event.MouseMotionEvent() + evs = append(evs, MouseMotion{ + Delta: delta, + Dy: ev.Yrel, + Dx: ev.Xrel, + Which: DeviceID(ev.Which), + }) + case sdl.EVENT_MOUSE_BUTTON_DOWN, sdl.EVENT_MOUSE_BUTTON_UP: + ev := event.MouseButtonEvent() + evs = append(evs, MousePress{ + Delta: delta, + Key: ev.Button, + Which: DeviceID(ev.Which), + IsPressed: ev.Down, + }) + case sdl.EVENT_WINDOW_RESIZED: + ev := event.WindowEvent() + evs = append(evs, WindowChange{ + Height: ev.Data1, + Width: ev.Data2, + }) + } + } + return evs, nil +} diff --git a/input/input.go b/input/input.go index 48eeb02..5a0dea7 100644 --- a/input/input.go +++ b/input/input.go @@ -1,30 +1,11 @@ package input -import "ponger/ecs" +import "ponger/events" -type DeviceID int - -type Event struct { - ecs.Event - Which DeviceID - Dx, Dy float32 - JustPressed, JustReleased, IsPressed bool -} - -type Handler interface { - Process(ev Event) +type MouseMotionHandler interface { + ProcessMouseMotion(ev events.MouseMotion) } -func ProcessTree(root any, ev Event) { - if inp, ok := root.(Handler); ok { - inp.Process(ev) - } - if g, ok := root.(ecs.IsGameObject); ok { - for _, c := range g.GO().Children { - if c == nil { - continue - } - ProcessTree(c, ev) - } - } +type MousePressHandler interface { + ProcessMousePress(ev events.MousePress) } diff --git a/input/sdl.go b/input/sdl.go deleted file mode 100644 index 6b88f35..0000000 --- a/input/sdl.go +++ /dev/null @@ -1,34 +0,0 @@ -package input - -import ( - "github.com/Zyko0/go-sdl3/sdl" - "ponger/ecs" -) - -func Poll(root ecs.IsGameObject, delta uint64) error { - e := Event{ - Event: ecs.Event{ - Delta: delta, - }, - } - var event sdl.Event - for sdl.PollEvent(&event) { - switch event.Type { - case sdl.EVENT_QUIT: - return sdl.EndLoop - case sdl.EVENT_MOUSE_MOTION: - ev := event.MouseMotionEvent() - e.Which = DeviceID(ev.Which) - e.Dx = ev.Xrel - e.Dy = ev.Yrel - case sdl.EVENT_MOUSE_BUTTON_DOWN, sdl.EVENT_MOUSE_BUTTON_UP: - ev := event.MouseButtonEvent() - e.Which = DeviceID(ev.Which) - e.JustPressed = ev.Down - e.JustReleased = !ev.Down - e.IsPressed = ev.Down - } - } - ProcessTree(root, e) - return nil -} diff --git a/loop/loop.go b/loop/loop.go index 8d64e1e..76b7128 100644 --- a/loop/loop.go +++ b/loop/loop.go @@ -3,8 +3,8 @@ package loop import ( "github.com/Zyko0/go-sdl3/sdl" "ponger/ecs" - "ponger/input" "ponger/render" + "ponger/tree" ) func New(game ecs.IsGameObject, window *sdl.Window, renderer *sdl.Renderer) func() error { @@ -12,7 +12,7 @@ func New(game ecs.IsGameObject, window *sdl.Window, renderer *sdl.Renderer) func return func() error { next := sdl.Ticks() delta := next - now - err := input.Poll(game, delta) + err := tree.Process(game, delta, renderer) if err != nil { return err } @@ -30,7 +30,7 @@ func main() { os.Exit(1) }() - game := objs.NewRoot(objs.NewCursor()) + game := objs.NewRoot(window, objs.NewCursor()) err = sdl.RunLoop(loop.New(game, window, renderer)) if err != nil { panic(err) diff --git a/objs/cursor.go b/objs/cursor.go index f6d412b..817279b 100644 --- a/objs/cursor.go +++ b/objs/cursor.go @@ -3,7 +3,7 @@ package objs import ( "github.com/Zyko0/go-sdl3/sdl" "ponger/ecs" - "ponger/input" + "ponger/events" ) type Cursor struct { @@ -22,7 +22,7 @@ func (c *Cursor) Render(renderer *sdl.Renderer) { renderer.RenderRect(r) } -func (c *Cursor) Process(ev input.Event) { +func (c *Cursor) ProcessMouseMotion(ev events.MouseMotion) { c.Position.X += ev.Dx c.Position.Y += ev.Dy if c.Position.X < 0 { diff --git a/objs/paddle.go b/objs/paddle.go index 843c301..fa7cea0 100644 --- a/objs/paddle.go +++ b/objs/paddle.go @@ -3,18 +3,12 @@ package objs import ( "github.com/Zyko0/go-sdl3/sdl" "ponger/ecs" - "ponger/input" ) type Paddle struct { *ecs.GameObject } -func (p *Paddle) Process(ev input.Event) { - //TODO implement me - panic("implement me") -} - func NewPaddle() ecs.IsGameObject { p := &Paddle{ GameObject: &ecs.GameObject{ diff --git a/objs/root.go b/objs/root.go index 649200d..44309ac 100644 --- a/objs/root.go +++ b/objs/root.go @@ -7,6 +7,7 @@ import ( type Root struct { *ecs.GameObject + Height, Width int32 } func (root *Root) Render(r *sdl.Renderer) { @@ -14,12 +15,15 @@ func (root *Root) Render(r *sdl.Renderer) { r.Clear() } -func NewRoot(children ...ecs.IsGameObject) ecs.IsGameObject { +func NewRoot(window *sdl.Window, children ...ecs.IsGameObject) ecs.IsGameObject { + x, y, _ := window.Size() r := &Root{ GameObject: &ecs.GameObject{ Position: sdl.FPoint{}, Children: children, }, + Width: x, + Height: y, } return r } diff --git a/render/event.go b/render/event.go new file mode 100644 index 0000000..faf5f5d --- /dev/null +++ b/render/event.go @@ -0,0 +1,10 @@ +package render + +type WindowEvent struct { + Width int + Height int +} + +type WindowListener interface { + WindowChanged(ev WindowEvent) +} diff --git a/tree/tree.go b/tree/tree.go new file mode 100644 index 0000000..a48dbc0 --- /dev/null +++ b/tree/tree.go @@ -0,0 +1,43 @@ +package tree + +import ( + "github.com/Zyko0/go-sdl3/sdl" + "ponger/ecs" + "ponger/events" + "ponger/input" + "ponger/render" +) + +func Process(root ecs.IsGameObject, delta uint64, renderer *sdl.Renderer) error { + evs, err := events.Poll(delta) + if err != nil { + return err + } + ParseRecursive(root, delta, renderer, evs...) + return nil +} + +func ParseRecursive(current ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) { + ParseSingle(current, delta, renderer, evs...) + for _, c := range current.GO().Children { + if c == nil { + continue + } + ParseSingle(c, delta, renderer, evs...) + } +} + +func ParseSingle(obj ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) { + switch impl := obj.(type) { + case input.MouseMotionHandler: + for _, e := range events.OfType[events.MouseMotion](evs...) { + impl.ProcessMouseMotion(e) + } + case input.MousePressHandler: + for _, e := range events.OfType[events.MousePress](evs...) { + impl.ProcessMousePress(e) + } + case render.Renders: + impl.Render(renderer) + } +} |
