diff options
| author | ewy <ewy0@protonmail.com> | 2026-08-14 12:32:05 +0200 |
|---|---|---|
| committer | ewy <ewy0@protonmail.com> | 2026-08-14 12:32:05 +0200 |
| commit | 48215d06a6cc0753a839e58c3403d34f69c250d4 (patch) | |
| tree | 3c391d8edc2e52818072a48c7e36abefeb3b7671 | |
| parent | bc3f852ea670e206fa3facc736a230f6b9d23920 (diff) | |
| -rw-r--r-- | ecs/component.go | 7 | ||||
| -rw-r--r-- | ecs/event.go | 6 | ||||
| -rw-r--r-- | ecs/gameobject.go | 16 | ||||
| -rw-r--r-- | events/events.go | 8 | ||||
| -rw-r--r-- | events/poll.go | 2 | ||||
| -rw-r--r-- | loop/loop.go | 3 | ||||
| -rw-r--r-- | objs/cursor.go | 23 | ||||
| -rw-r--r-- | objs/root.go | 4 | ||||
| -rw-r--r-- | render/render.go | 12 | ||||
| -rw-r--r-- | tree/tree.go | 13 |
10 files changed, 61 insertions, 33 deletions
diff --git a/ecs/component.go b/ecs/component.go new file mode 100644 index 0000000..f42f2e7 --- /dev/null +++ b/ecs/component.go @@ -0,0 +1,7 @@ +package ecs + +import "ponger/events" + +type Component interface { + Process(delta events.Delta, object *GameObject) +} diff --git a/ecs/event.go b/ecs/event.go deleted file mode 100644 index 00904d9..0000000 --- a/ecs/event.go +++ /dev/null @@ -1,6 +0,0 @@ -package ecs - -type Event struct { - // Delta is time between events in ms - Delta uint64 -} diff --git a/ecs/gameobject.go b/ecs/gameobject.go index a2718c3..86429d7 100644 --- a/ecs/gameobject.go +++ b/ecs/gameobject.go @@ -1,10 +1,14 @@ package ecs -import "github.com/Zyko0/go-sdl3/sdl" +import ( + "fmt" + "github.com/Zyko0/go-sdl3/sdl" +) type GameObject struct { - Position sdl.FPoint - Children []IsGameObject + Position sdl.FPoint + Children []IsGameObject + Components []Component } func (g *GameObject) GO() *GameObject { @@ -14,3 +18,9 @@ func (g *GameObject) GO() *GameObject { type IsGameObject interface { GO() *GameObject } + +func (g *GameObject) Safe(err error) { + if err != nil { + fmt.Printf("%v\n", err.Error()) + } +} diff --git a/events/events.go b/events/events.go index 6783703..deea8ac 100644 --- a/events/events.go +++ b/events/events.go @@ -1,15 +1,17 @@ package events +type Delta uint64 + type DeviceID int type MouseMotion struct { Which DeviceID Dx, Dy float32 - Delta uint64 + Delta } type MousePress struct { - Delta uint64 + Delta Key uint8 Which DeviceID JustPressed, JustReleased, IsPressed bool @@ -20,7 +22,7 @@ type WindowChange struct { } type KeyPress struct { - Delta uint64 + Delta Key string Which DeviceID JustPressed, JustReleased, IsPressed bool diff --git a/events/poll.go b/events/poll.go index c57621e..ee4d171 100644 --- a/events/poll.go +++ b/events/poll.go @@ -4,7 +4,7 @@ import ( "github.com/Zyko0/go-sdl3/sdl" ) -func Poll(delta uint64) ([]any, error) { +func Poll(delta Delta) ([]any, error) { var evs []any var event sdl.Event for sdl.PollEvent(&event) { diff --git a/loop/loop.go b/loop/loop.go index 76b7128..65db525 100644 --- a/loop/loop.go +++ b/loop/loop.go @@ -3,6 +3,7 @@ package loop import ( "github.com/Zyko0/go-sdl3/sdl" "ponger/ecs" + "ponger/events" "ponger/render" "ponger/tree" ) @@ -12,7 +13,7 @@ func New(game ecs.IsGameObject, window *sdl.Window, renderer *sdl.Renderer) func return func() error { next := sdl.Ticks() delta := next - now - err := tree.Process(game, delta, renderer) + err := tree.Process(game, events.Delta(delta), renderer) if err != nil { return err } diff --git a/objs/cursor.go b/objs/cursor.go index 2a676fe..bf4d624 100644 --- a/objs/cursor.go +++ b/objs/cursor.go @@ -9,6 +9,12 @@ import ( type Cursor struct { *ecs.GameObject MaxX, MaxY float32 + Trail []sdl.FPoint + Pressed bool +} + +func (c *Cursor) ProcessMousePress(ev events.MousePress) { + c.Pressed = ev.IsPressed } func (c *Cursor) ProcessWindowChange(ev events.WindowChange) { @@ -17,7 +23,12 @@ func (c *Cursor) ProcessWindowChange(ev events.WindowChange) { } func (c *Cursor) Render(renderer *sdl.Renderer) { - renderer.SetDrawColor(255, 0, 0, 255) + if c.Pressed { + c.Trail = append(c.Trail, c.Position) + } else { + c.Trail = nil + } + c.Safe(renderer.SetDrawColor(255, 0, 0, 255)) size := float32(13) r := &sdl.FRect{ X: c.Position.X - size/2, @@ -25,7 +36,10 @@ func (c *Cursor) Render(renderer *sdl.Renderer) { W: size, H: size, } - renderer.RenderRect(r) + c.Safe(renderer.RenderRect(r)) + if c.Trail != nil { + c.Safe(renderer.RenderLines(c.Trail)) + } } func (c *Cursor) ProcessMouseMotion(ev events.MouseMotion) { @@ -44,11 +58,6 @@ func (c *Cursor) ProcessMouseMotion(ev events.MouseMotion) { c.Position.Y = c.MaxY } } - -func (c *Cursor) GO() *ecs.GameObject { - return c.GameObject -} - func NewCursor() ecs.IsGameObject { return &Cursor{ GameObject: &ecs.GameObject{}, diff --git a/objs/root.go b/objs/root.go index 44309ac..92f3804 100644 --- a/objs/root.go +++ b/objs/root.go @@ -11,8 +11,8 @@ type Root struct { } func (root *Root) Render(r *sdl.Renderer) { - r.SetDrawColor(0, 0, 0, 255) - r.Clear() + root.Safe(r.SetDrawColor(0, 0, 0, 255)) + root.Safe(r.Clear()) } func NewRoot(window *sdl.Window, children ...ecs.IsGameObject) ecs.IsGameObject { diff --git a/render/render.go b/render/render.go index 0f0beaf..f7b049d 100644 --- a/render/render.go +++ b/render/render.go @@ -9,16 +9,14 @@ type Renders interface { Render(renderer *sdl.Renderer) } -func Render(root any, renderer *sdl.Renderer) { +func Render(root ecs.IsGameObject, renderer *sdl.Renderer) { if r, ok := root.(Renders); ok { r.Render(renderer) } - if g, ok := root.(ecs.IsGameObject); ok { - for _, c := range g.GO().Children { - if c == nil { - continue - } - Render(c, renderer) + for _, c := range root.GO().Children { + if c == nil { + continue } + Render(c, renderer) } } diff --git a/tree/tree.go b/tree/tree.go index d39d296..34d7fa6 100644 --- a/tree/tree.go +++ b/tree/tree.go @@ -7,7 +7,7 @@ import ( "ponger/render" ) -func Process(root ecs.IsGameObject, delta uint64, renderer *sdl.Renderer) error { +func Process(root ecs.IsGameObject, delta events.Delta, renderer *sdl.Renderer) error { evs, err := events.Poll(delta) if err != nil { return err @@ -16,7 +16,7 @@ func Process(root ecs.IsGameObject, delta uint64, renderer *sdl.Renderer) error return nil } -func ParseRecursive(current ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) { +func ParseRecursive(current ecs.IsGameObject, delta events.Delta, renderer *sdl.Renderer, evs ...any) { ParseSingle(current, delta, renderer, evs...) for _, c := range current.GO().Children { if c == nil { @@ -24,9 +24,16 @@ func ParseRecursive(current ecs.IsGameObject, delta uint64, renderer *sdl.Render } ParseSingle(c, delta, renderer, evs...) } + for _, c := range current.GO().Components { + if c == nil { + continue + } + c.Process(delta, current.GO()) + ParseSingle(c, delta, renderer, evs...) + } } -func ParseSingle(obj ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) { +func ParseSingle(obj any, delta events.Delta, renderer *sdl.Renderer, evs ...any) { if impl, ok := obj.(events.WindowChangeHandler); ok { for _, e := range events.OfType[events.WindowChange](evs...) { impl.ProcessWindowChange(e) |
