diff options
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/Components/ResourceManager.go | 16 | ||||
| -rw-r--r-- | engine/Components/World.go | 4 | ||||
| -rw-r--r-- | engine/CoreObjects/DynamicObject.go | 8 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/World.go | 28 |
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 +} |
