#pragma once #include "defines.h" namespace Dot { struct DotData { float x; // Posición x float y; // Posición y int w; // Ancho int h; // Alto float vx, vy; // Velocidad float g; // Gravedad Color color; // Color de la pelota bool on_floor; // Indica si la pelota está ya en el suelo bool stopped; // Indica si la pelota ha terminado de moverse; float loss; // Coeficiente de rebote. Pérdida de energía en cada rebote }; // Inicializa la estructura DotData ini(float x, float vx, float vy, Color color); // Actualiza la lógica de la clase SDL_FPoint update(DotData &dot); // Modifica la velocidad void modVel(DotData &dot, float vx, float vy); // Constructor DotData ini(float x, float vx, float vy, Color color) { DotData dot; dot.x = x; dot.y = 0.0f; dot.vx = vx; dot.vy = vy; dot.color = color; dot.g = GRAVITY; dot.on_floor = false; dot.stopped = false; dot.loss = ((rand() % 30) * 0.01f) + 0.6f; return dot; } // Actualiza la lógica de la clase SDL_FPoint update(DotData &dot) { if (dot.stopped) { return {dot.x, dot.y}; } // Aplica la gravedad a la velocidad if (!dot.on_floor && (dot.y - HEIGHT) < DOT_SIZE * 2) { dot.vy += dot.g; } // Actualiza la posición en función de la velocidad dot.x += dot.vx; dot.y += dot.vy; // Comprueba las colisiones con el lateral izquierdo if (dot.x < 0) { dot.x = 0; dot.vx = -dot.vx; } // Comprueba las colisiones con el lateral derecho if (dot.x >= WIDTH) { dot.x = WIDTH - 1; dot.vx = -dot.vx; } // Comprueba las colisiones con la parte superior if (dot.y < 0) { dot.y = 0; dot.vy = -dot.vy; } // Comprueba las colisiones con la parte inferior if (dot.y >= HEIGHT) { dot.y = HEIGHT - 1; dot.vy = -dot.vy * dot.loss; if (abs(dot.vy) < 0.1f) { dot.vy = 0.0f; dot.on_floor = true; } } // Aplica rozamiento al rodar por el suelo if (dot.on_floor) { dot.vx = dot.vx * 0.97f; if (abs(dot.vx) < 0.1f) { dot.vx = 0.0f; dot.stopped = true; } } return {dot.x, dot.y}; } // Modifica la velocidad void modVel(DotData &dot, float vx, float vy) { if (dot.stopped) { dot.vx = dot.vx + vx; } dot.vy = dot.vy + vy; dot.on_floor = false; dot.stopped = false; } }