summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--events/events.go43
-rw-r--r--events/poll.go39
-rw-r--r--input/input.go29
-rw-r--r--input/sdl.go34
-rw-r--r--loop/loop.go4
-rw-r--r--main.go2
-rw-r--r--objs/cursor.go4
-rw-r--r--objs/paddle.go6
-rw-r--r--objs/root.go6
-rw-r--r--render/event.go10
-rw-r--r--tree/tree.go43
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
}
diff --git a/main.go b/main.go
index 9fdc1f9..1372daf 100644
--- a/main.go
+++ b/main.go
@@ -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)
+ }
+}