From ce2fcefd715cd67d0094e80058de6790b14022ef Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 3 Apr 2026 18:50:50 +0200 Subject: [PATCH] almost ... --- source/card_sprite.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/source/card_sprite.cpp b/source/card_sprite.cpp index c01e0e9..e42dbd3 100644 --- a/source/card_sprite.cpp +++ b/source/card_sprite.cpp @@ -134,25 +134,37 @@ void CardSprite::render() { MovingSprite::render(); } -// Renderiza la sombra con efecto de perspectiva -// Cuanto más alta la tarjeta (zoom grande), la sombra es más pequeña y más separada. -// Cuando la tarjeta está en la mesa (zoom=1.0), la sombra tiene tamaño real y offset base. +// Renderiza la sombra con efecto de perspectiva 2D→3D (efecto helicóptero) +// +// Fuente de luz en la esquina superior izquierda (0,0). +// La sombra se mueve con la tarjeta pero desplazada en dirección opuesta a la luz +// (abajo-derecha a 45°). Cuanto más alta la tarjeta (zoom > 1.0): +// - Más separada de la tarjeta (offset grande) +// - Más pequeña (proyección lejana) +// Cuando la tarjeta está en la mesa (zoom=1.0): +// - Sombra pegada con offset base +// - Tamaño real void CardSprite::renderShadow() { - // La sombra siempre está en la mesa: su escala es inversamente proporcional al zoom + // Altura sobre la mesa: 0.0 = en la mesa, 0.8 = alta (zoom 1.8) + float height = horizontal_zoom_ - 1.0F; + + // Escala: más pequeña cuanto más alta float shadow_zoom = 1.0F / horizontal_zoom_; - // El offset aumenta con la altura (más lejos de la tarjeta cuanto más alta) - float scaled_offset_x = shadow_offset_x_ * horizontal_zoom_; - float scaled_offset_y = shadow_offset_y_ * horizontal_zoom_; + // Offset respecto a la tarjeta: base + extra proporcional a la altura + // La sombra se aleja en diagonal abajo-derecha (opuesta a la luz en 0,0) + static constexpr float HEIGHT_MULTIPLIER = 300.0F; + float offset_x = shadow_offset_x_ + height * HEIGHT_MULTIPLIER; + float offset_y = shadow_offset_y_ + height * HEIGHT_MULTIPLIER; shadow_texture_->render( - pos_.x + scaled_offset_x, - pos_.y + scaled_offset_y, + pos_.x + offset_x, + pos_.y + offset_y, &sprite_clip_, shadow_zoom, shadow_zoom, - rotate_.angle, - &rotate_.center, + 0.0, + nullptr, flip_); }