summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/CoreObjects/Collider.go8
-rw-r--r--engine/CoreObjects/DynamicObject.go37
-rw-r--r--engine/CoreObjects/GameObject.go1
-rw-r--r--engine/Dynamic/Descriptors/Objects.go56
-rw-r--r--engine/Dynamic/Descriptors/World.go2
-rw-r--r--packages/TestPackage/Objects/Barn.json7
6 files changed, 104 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
diff --git a/packages/TestPackage/Objects/Barn.json b/packages/TestPackage/Objects/Barn.json
index bee19e5..8bb6ae6 100644
--- a/packages/TestPackage/Objects/Barn.json
+++ b/packages/TestPackage/Objects/Barn.json
@@ -5,5 +5,12 @@
"Name": "testPackage/barn_v1.png",
"Offset": { "X": 0, "Y": 0 }
}
+ ],
+ "Colliders": [
+ {
+ "Type": "box",
+ "Size": { "X": 96, "Y": 52 },
+ "Offset": { "X": 16, "Y": 76 }
+ }
]
}