summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorPhyscik <mynameisgennadiy@vk.com>2026-01-25 01:11:59 +0500
committerPhyscik <mynameisgennadiy@vk.com>2026-01-25 01:11:59 +0500
commit3ba197732d13d84eca0d706218b38d4f84cecba9 (patch)
treebcb9a967cb648277325ea60ba45905c024a2f8d6 /engine
parentaa35ce4db5326928cf13c7604014fb7aaaedf203 (diff)
Object scene registry
Diffstat (limited to 'engine')
-rw-r--r--engine/Components/ResourceManager.go16
-rw-r--r--engine/Components/World.go4
-rw-r--r--engine/CoreObjects/DynamicObject.go8
-rw-r--r--engine/Dynamic/Descriptors/World.go28
4 files changed, 50 insertions, 6 deletions
diff --git a/engine/Components/ResourceManager.go b/engine/Components/ResourceManager.go
index 3e62a6b..cbccf5f 100644
--- a/engine/Components/ResourceManager.go
+++ b/engine/Components/ResourceManager.go
@@ -14,7 +14,7 @@ var Resources ResourceManager
type ResourceManager struct {
LoadedPackages map[string]*settings.AppVersion
Textures TextrueManager
- Objects map[string]*coreobjects.DynamicObject
+ objects map[string]*coreobjects.DynamicObject
Worlds map[string]*World
}
@@ -22,7 +22,7 @@ func InitManager() {
Resources = ResourceManager{
LoadedPackages: make(map[string]*settings.AppVersion),
Worlds: make(map[string]*World),
- Objects: make(map[string]*coreobjects.DynamicObject),
+ objects: make(map[string]*coreobjects.DynamicObject),
Textures: TextrueManager{
Textures: make([]*rl.Texture2D, 0),
NameToId: make(map[string]uint64),
@@ -32,13 +32,21 @@ func InitManager() {
func (base *ResourceManager) RegisterObject(PackageName string, obejctName string, new *coreobjects.DynamicObject) error {
var displayName = fmt.Sprintf("%s/%s", PackageName, obejctName)
- if _, exists := base.Objects[displayName]; exists {
+ if _, exists := base.objects[displayName]; exists {
return fmt.Errorf("Failed to register the obejct: another obejct with that name already exists")
}
- base.Objects[displayName] = new
+ base.objects[displayName] = new
return nil
}
+func (base *ResourceManager) GetObject(name string) (*coreobjects.DynamicObject, error) {
+ var obj, exists = base.objects[name]
+ if !exists {
+ return nil, fmt.Errorf("An object '%s' was not found", name)
+ }
+ return obj, nil
+}
+
func (base *ResourceManager) String() string {
var outp, jsonErr = json.Marshal(base)
if jsonErr != nil {
diff --git a/engine/Components/World.go b/engine/Components/World.go
index 2b7954a..397cbb7 100644
--- a/engine/Components/World.go
+++ b/engine/Components/World.go
@@ -10,6 +10,7 @@ type World struct {
Manager coreobjects.SceneManager
Name string
Floor []FloorTile
+ StaticObjects []coreobjects.GameObject
Player *Player
@@ -58,6 +59,9 @@ func (base *World) Draw() {
for _, v := range base.Floor {
v.Draw()
}
+ for _, v := range base.StaticObjects {
+ v.Draw()
+ }
base.Player.Draw()
}
diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go
index 9e1d48b..8c70599 100644
--- a/engine/CoreObjects/DynamicObject.go
+++ b/engine/CoreObjects/DynamicObject.go
@@ -32,3 +32,11 @@ func (base *DynamicObject) Draw() {
rl.White)
}
}
+
+func (base *DynamicObject) Clone() *DynamicObject {
+ var outp = DynamicObject {
+ Position: base.Position,
+ Textures: base.Textures,
+ }
+ return &outp
+}
diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go
index c449ab0..425c3f2 100644
--- a/engine/Dynamic/Descriptors/World.go
+++ b/engine/Dynamic/Descriptors/World.go
@@ -2,6 +2,7 @@ package descriptors
import (
components "github.com/DegustatorPonos/RuinesOfRafdolon/Components"
+ coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects"
rl "github.com/gen2brain/raylib-go/raylib"
)
@@ -9,10 +10,11 @@ const WorldsDirName string = "Worlds"
type WorldDescriptor struct {
Name string
+ DefaultStartingPosition rl.Vector2
// Deprecated
TileSize rl.Vector2 `json:"-"`
FloorMap []FloorPiece
- DefaultStartingPosition rl.Vector2
+ StaticObjects []ObjectLink
}
func (base *WorldDescriptor) IsValid() error {
@@ -33,8 +35,14 @@ type FloorPiece struct {
Texture string
}
+type ObjectLink struct {
+ Object string
+ Position rl.Vector2
+}
+
// Transforms the world descriptor into the game world
-func (base WorldDescriptor) Parse() components.World {
+// Assumes that objects and textures have already been loaded
+func (base *WorldDescriptor) Parse() components.World {
var outp = components.World {
Name: base.Name,
Floor: make([]components.FloorTile, 0, len(base.FloorMap)),
@@ -42,6 +50,7 @@ func (base WorldDescriptor) Parse() components.World {
Texture: *components.Resources.Textures.Textures[3], // TODO: Change
Position: base.DefaultStartingPosition,
},
+ StaticObjects: base.parseObjects(),
Camera: &rl.Camera2D{
Offset: rl.Vector2 {X: 0, Y: 0},
@@ -64,3 +73,18 @@ func (base WorldDescriptor) Parse() components.World {
}
return outp
}
+
+func (base *WorldDescriptor) parseObjects() []coreobjects.GameObject {
+ var outp = make([]coreobjects.GameObject, 0, len(base.StaticObjects))
+ for _, v := range base.StaticObjects {
+ var model, modelErr = components.Resources.GetObject(v.Object)
+ if modelErr != nil {
+ rl.TraceLog(rl.LogWarning, "Failed to parse an object in the world %s: %s", base.Name, modelErr.Error())
+ continue
+ }
+ var clone = model.Clone()
+ clone.Position = v.Position
+ outp = append(outp, clone)
+ }
+ return outp
+}