From 98c3bbf3f909f18bdfd03351f72c0a0a3213293c Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Sun, 11 May 2025 04:36:24 +0200 Subject: [PATCH] feat: dynamic color update to Ball based on velocity --- src/Ball.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++- src/Ball.hpp | 3 ++- src/Constants.hpp | 2 +- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/Ball.cpp b/src/Ball.cpp index 6f97af1..c49fd53 100644 --- a/src/Ball.cpp +++ b/src/Ball.cpp @@ -9,7 +9,8 @@ Ball::Ball(float radius, const sf::Vector2f& pos, const sf::Vector2f& vel, : m_radius(radius), m_velocity(vel), m_lastPosition(pos), - m_pixelVelocity(vel) { + m_pixelVelocity(vel), + m_baseColor(color) { m_shape.setRadius(radius); m_shape.setOrigin(sf::Vector2f(radius, radius)); m_shape.setPosition(pos); @@ -25,9 +26,52 @@ void Ball::update(float dt, const sf::Vector2f& windowSize) { m_pixelVelocity = (currentPosition - m_lastPosition) / dt; m_lastPosition = currentPosition; + updateColor(); handleWallCollision(windowSize); } +void Ball::updateColor() { + float speed = + std::sqrt(m_velocity.x * m_velocity.x + m_velocity.y * m_velocity.y); + + const float MAX_SPEED = 2000.0f; + float t = std::min(speed / MAX_SPEED, 1.0f); + + sf::Color targetColor; + + if (t < 0.33f) { + float scaledT = t * 3.0f; + targetColor.r = static_cast(0 + scaledT * 128); + targetColor.g = static_cast(0); + targetColor.b = static_cast(255); + } else if (t < 0.66f) { + float scaledT = (t - 0.33f) * 3.0f; + targetColor.r = static_cast(128 + scaledT * 127); + targetColor.g = static_cast(0 + scaledT * 165); + targetColor.b = static_cast(255 - scaledT * 255); + } else { + float scaledT = (t - 0.66f) * 3.0f; + targetColor.r = static_cast(255); + targetColor.g = static_cast(165 - scaledT * 165); + targetColor.b = static_cast(0); + } + + sf::Color currentColor = m_shape.getFillColor(); + + const float TRANSITION_SPEED = 0.05f; + + sf::Color newColor; + newColor.r = static_cast( + currentColor.r + TRANSITION_SPEED * (targetColor.r - currentColor.r)); + newColor.g = static_cast( + currentColor.g + TRANSITION_SPEED * (targetColor.g - currentColor.g)); + newColor.b = static_cast( + currentColor.b + TRANSITION_SPEED * (targetColor.b - currentColor.b)); + newColor.a = 255; + + m_shape.setFillColor(newColor); +} + void Ball::draw(sf::RenderWindow& window) { window.draw(m_shape); } void Ball::applyImpulse(const sf::Vector2f& impulse) { diff --git a/src/Ball.hpp b/src/Ball.hpp index 3219d08..f16ba2d 100644 --- a/src/Ball.hpp +++ b/src/Ball.hpp @@ -11,8 +11,9 @@ class Ball : public PhysicalObject { bool m_atRest = false; sf::Vector2f m_lastPosition; sf::Vector2f m_pixelVelocity; - + sf::Color m_baseColor; void handleWallCollision(const sf::Vector2f& windowSize); + void updateColor(); public: Ball(float radius, const sf::Vector2f& pos, const sf::Vector2f& vel, diff --git a/src/Constants.hpp b/src/Constants.hpp index f639dab..ab2883c 100644 --- a/src/Constants.hpp +++ b/src/Constants.hpp @@ -9,5 +9,5 @@ constexpr float FRICTION = 0.9f; constexpr float BALL_RADIUS = 20.f; constexpr float IMPULSE = 2500.f; constexpr float REST_PIXEL_VELOCITY = 2.0f; -constexpr unsigned BALL_QUANTITY = 500; +constexpr unsigned BALL_QUANTITY = 100; } // namespace Constants