122 lines
2.9 KiB
C++
122 lines
2.9 KiB
C++
#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;
|
|
}
|
|
} |