diff options
| author | Physcik <mynameisgennadiy@vk.com> | 2026-01-26 20:40:49 +0500 |
|---|---|---|
| committer | Physcik <mynameisgennadiy@vk.com> | 2026-01-26 20:40:49 +0500 |
| commit | a46e7d650896d86c7bade602446ac9539d93396a (patch) | |
| tree | 56787d8625aa8f66a002dd8eaa97541d83d96b4e /engine | |
| parent | 3ba197732d13d84eca0d706218b38d4f84cecba9 (diff) | |
Collider registrty
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/CoreObjects/Collider.go | 8 | ||||
| -rw-r--r-- | engine/CoreObjects/DynamicObject.go | 37 | ||||
| -rw-r--r-- | engine/CoreObjects/GameObject.go | 1 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/Objects.go | 56 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/World.go | 2 |
5 files changed, 97 insertions, 7 deletions
diff --git a/engine/CoreObjects/Collider.go b/engine/CoreObjects/Collider.go index 93cbee6..6603058 100644 --- a/engine/CoreObjects/Collider.go +++ b/engine/CoreObjects/Collider.go @@ -15,6 +15,7 @@ type Collider interface { MoveTo(x float32, y float32) Intersects(x float32, y float32) bool CanMove(colliders []*Collider, dx float32, dy float32) bool + Clone() Collider Draw() } @@ -83,3 +84,10 @@ func (base *BoxCollider) CanMove(colliders []*Collider, dx float32, dy float32) } return true } + +func (base *BoxCollider) Clone() Collider { + var clone = (&BoxCollider{}).Init ( + base.Location.X, base.Location.Y, + base.Location.Width, base.Location.Height) + return clone +} diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go index 8c70599..0462ebb 100644 --- a/engine/CoreObjects/DynamicObject.go +++ b/engine/CoreObjects/DynamicObject.go @@ -6,6 +6,7 @@ import rl "github.com/gen2brain/raylib-go/raylib" type DynamicObject struct { Position rl.Vector2 Textures []*TextureBlock + Colliders []*ColliderBlock } // The dynamic objects can contain multiple textures. This struct @@ -15,6 +16,11 @@ type TextureBlock struct { Offset rl.Vector2 } +type ColliderBlock struct { + Collider Collider + Offset rl.Vector2 +} + func (base *DynamicObject) Create(SceneManager) { } @@ -31,12 +37,43 @@ func (base *DynamicObject) Draw() { int32(base.Position.Y + v.Offset.Y), rl.White) } + for _, v := range base.Colliders { + v.Collider.Draw() + } +} + +func (base *DynamicObject) MoveTo(x float32, y float32) { + base.Position = rl.Vector2 { X: x, Y: y } + for _, v := range base.Colliders { + v.Collider.MoveTo(x + v.Offset.X, y + v.Offset.Y) + } } func (base *DynamicObject) Clone() *DynamicObject { var outp = DynamicObject { Position: base.Position, Textures: base.Textures, + Colliders: base.cloneColliders(), } return &outp } + +func (base *DynamicObject) cloneColliders() []*ColliderBlock { + var outp = make([]*ColliderBlock, len(base.Colliders)) + for i, v := range base.Colliders { + outp[i] = &ColliderBlock { + Collider: v.Collider.Clone(), + Offset: v.Offset, + } + + } + return outp +} + +func (base *DynamicObject) GetColliders() []Collider { + var outp = make([]Collider, 0, len(base.Colliders)) + for _, v := range base.Colliders { + outp = append(outp, v.Collider) + } + return outp +} diff --git a/engine/CoreObjects/GameObject.go b/engine/CoreObjects/GameObject.go index 255a405..087e1e9 100644 --- a/engine/CoreObjects/GameObject.go +++ b/engine/CoreObjects/GameObject.go @@ -5,4 +5,5 @@ type GameObject interface { Destroy() Update() Draw() + GetColliders() []Collider } diff --git a/engine/Dynamic/Descriptors/Objects.go b/engine/Dynamic/Descriptors/Objects.go index 92a44d7..fa67889 100644 --- a/engine/Dynamic/Descriptors/Objects.go +++ b/engine/Dynamic/Descriptors/Objects.go @@ -3,6 +3,7 @@ package descriptors import ( "encoding/json" "fmt" + "strings" components "github.com/DegustatorPonos/RuinesOfRafdolon/Components" coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" @@ -14,6 +15,7 @@ const ObjectsDirName string = "Objects" type ObjectDescriptor struct { Name string Textures []*ObjectTextureBlock + Colliders []*ObjectColliderBlock } // Maps objects by their IDs @@ -38,24 +40,45 @@ func (base *ObjectDescriptor) IsValid() error { return nil } -func (base *ObjectDescriptor) Parse() coreobjects.DynamicObject { - var outp = coreobjects.DynamicObject{ - Textures: make([]*coreobjects.TextureBlock, len(base.Textures)), - } - for i, v := range base.Textures { +func (base *ObjectDescriptor) parseTextures() []*coreobjects.TextureBlock { + var outp = make([]*coreobjects.TextureBlock, 0, len(base.Textures)) + for _, v := range base.Textures { var texture, err = v.GetTexture() if err != nil { rl.TraceLog(rl.LogWarning, "Failed to get the required by the object %s texture: %s", base.Name, err.Error()) continue } - outp.Textures[i] = &coreobjects.TextureBlock { + outp = append(outp, &coreobjects.TextureBlock { Texture: texture, Offset: v.Offset, + }) + } + return outp +} + +func (base *ObjectDescriptor) parseColliders() []*coreobjects.ColliderBlock { + var outp = make([]*coreobjects.ColliderBlock, 0, len(base.Colliders)) + for _, v := range base.Colliders { + var parsed, err = v.GetCollider() + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to parse the required by the object %s collidet: %s", base.Name, err.Error()) + continue } + outp = append(outp, &coreobjects.ColliderBlock{ + Collider: parsed, + Offset: v.Offset, + }) } return outp } +func (base *ObjectDescriptor) Parse() coreobjects.DynamicObject { + return coreobjects.DynamicObject { + Textures: base.parseTextures(), + Colliders: base.parseColliders(), + } +} + type ObjectTextureBlock struct { Name string TextureId *uint64 @@ -69,6 +92,27 @@ func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) { return components.Resources.Textures.GetTextureByName(base.Name) } +type ObjectColliderBlock struct { + Type string + Size rl.Vector2 + Offset rl.Vector2 +} + +func (base *ObjectColliderBlock) GetCollider() (coreobjects.Collider, error) { + switch strings.ToLower(base.Type) { + case "box": + return base.parseAsBox(), nil + } + return nil, fmt.Errorf("Failed to parse collider: type %s is unknown", base.Type) +} + +func (base *ObjectColliderBlock) parseAsBox() coreobjects.Collider { + var outp = (&coreobjects.BoxCollider{}).Init( + base.Offset.X, base.Offset.Y, + base.Size.X, base.Size.Y ) + return outp +} + func (base *ObjectDescriptor) String() string { var outp, jsonErr = json.Marshal(base) if jsonErr != nil { diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go index 425c3f2..f0328fd 100644 --- a/engine/Dynamic/Descriptors/World.go +++ b/engine/Dynamic/Descriptors/World.go @@ -83,7 +83,7 @@ func (base *WorldDescriptor) parseObjects() []coreobjects.GameObject { continue } var clone = model.Clone() - clone.Position = v.Position + clone.MoveTo(v.Position.X, v.Position.Y) outp = append(outp, clone) } return outp |
