diff options
| author | physcik <mynameisgennadiy@vk.com> | 2026-03-20 13:59:24 +0500 |
|---|---|---|
| committer | physcik <mynameisgennadiy@vk.com> | 2026-03-20 13:59:24 +0500 |
| commit | d470cca696d98b2a84f1667f29139c750888cdcd (patch) | |
| tree | 6ed0b54d8a9b1a132a4eae81c87fa004b6e7b945 /engine | |
| parent | 6b7c58ea290aec748d7439caa6ba7b07cefaf628 (diff) | |
Object target scale property
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/CoreObjects/DynamicObject.go | 38 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/Objects.go | 19 | ||||
| -rw-r--r-- | engine/main.go | 2 |
3 files changed, 52 insertions, 7 deletions
diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go index 0a10f0a..9b309dd 100644 --- a/engine/CoreObjects/DynamicObject.go +++ b/engine/CoreObjects/DynamicObject.go @@ -34,7 +34,35 @@ type DynamicObject struct { // represents one of those parts type TextureBlock struct { Texture *rl.Texture2D - Offset rl.Vector2 + // The space occupied by the sprite in world relative to the base object position + Window *rl.Rectangle + + // The base rectangle of the texture (calculated once in the initialization step) + baseRect *rl.Rectangle +} + +// Inintializes the texture block for futher render +func (base *TextureBlock) init() { + base.baseRect = &rl.Rectangle{ + X: 0, + Y: 0, + Height: float32(base.Texture.Height), + Width: float32(base.Texture.Width), + } +} + +func (base *TextureBlock) draw(objPos *rl.Vector2) { + var targetWindow = rl.Rectangle { + X: base.Window.X + objPos.X, + Y: base.Window.Y + objPos.Y, + Width: base.Window.Width, + Height: base.Window.Height, + } + rl.DrawTexturePro(*base.Texture, + *base.baseRect, + targetWindow, + rl.Vector2Zero(), + 0, rl.White) } type ColliderBlock struct { @@ -47,6 +75,9 @@ func (base *DynamicObject) Init(manager *SceneManager) { panic("Failed to initialize a dynamic object: the scene was not selected") } base.parentScene = manager.SelectedScene + for _, v := range base.Textures { + v.init() + } } func (base *DynamicObject) Destroy() { @@ -88,10 +119,7 @@ func (base *DynamicObject) drawOverlay() { 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) + v.draw(&base.Position) } if settings.State.DrawColliders { for _, v := range base.Colliders { diff --git a/engine/Dynamic/Descriptors/Objects.go b/engine/Dynamic/Descriptors/Objects.go index 4dbee34..eb3fb78 100644 --- a/engine/Dynamic/Descriptors/Objects.go +++ b/engine/Dynamic/Descriptors/Objects.go @@ -49,9 +49,10 @@ func (base *ObjectDescriptor) parseTextures() []*coreobjects.TextureBlock { rl.TraceLog(rl.LogWarning, "Failed to get the required by the object %s texture: %s", base.Name, err.Error()) continue } + outp = append(outp, &coreobjects.TextureBlock { Texture: texture, - Offset: v.Offset, + Window: v.getTargetWindow(texture), }) } return outp @@ -85,6 +86,7 @@ type ObjectTextureBlock struct { Name string TextureId *uint64 Offset rl.Vector2 + TargetScale *rl.Vector2 } func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) { @@ -94,6 +96,21 @@ func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) { return components.Resources.Textures.GetTextureByName(base.Name) } +// Calculates the target window of the tetxure block. Should be provided with its target texture +func (base *ObjectTextureBlock) getTargetWindow(texture *rl.Texture2D) *rl.Rectangle { + var outp = &rl.Rectangle { + X: base.Offset.X, + Y: base.Offset.Y, + Width: float32(texture.Width), + Height: float32(texture.Height), + } + if base.TargetScale != nil { + outp.Width = base.TargetScale.X + outp.Height = base.TargetScale.Y + } + return outp +} + type ObjectColliderBlock struct { Type string Size rl.Vector2 diff --git a/engine/main.go b/engine/main.go index 3b66d09..effc894 100644 --- a/engine/main.go +++ b/engine/main.go @@ -32,7 +32,7 @@ func main() { log.Printf("Resource manager: %s", &components.Resources) var manager = coreobjects.InitSceneManager() - // render.StartLoop(manager, components.Resources.Worlds["MainWorld"]) + render.StartLoop(manager, components.Resources.Worlds["MainWorld"]) render.StartLoop(manager, builtin.MainMenu()) } |
