Files
demo3_pixels_bouncing/source/dot.h
2025-03-23 20:45:03 +01:00

120 lines
2.9 KiB
C++

#pragma once
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;
}
}