From 9c10e3ab194115f50f0d67044ef34d386be7fa9a Mon Sep 17 00:00:00 2001 From: Physcik Date: Thu, 29 Jan 2026 02:55:19 +0500 Subject: Dynamic objects overlay --- engine/Components/Player.go | 6 +-- engine/Components/ResourceManager.go | 1 + engine/Components/World.go | 14 ++++++- engine/CoreObjects/DynamicObject.go | 76 ++++++++++++++++++++++++++++++++---- engine/CoreObjects/GameObject.go | 2 +- engine/CoreObjects/OverlayScene.go | 4 ++ engine/CoreObjects/Scene.go | 3 ++ engine/Settings/State.go | 2 +- 8 files changed, 94 insertions(+), 14 deletions(-) (limited to 'engine') diff --git a/engine/Components/Player.go b/engine/Components/Player.go index c06820e..fe8c5ef 100644 --- a/engine/Components/Player.go +++ b/engine/Components/Player.go @@ -89,12 +89,12 @@ func (base *Player) Draw() { // Centers the camera center to the player func (base *Player) SnapCamera(camera *rl.Camera2D) { var offset = rl.Vector2 { - X: float32(base.Texture.Width) / 2, + X: float32(base.Texture.Width) / 2, Y: float32(base.Texture.Height) / 2, } camera.Target = rl.Vector2Add(base.Position, offset) - camera.Offset.X = float32(int32(rl.GetScreenWidth() / 2)) - camera.Offset.Y = float32(int32(rl.GetScreenHeight() / 2)) + camera.Offset.X = float32(rl.GetScreenWidth()) / 2 + camera.Offset.Y = float32(rl.GetScreenHeight()) / 2 } // If the player model size doesn't align with the sprite this function will diff --git a/engine/Components/ResourceManager.go b/engine/Components/ResourceManager.go index cbccf5f..b33acc0 100644 --- a/engine/Components/ResourceManager.go +++ b/engine/Components/ResourceManager.go @@ -35,6 +35,7 @@ func (base *ResourceManager) RegisterObject(PackageName string, obejctName strin if _, exists := base.objects[displayName]; exists { return fmt.Errorf("Failed to register the obejct: another obejct with that name already exists") } + new.PrototypeName = displayName base.objects[displayName] = new return nil } diff --git a/engine/Components/World.go b/engine/Components/World.go index 0c322ba..26c1a83 100644 --- a/engine/Components/World.go +++ b/engine/Components/World.go @@ -27,6 +27,9 @@ type World struct { func (base *World) Create(manager coreobjects.SceneManager) { base.Manager = manager base.Player.Init(manager) + for _, v := range base.StaticObjects { + v.Init(manager) + } base.layersStatic = layering{} base.generateStaticLayers() } @@ -36,6 +39,9 @@ func (base *World) Destroy() { } func (base *World) Update() { + for _, v := range base.StaticObjects { + v.Update() + } base.Player.Update() base.Player.SnapCamera(base.Camera) base.handleZoom() @@ -68,7 +74,10 @@ func (base *World) Draw() { for _, v := range base.Floor { v.Draw() } + base.drawObjects() +} +func (base *World) drawObjects() { var playerDrawn = false var layer = base.layersStatic.firstLayer var i = 0 @@ -78,7 +87,6 @@ func (base *World) Draw() { } if !playerDrawn && base.Player.Position.Y < layer.Index { playerDrawn = true - // fmt.Printf("Player drawn at layer %d\n", i) base.Player.Draw() } for _, v := range layer.Objects { @@ -99,6 +107,10 @@ func (base *World) generateStaticLayers() { } } +func (base *World) GetMousePosition() rl.Vector2 { + return rl.GetScreenToWorld2D(rl.GetMousePosition(), *base.Camera) +} + // The single texture drawn at level 0 of the world type FloorTile struct { Position rl.Vector2 diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go index cf1378f..36614d6 100644 --- a/engine/CoreObjects/DynamicObject.go +++ b/engine/CoreObjects/DynamicObject.go @@ -1,13 +1,33 @@ package coreobjects -import rl "github.com/gen2brain/raylib-go/raylib" +import ( + "fmt" + + settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" + rl "github.com/gen2brain/raylib-go/raylib" +) + +// The size of the font used in the overaly +const objectOverlayTextSize int32 = 12 +// An offset of the overlay compared to the mouse position +const objectOveralyOffset float32 = 10 +// An offset of the overlay compared to the mouse position +const objectOveralyPadding int32 = 3 +// The color of the overlay text +var objectOverlayTextColor = rl.Black +// The color of the overlay background +var objectOverlayBackgroundColor = rl.LightGray // An object loaded from the package. Impmiments GameObject interface type DynamicObject struct { + PrototypeName string `json:"-"` Position rl.Vector2 YLevelOffset float32 Textures []*TextureBlock Colliders []*ColliderBlock + + parentScene Scene + showTooltip bool } // The dynamic objects can contain multiple textures. This struct @@ -22,24 +42,64 @@ type ColliderBlock struct { Offset rl.Vector2 } -func (base *DynamicObject) Create(SceneManager) { +func (base *DynamicObject) Init(manager SceneManager) { + if manager.SelectedScene == nil { + panic("Failed to initialize a dynamic object: the scene was not selected") + } + base.parentScene = manager.SelectedScene } func (base *DynamicObject) Destroy() { } func (base *DynamicObject) Update() { + if settings.State.DrawColliders { + base.showTooltip = false + var mousePosition = base.parentScene.GetMousePosition() + for _, v := range base.Colliders { + if v.Collider.Intersects(mousePosition.X, mousePosition.Y) { + base.showTooltip = true + return + } + } + } +} + +func (base *DynamicObject) drawOverlay() { + var mousePoint = base.parentScene.GetMousePosition() + var text = fmt.Sprintf("Proto: %s", base.PrototypeName) + var overlayPosX = mousePoint.X + objectOveralyOffset + var overlayPosY = mousePoint.Y + var size = rl.MeasureText(text, objectOverlayTextSize) + + rl.DrawRectangle( + int32(overlayPosX), + int32(overlayPosY), + size + objectOveralyPadding * 2, + objectOverlayTextSize + objectOveralyPadding, + objectOverlayBackgroundColor) + + rl.DrawText(string(text), + int32(overlayPosX) + objectOveralyPadding, + int32(overlayPosY), + objectOverlayTextSize, + objectOverlayTextColor) } 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) + int32(base.Position.X + v.Offset.X), + int32(base.Position.Y + v.Offset.Y), + rl.White) } - for _, v := range base.Colliders { - v.Collider.Draw() + if settings.State.DrawColliders { + for _, v := range base.Colliders { + v.Collider.Draw() + if base.showTooltip { + base.drawOverlay() + } + } } } @@ -52,6 +112,7 @@ func (base *DynamicObject) MoveTo(x float32, y float32) { func (base *DynamicObject) Clone() *DynamicObject { var outp = DynamicObject { + PrototypeName: base.PrototypeName, YLevelOffset: base.YLevelOffset, Position: base.Position, Textures: base.Textures, @@ -67,7 +128,6 @@ func (base *DynamicObject) cloneColliders() []*ColliderBlock { Collider: v.Collider.Clone(), Offset: v.Offset, } - } return outp } diff --git a/engine/CoreObjects/GameObject.go b/engine/CoreObjects/GameObject.go index 186da1f..9ff1b87 100644 --- a/engine/CoreObjects/GameObject.go +++ b/engine/CoreObjects/GameObject.go @@ -1,7 +1,7 @@ package coreobjects type GameObject interface { - Create(SceneManager) + Init(SceneManager) Destroy() Update() Draw() diff --git a/engine/CoreObjects/OverlayScene.go b/engine/CoreObjects/OverlayScene.go index a15fd17..3c79b78 100644 --- a/engine/CoreObjects/OverlayScene.go +++ b/engine/CoreObjects/OverlayScene.go @@ -17,6 +17,10 @@ func (base *OveralyScene) Create(_ SceneManager) { func (base *OveralyScene) Destroy() { } +func (base *OveralyScene) GetMousePosition() rl.Vector2 { + return rl.GetMousePosition() +} + func (base *OveralyScene) Update() { base.FPS.Update() if rl.IsKeyPressed(rl.KeyF7) { diff --git a/engine/CoreObjects/Scene.go b/engine/CoreObjects/Scene.go index bcb8c63..a945bec 100644 --- a/engine/CoreObjects/Scene.go +++ b/engine/CoreObjects/Scene.go @@ -1,5 +1,7 @@ package coreobjects +import rl "github.com/gen2brain/raylib-go/raylib" + type SceneManager struct { OverlayScene Scene SelectedScene Scene @@ -10,6 +12,7 @@ type Scene interface { Destroy() Update() Draw() + GetMousePosition() rl.Vector2 } func InitSceneManager() SceneManager { diff --git a/engine/Settings/State.go b/engine/Settings/State.go index 1db8024..94ad2a5 100644 --- a/engine/Settings/State.go +++ b/engine/Settings/State.go @@ -6,5 +6,5 @@ type GlobalState struct { } var State = GlobalState { - DrawColliders: true, + DrawColliders: false, } -- cgit v1.3