summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-08-14 12:32:05 +0200
committerewy <ewy0@protonmail.com>2026-08-14 12:32:05 +0200
commit48215d06a6cc0753a839e58c3403d34f69c250d4 (patch)
tree3c391d8edc2e52818072a48c7e36abefeb3b7671
parentbc3f852ea670e206fa3facc736a230f6b9d23920 (diff)
add components in addition to gameobject interfacesHEADmaster
-rw-r--r--ecs/component.go7
-rw-r--r--ecs/event.go6
-rw-r--r--ecs/gameobject.go16
-rw-r--r--events/events.go8
-rw-r--r--events/poll.go2
-rw-r--r--loop/loop.go3
-rw-r--r--objs/cursor.go23
-rw-r--r--objs/root.go4
-rw-r--r--render/render.go12
-rw-r--r--tree/tree.go13
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)