From c2fd913ff262cf1ff442b721f095db8ef4539527 Mon Sep 17 00:00:00 2001 From: CatWindow Date: Fri, 14 Aug 2026 17:22:53 +0300 Subject: [PATCH] viewport scale and audio fix --- binding-mri/viewport-binding.cpp | 15 +++++++++----- changelogs/0.1.2.txt | 3 ++- scripts/Audio.rb | 14 ++++++++----- scripts/Scene_OF.rb | 33 +++++++++++++++++++++++-------- src/sprite.cpp | 5 +++++ src/transform.h | 21 +++++++++++++------- src/viewport.cpp | 34 +++++++++++++++++++++++++++++--- src/viewport.h | 12 ++++++----- 8 files changed, 103 insertions(+), 34 deletions(-) diff --git a/binding-mri/viewport-binding.cpp b/binding-mri/viewport-binding.cpp index d694d85..dd5901b 100644 --- a/binding-mri/viewport-binding.cpp +++ b/binding-mri/viewport-binding.cpp @@ -78,6 +78,9 @@ DEF_PROP_OBJ_VAL(Viewport, Tone, Tone, "tone") DEF_PROP_I(Viewport, OX) DEF_PROP_I(Viewport, OY) +DEF_PROP_F(Viewport, ScaleX) +DEF_PROP_F(Viewport, ScaleY) + void viewportBindingInit(){ VALUE klass = rb_define_class("Viewport", rb_cObject); rb_define_alloc_func(klass, classAllocate<&ViewportType>); @@ -88,10 +91,12 @@ void viewportBindingInit(){ _rb_define_method(klass, "initialize", viewportInitialize); - INIT_PROP_BIND( Viewport, Rect, "rect" ); - INIT_PROP_BIND( Viewport, OX, "ox" ); - INIT_PROP_BIND( Viewport, OY, "oy" ); - INIT_PROP_BIND( Viewport, Color, "color" ); - INIT_PROP_BIND( Viewport, Tone, "tone" ); + INIT_PROP_BIND( Viewport, Rect, "rect" ); + INIT_PROP_BIND( Viewport, OX, "ox" ); + INIT_PROP_BIND( Viewport, OY, "oy" ); + INIT_PROP_BIND( Viewport, ScaleX, "scale_x"); + INIT_PROP_BIND( Viewport, ScaleY, "scale_y"); + INIT_PROP_BIND( Viewport, Color, "color" ); + INIT_PROP_BIND( Viewport, Tone, "tone" ); } diff --git a/changelogs/0.1.2.txt b/changelogs/0.1.2.txt index 971bbb2..849bbd3 100644 --- a/changelogs/0.1.2.txt +++ b/changelogs/0.1.2.txt @@ -56,4 +56,5 @@ Added Crash Screen Added In-Memory Log buffer Added setting "Use Old Self Contained Universe(Reprise) version" Rewrited audio system from SDL3_sound and OpenAL to SDL_mixer -Added Master Volume setting \ No newline at end of file +Added Master Volume setting +Added viewports scaling \ No newline at end of file diff --git a/scripts/Audio.rb b/scripts/Audio.rb index 8fcc1fc..5b07e01 100644 --- a/scripts/Audio.rb +++ b/scripts/Audio.rb @@ -55,7 +55,9 @@ module Audio @bgs_playback.play(-1, volume / 100.0, pitch / 100.0) end def bgs_fade(time) - @bgs_playback.fade_out(time / 60.0) + if (@bgs_playback && @bgs_playback.playing) + @bgs_playback.fade_out(time / 60.0) + end end def bgs_stop if @bgs_playback @@ -79,10 +81,12 @@ module Audio @me_playback.play(0, volume / 100.0, pitch / 100.0) end def me_fade(time) - @me_playback.fade_out(time / 60.0) - if @bgm_playback - @bgm_playback.position = @bgm_pos - @bgm_playback.fade_in(time / 60.0) + if (@me_playback && @me_playback.playing) + @me_playback.fade_out(time / 60.0) + if @bgm_playback + @bgm_playback.position = @bgm_pos + @bgm_playback.fade_in(time / 60.0) + end end end def me_stop diff --git a/scripts/Scene_OF.rb b/scripts/Scene_OF.rb index defc821..2d45b2c 100644 --- a/scripts/Scene_OF.rb +++ b/scripts/Scene_OF.rb @@ -1,4 +1,10 @@ class Scene_OF + BPM = 135 + WAIT_TIME = 1.0 * (BPM / 60.0) * Graphics.frame_rate + + BUMP_SCALE = 1.2 + BUMP_RETURN_SPEED = 0.2 + ARROW_SIZE = 32 ARROW_SCALE = 2 ARROWS_PADDING = 12 @@ -55,29 +61,33 @@ class Scene_OF def main Audio.bgm_stop - @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) + @viewport_ui = Viewport.new(0, 0, Graphics.width, Graphics.height) + @viewport_ui.ox = -Graphics.width / 2 + @viewport_ui.oy = -Graphics.height / 2 @spritesheet = RPG::Cache.misc(".cats") @player_arrows = [] @cat_arrows = [] for i in 0..3 - player_arrow = Sprite.new(@viewport) + player_arrow = Sprite.new(@viewport_ui) player_arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE) player_arrow.bitmap.stretch_blt(Rect.new(0, 0, ARROW_SIZE, ARROW_SIZE), @spritesheet, SPRITES[PLAYER_ARROWS_SPRITES[:base][i]]) player_arrow.zoom_x = player_arrow.zoom_y = ARROW_SCALE - player_arrow.x = Graphics.width - ARROWS_SIDES_MARGIN + (ARROW_SIZE * ARROW_SCALE + ARROWS_PADDING) * i - (ARROW_SIZE * ARROW_SCALE * 4 + ARROWS_PADDING * 3) - player_arrow.y = ARROWS_TOP_MARGIN + player_arrow.x = Graphics.width / 2 - ARROWS_SIDES_MARGIN + (ARROW_SIZE * ARROW_SCALE + ARROWS_PADDING) * i - (ARROW_SIZE * ARROW_SCALE * 4 + ARROWS_PADDING * 3) + player_arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 @player_arrows << player_arrow - cat_arrow = Sprite.new(@viewport) + cat_arrow = Sprite.new(@viewport_ui) cat_arrow.bitmap = Bitmap.new(ARROW_SIZE, ARROW_SIZE) cat_arrow.bitmap.stretch_blt(Rect.new(0, 0, ARROW_SIZE, ARROW_SIZE), @spritesheet, SPRITES[CAT_ARROWS_SPRITES[:base][i]]) cat_arrow.zoom_x = cat_arrow.zoom_y = ARROW_SCALE - cat_arrow.x = ARROWS_SIDES_MARGIN + (ARROW_SIZE * ARROW_SCALE + ARROWS_PADDING) * i - cat_arrow.y = ARROWS_TOP_MARGIN + cat_arrow.x = ARROWS_SIDES_MARGIN + (ARROW_SIZE * ARROW_SCALE + ARROWS_PADDING) * i - Graphics.width / 2 + cat_arrow.y = ARROWS_TOP_MARGIN - Graphics.height / 2 @cat_arrows << cat_arrow end + @bump_timeout = WAIT_TIME + # Execute transition Graphics.transition(40) # Main loop @@ -99,7 +109,14 @@ class Scene_OF end def update - @viewport.scale_x -= 0.001 + @bump_timeout -= 1 + if @bump_timeout <= 0 + @bump_timeout += WAIT_TIME + @viewport_ui.scale_x = BUMP_SCALE + @viewport_ui.scale_y = BUMP_SCALE + end + @viewport_ui.scale_x = @viewport_ui.scale_x * (1.0 - BUMP_RETURN_SPEED) + BUMP_RETURN_SPEED + @viewport_ui.scale_y = @viewport_ui.scale_y * (1.0 - BUMP_RETURN_SPEED) + BUMP_RETURN_SPEED end def map_input(input) diff --git a/src/sprite.cpp b/src/sprite.cpp index ea02b89..907ae13 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -622,6 +622,11 @@ void Sprite::onGeometryChange(const Scene::Geometry &geo){ /* Offset at which the sprite will be drawn * relative to screen origin */ p->trans.setGlobalOffset(geo.offset()); + Viewport* viewport = ViewportElement::getViewport(); + if (viewport) + p->trans.setGlobalScale(Vec2(viewport->getScaleX(), viewport->getScaleY())); + else + p->trans.setGlobalScale(Vec2(1.0, 1.0)); p->sceneRect.setSize(geo.rect.size()); p->sceneOrig = geo.orig; diff --git a/src/transform.h b/src/transform.h index 41e4442..ee69416 100644 --- a/src/transform.h +++ b/src/transform.h @@ -103,6 +103,11 @@ public: dirty = true; } + void setGlobalScale(const Vec2 &value){ + globalScale = value; + dirty = true; + } + const float *getMatrix(){ if (dirty){ updateMatrix(); @@ -121,18 +126,18 @@ private: float angle = rotation * 3.141592654f / 180.0f; float cosine = (float) SDL_cos(angle); - float sine = (float) sin(angle); + float sine = (float) SDL_sin(angle); float sxc = scale.x * cosine; float syc = scale.y * cosine; float sxs = scale.x * sine; float sys = scale.y * sine; - float tx = -origin.x * sxc - origin.y * sys + position.x + offset.x; - float ty = origin.x * sxs - origin.y * syc + position.y + offset.y; + float tx = (-origin.x * sxc - origin.y * sys + position.x) * globalScale.x + offset.x; + float ty = ( origin.x * sxs - origin.y * syc + position.y) * globalScale.y + offset.y; - matrix[0] = sxc; - matrix[1] = -sxs; - matrix[4] = sys; - matrix[5] = syc; + matrix[0] = sxc * globalScale.x; + matrix[1] = -sxs * globalScale.y; + matrix[4] = sys * globalScale.x; + matrix[5] = syc * globalScale.y; matrix[12] = tx; matrix[13] = ty; } @@ -144,6 +149,8 @@ private: /* Silently added to position */ Vec2i offset; + /* Silently added to scale */ + Vec2 globalScale; float matrix[16]; diff --git a/src/viewport.cpp b/src/viewport.cpp index 9f22370..a273464 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -44,6 +44,9 @@ struct ViewportPrivate{ IntRect screenRect; int isOnScreen; + double scaleX; + double scaleY; + EtcTemps tmp; ViewportPrivate(int x, int y, unsigned int width, unsigned int height, Viewport *self) @@ -51,6 +54,8 @@ struct ViewportPrivate{ rect(&tmp.rect), color(&tmp.color), tone(&tmp.tone), + scaleX(1.0), + scaleY(1.0), isOnScreen(false) { rect->set(x, y, width, height); @@ -61,7 +66,7 @@ struct ViewportPrivate{ rectCon.Disconnect(); } - void onRectChange(){ + void onRectChange() { self->geometry.rect = rect->toIntRect(); self->notifyGeometryChange(); recomputeOnScreen(); @@ -131,8 +136,11 @@ void Viewport::update(){ Flashable::update(); } -DEF_ATTR_RD_SIMPLE(Viewport, OX, int, geometry.orig.x) -DEF_ATTR_RD_SIMPLE(Viewport, OY, int, geometry.orig.y) +DEF_ATTR_RD_SIMPLE(Viewport, OX, int, geometry.orig.x) +DEF_ATTR_RD_SIMPLE(Viewport, OY, int, geometry.orig.y) + +DEF_ATTR_RD_SIMPLE(Viewport, ScaleX, double, p->scaleX) +DEF_ATTR_RD_SIMPLE(Viewport, ScaleY, double, p->scaleY) DEF_ATTR_SIMPLE(Viewport, Rect, Rect&, *p->rect) DEF_ATTR_SIMPLE(Viewport, Color, Color&, *p->color) @@ -158,6 +166,26 @@ void Viewport::setOY(int value){ notifyGeometryChange(); } +void Viewport::setScaleX(double value){ + guardDisposed(); + + if (p->scaleX == value) + return; + + p->scaleX = value; + notifyGeometryChange(); +} + +void Viewport::setScaleY(double value){ + guardDisposed(); + + if (p->scaleY == value) + return; + + p->scaleY = value; + notifyGeometryChange(); +} + void Viewport::initDynAttribs(){ p->rect = new Rect(*p->rect); p->color = new Color; diff --git a/src/viewport.h b/src/viewport.h index 4365574..b45e7f8 100644 --- a/src/viewport.h +++ b/src/viewport.h @@ -38,11 +38,13 @@ public: void update(); - DECL_ATTR( Rect, Rect& ) - DECL_ATTR( OX, int ) - DECL_ATTR( OY, int ) - DECL_ATTR( Color, Color& ) - DECL_ATTR( Tone, Tone& ) + DECL_ATTR( Rect, Rect& ) + DECL_ATTR( OX, int ) + DECL_ATTR( OY, int ) + DECL_ATTR( ScaleX, double ) + DECL_ATTR( ScaleY, double ) + DECL_ATTR( Color, Color& ) + DECL_ATTR( Tone, Tone& ) void initDynAttribs();