summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorphyscik <mynameisgennadiy@vk.com>2026-03-20 13:59:24 +0500
committerphyscik <mynameisgennadiy@vk.com>2026-03-20 13:59:24 +0500
commitd470cca696d98b2a84f1667f29139c750888cdcd (patch)
tree6ed0b54d8a9b1a132a4eae81c87fa004b6e7b945 /engine
parent6b7c58ea290aec748d7439caa6ba7b07cefaf628 (diff)
Object target scale property
Diffstat (limited to 'engine')
-rw-r--r--engine/CoreObjects/DynamicObject.go38
-rw-r--r--engine/Dynamic/Descriptors/Objects.go19
-rw-r--r--engine/main.go2
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())
}