diff options
| -rw-r--r-- | engine/Components/ResourceManager.go | 12 | ||||
| -rw-r--r-- | engine/CoreObjects/DynamicObject.go | 34 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/Objects.go | 78 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/World.go | 2 | ||||
| -rw-r--r-- | engine/Dynamic/Manager.go | 2 | ||||
| -rw-r--r-- | engine/Dynamic/Package.go | 34 | ||||
| -rw-r--r-- | engine/main.go | 5 | ||||
| -rw-r--r-- | packages/TestPackage/Objects/Barn.json | 9 | ||||
| -rw-r--r-- | packages/TestPackage/Textures/Meta.json | 3 | ||||
| -rw-r--r-- | packages/TestPackage/Textures/barn_v1.png | bin | 0 -> 1970 bytes | |||
| -rw-r--r-- | packages/TestPackage/Worlds/Main.json | 8 |
11 files changed, 178 insertions, 9 deletions
diff --git a/engine/Components/ResourceManager.go b/engine/Components/ResourceManager.go index 19f0315..3e62a6b 100644 --- a/engine/Components/ResourceManager.go +++ b/engine/Components/ResourceManager.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" rl "github.com/gen2brain/raylib-go/raylib" ) @@ -13,6 +14,7 @@ var Resources ResourceManager type ResourceManager struct { LoadedPackages map[string]*settings.AppVersion Textures TextrueManager + Objects map[string]*coreobjects.DynamicObject Worlds map[string]*World } @@ -20,6 +22,7 @@ func InitManager() { Resources = ResourceManager{ LoadedPackages: make(map[string]*settings.AppVersion), Worlds: make(map[string]*World), + Objects: make(map[string]*coreobjects.DynamicObject), Textures: TextrueManager{ Textures: make([]*rl.Texture2D, 0), NameToId: make(map[string]uint64), @@ -27,6 +30,15 @@ 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 { + return fmt.Errorf("Failed to register the obejct: another obejct with that name already exists") + } + base.Objects[displayName] = new + return nil +} + func (base *ResourceManager) String() string { var outp, jsonErr = json.Marshal(base) if jsonErr != nil { diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go new file mode 100644 index 0000000..9e1d48b --- /dev/null +++ b/engine/CoreObjects/DynamicObject.go @@ -0,0 +1,34 @@ +package coreobjects + +import rl "github.com/gen2brain/raylib-go/raylib" + +// An object loaded from the package. Impmiments GameObject interface +type DynamicObject struct { + Position rl.Vector2 + Textures []*TextureBlock +} + +// The dynamic objects can contain multiple textures. This struct +// represents one of those parts +type TextureBlock struct { + Texture *rl.Texture2D + Offset rl.Vector2 +} + +func (base *DynamicObject) Create(SceneManager) { +} + +func (base *DynamicObject) Destroy() { +} + +func (base *DynamicObject) Update() { +} + +func (base *DynamicObject) Draw() { + for _, v := range base.Textures { + rl.DrawTexture(*v.Texture, + int32(base.Position.X + v.Offset.X), + int32(base.Position.Y + v.Offset.Y), + rl.White) + } +} diff --git a/engine/Dynamic/Descriptors/Objects.go b/engine/Dynamic/Descriptors/Objects.go new file mode 100644 index 0000000..92a44d7 --- /dev/null +++ b/engine/Dynamic/Descriptors/Objects.go @@ -0,0 +1,78 @@ +package descriptors + +import ( + "encoding/json" + "fmt" + + components "github.com/DegustatorPonos/RuinesOfRafdolon/Components" + coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ObjectsDirName string = "Objects" + +type ObjectDescriptor struct { + Name string + Textures []*ObjectTextureBlock +} + +// Maps objects by their IDs +func MapObjectDescriptors(loaded []*ObjectDescriptor) map[string]*ObjectDescriptor { + var outp = make(map[string]*ObjectDescriptor, 0) + for _, v := range loaded { + outp[v.Name] = v + } + return outp +} + +func (base *ObjectDescriptor) IsValid() error { + if base.Textures == nil { + return fmt.Errorf("The textures are not specified") + } + for i, v := range base.Textures { + // The texture was not specified + if v.TextureId == nil && len(v.Name) == 0 { + return fmt.Errorf("The texture #%d was not specified (neither texture name nor ID)", i) + } + } + 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 { + 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 { + Texture: texture, + Offset: v.Offset, + } + } + return outp +} + +type ObjectTextureBlock struct { + Name string + TextureId *uint64 + Offset rl.Vector2 +} + +func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) { + if base.TextureId != nil { + return components.Resources.Textures.GetTexture(*base.TextureId) + } + return components.Resources.Textures.GetTextureByName(base.Name) +} + +func (base *ObjectDescriptor) String() string { + var outp, jsonErr = json.Marshal(base) + if jsonErr != nil { + return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error()) + } + return string(outp) +} diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go index 0a6a7d9..c449ab0 100644 --- a/engine/Dynamic/Descriptors/World.go +++ b/engine/Dynamic/Descriptors/World.go @@ -5,6 +5,8 @@ import ( rl "github.com/gen2brain/raylib-go/raylib" ) +const WorldsDirName string = "Worlds" + type WorldDescriptor struct { Name string // Deprecated diff --git a/engine/Dynamic/Manager.go b/engine/Dynamic/Manager.go index 7b7d6b4..5e2001c 100644 --- a/engine/Dynamic/Manager.go +++ b/engine/Dynamic/Manager.go @@ -33,7 +33,9 @@ func loadPackages() (*PackageManager, error) { } newPackage.location = packagePath + // Do not change this order - some descriptors rely on other newPackage.ReadTextures() + newPackage.ReadObjects() newPackage.ReadWorlds() outp.AvaliablePackages[newPackage.Description.Name] = *newPackage diff --git a/engine/Dynamic/Package.go b/engine/Dynamic/Package.go index 2d8cc72..fe03aae 100644 --- a/engine/Dynamic/Package.go +++ b/engine/Dynamic/Package.go @@ -42,6 +42,7 @@ type Package struct { Description PackageDescription Textures *descriptors.TexturesDescriptor + Objects map[string]*descriptors.ObjectDescriptor Worlds map[string]*descriptors.WorldDescriptor location string @@ -108,7 +109,7 @@ func (base *Package) ReadWorlds() { if base.Description.Type != "story" { return } - var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, "Worlds")) + var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, descriptors.WorldsDirName)) if loadErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load world from the module %s: %s", base.location, loadErr) } else { @@ -116,6 +117,7 @@ func (base *Package) ReadWorlds() { } } +// Loads worlds in the resource manager func (base *Package) LoadWorlds() { if base.Description.Type != "story" { return @@ -126,6 +128,27 @@ func (base *Package) LoadWorlds() { } } +func (base *Package) ReadObjects() { + var loaded, err = loadObjectsFromDir(utils.JoinFileLocation(base.location, descriptors.ObjectsDirName)) + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to load objects from the module %s: %s", base.location, err) + return + } + base.Objects = loaded +} + +// Loads objects in the resource manager +func (base *Package) LoadObjects() { + rl.TraceLog(rl.LogInfo, "%s", base.Objects) + for _, v := range base.Objects { + var parsed = v.Parse() + var err = components.Resources.RegisterObject(base.Description.Name, v.Name, &parsed) + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to register object %s: %s", v.Name, err.Error()) + } + } +} + func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescriptor, error) { var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.WorldDescriptor{ return &descriptors.WorldDescriptor{} }) if err != nil { @@ -134,11 +157,12 @@ func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescrip return descriptors.MapWorldDescriptors(loaded), nil } -// Deprecated -func loadTilesFromDir(dirLocation string) (map[uint64]*descriptors.TileDescriptor, error) { - var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.TileDescriptor{ return &descriptors.TileDescriptor{} }) +func loadObjectsFromDir(dir string) (map[string]*descriptors.ObjectDescriptor, error) { + var loaded, err = loadAssetsFromDir(dir, func() *descriptors.ObjectDescriptor { + return &descriptors.ObjectDescriptor{} + }) if err != nil { return nil, err } - return descriptors.MapTileDescriptors(loaded), nil + return descriptors.MapObjectDescriptors(loaded), nil } diff --git a/engine/main.go b/engine/main.go index 96c4fa8..b1a2be1 100644 --- a/engine/main.go +++ b/engine/main.go @@ -18,9 +18,10 @@ func main() { defer render.DeinitWindow() // TEMPORARY SECTION - for k, v := range dynamic.Manager.AvaliablePackages { - log.Printf("%s: %s", k, &v) + for _, v := range dynamic.Manager.AvaliablePackages { + // log.Printf("%s: %s", k, &v) v.LoadTextures() + v.LoadObjects() v.LoadWorlds() } log.Printf("Resource manager: %s", &components.Resources) diff --git a/packages/TestPackage/Objects/Barn.json b/packages/TestPackage/Objects/Barn.json new file mode 100644 index 0000000..bee19e5 --- /dev/null +++ b/packages/TestPackage/Objects/Barn.json @@ -0,0 +1,9 @@ +{ + "Name": "barn", + "Textures": [ + { + "Name": "testPackage/barn_v1.png", + "Offset": { "X": 0, "Y": 0 } + } + ] +} diff --git a/packages/TestPackage/Textures/Meta.json b/packages/TestPackage/Textures/Meta.json index 2fd3d34..90f011d 100644 --- a/packages/TestPackage/Textures/Meta.json +++ b/packages/TestPackage/Textures/Meta.json @@ -3,6 +3,7 @@ "common.png", "TestWorld.png", "water.png", - "tree.png" + "tree.png", + "barn_v1.png" ] } diff --git a/packages/TestPackage/Textures/barn_v1.png b/packages/TestPackage/Textures/barn_v1.png Binary files differnew file mode 100644 index 0000000..ee2bb3a --- /dev/null +++ b/packages/TestPackage/Textures/barn_v1.png diff --git a/packages/TestPackage/Worlds/Main.json b/packages/TestPackage/Worlds/Main.json index 79da91f..466edf1 100644 --- a/packages/TestPackage/Worlds/Main.json +++ b/packages/TestPackage/Worlds/Main.json @@ -1,10 +1,16 @@ { "Name": "MainWorld", + "DefaultStartingPosition": { "X": 64, "Y": 64 }, "FloorMap": [ { "Position": { "X": 0, "Y": 0 }, "Texture": "testPackage/TestWorld.png" } ], - "DefaultStartingPosition": { "X": 64, "Y": 64 } + "StaticObjects": [ + { + "Object": "testPackage/barn", + "Location": { "X": 256, "Y": 256 } + } + ] } |
