migrat a SDL3
This commit is contained in:
122
source/dot.h
Normal file
122
source/dot.h
Normal file
@@ -0,0 +1,122 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user