fix: arreglades les colisions "the static cast menner"

This commit is contained in:
2025-10-16 14:14:33 +02:00
parent 9db902c024
commit 545d471654
4 changed files with 55 additions and 26 deletions

View File

@@ -252,7 +252,7 @@ void Player::move() {
// Si ha tocado alguna rampa mientras camina (sin saltar), asciende
if (state_ != PlayerState::JUMPING) {
const LineVertical LEFT_SIDE = {x_, y_ + HEIGHT_ - 2, y_ + HEIGHT_ - 1}; // Comprueba solo los dos pixels de abajo
const LineVertical LEFT_SIDE = {static_cast<int>(x_), static_cast<int>(y_) + static_cast<int>(HEIGHT_) - 2, static_cast<int>(y_) + static_cast<int>(HEIGHT_) - 1}; // Comprueba solo los dos pixels de abajo
const int LY = room_->checkLeftSlopes(&LEFT_SIDE);
if (LY > -1) {
y_ = LY - HEIGHT_;
@@ -292,7 +292,7 @@ void Player::move() {
// Si ha tocado alguna rampa mientras camina (sin saltar), asciende
if (state_ != PlayerState::JUMPING) {
const LineVertical RIGHT_SIDE = {x_ + WIDTH_ - 1, y_ + HEIGHT_ - 2, y_ + HEIGHT_ - 1}; // Comprueba solo los dos pixels de abajo
const LineVertical RIGHT_SIDE = {static_cast<int>(x_) + static_cast<int>(WIDTH_) - 1, static_cast<int>(y_) + static_cast<int>(HEIGHT_) - 2, static_cast<int>(y_) + static_cast<int>(HEIGHT_) - 1}; // Comprueba solo los dos pixels de abajo
const int RY = room_->checkRightSlopes(&RIGHT_SIDE);
if (RY > -1) {
y_ = RY - HEIGHT_;
@@ -350,8 +350,8 @@ void Player::move() {
else if (vy_ > 0.0f) {
// Crea el rectangulo de proyección en el eje Y para ver si colisiona
SDL_FRect proj;
proj.x = static_cast<int>(x_);
proj.y = static_cast<int>(y_) + HEIGHT_;
proj.x = x_;
proj.y = y_ + HEIGHT_;
proj.h = ceil(vy_); // Para evitar que tenga una altura de 0 pixels
proj.w = WIDTH_;
@@ -371,8 +371,9 @@ void Player::move() {
} else {
// Si no hay colisión con los muros, comprueba la colisión con las rampas
if (state_ != PlayerState::JUMPING) { // Las rampas no se miran si se está saltando
const LineVertical LEFT_SIDE = {proj.x, proj.y, proj.y + proj.h - 1};
const LineVertical RIGHT_SIDE = {proj.x + proj.w - 1, proj.y, proj.y + proj.h - 1};
auto rect = toSDLRect(proj);
const LineVertical LEFT_SIDE = {rect.x, rect.y, rect.y + rect.h - 1};
const LineVertical RIGHT_SIDE = {rect.x + rect.w - 1, rect.y, rect.y + rect.h - 1};
const float POINT = std::max(room_->checkRightSlopes(&RIGHT_SIDE), room_->checkLeftSlopes(&LEFT_SIDE));
if (POINT > -1) {
// No está saltando y hay colisión con una rampa

View File

@@ -1043,7 +1043,7 @@ bool Room::checkAutoSurfaces(SDL_FPoint* p) {
// Comprueba las colisiones
int Room::checkLeftSlopes(const LineVertical* line) {
for (const auto& slope : left_slopes_) {
const SDL_FPoint p = checkCollision(slope, *line);
const auto p = checkCollision(slope, *line);
if (p.x != -1) {
return p.y;
}
@@ -1066,7 +1066,7 @@ bool Room::checkLeftSlopes(SDL_FPoint* p) {
// Comprueba las colisiones
int Room::checkRightSlopes(const LineVertical* line) {
for (const auto& slope : right_slopes_) {
const SDL_FPoint p = checkCollision(slope, *line);
const auto p = checkCollision(slope, *line);
if (p.x != -1) {
return p.y;
}

View File

@@ -39,7 +39,8 @@ bool checkCollision(const Circle& a, const Circle& b) {
}
// Detector de colisiones entre un circulo y un rectangulo
bool checkCollision(const Circle& a, const SDL_FRect& b) {
bool checkCollision(const Circle& a, const SDL_FRect& rect) {
SDL_Rect b = toSDLRect(rect);
// Closest point on collision box
int cX, cY;
@@ -72,7 +73,9 @@ bool checkCollision(const Circle& a, const SDL_FRect& b) {
}
// Detector de colisiones entre dos rectangulos
bool checkCollision(const SDL_FRect& a, const SDL_FRect& b) {
bool checkCollision(const SDL_FRect& rect_a, const SDL_FRect& rect_b) {
SDL_Rect a = toSDLRect(rect_a);
SDL_Rect b = toSDLRect(rect_b);
// Calcula las caras del rectangulo a
const int leftA = a.x;
const int rightA = a.x + a.w;
@@ -107,7 +110,10 @@ bool checkCollision(const SDL_FRect& a, const SDL_FRect& b) {
}
// Detector de colisiones entre un punto y un rectangulo
bool checkCollision(const SDL_FPoint& p, const SDL_FRect& r) {
bool checkCollision(const SDL_FPoint& point, const SDL_FRect& rect) {
SDL_Rect r = toSDLRect(rect);
SDL_Point p = toSDLPoint(point);
// Comprueba si el punto está a la izquierda del rectangulo
if (p.x < r.x) {
return false;
@@ -133,7 +139,8 @@ bool checkCollision(const SDL_FPoint& p, const SDL_FRect& r) {
}
// Detector de colisiones entre una linea horizontal y un rectangulo
bool checkCollision(const LineHorizontal& l, const SDL_FRect& r) {
bool checkCollision(const LineHorizontal& l, const SDL_FRect& rect) {
SDL_Rect r = toSDLRect(rect);
// Comprueba si la linea esta por encima del rectangulo
if (l.y < r.y) {
return false;
@@ -159,7 +166,8 @@ bool checkCollision(const LineHorizontal& l, const SDL_FRect& r) {
}
// Detector de colisiones entre una linea vertical y un rectangulo
bool checkCollision(const LineVertical& l, const SDL_FRect& r) {
bool checkCollision(const LineVertical& l, const SDL_FRect& rect) {
SDL_Rect r = toSDLRect(rect);
// Comprueba si la linea esta por la izquierda del rectangulo
if (l.x < r.x) {
return false;
@@ -185,7 +193,9 @@ bool checkCollision(const LineVertical& l, const SDL_FRect& r) {
}
// Detector de colisiones entre una linea horizontal y un punto
bool checkCollision(const LineHorizontal& l, const SDL_FPoint& p) {
bool checkCollision(const LineHorizontal& l, const SDL_FPoint& point) {
SDL_Point p = toSDLPoint(point);
// Comprueba si el punto esta sobre la linea
if (p.y > l.y) {
return false;
@@ -211,7 +221,7 @@ bool checkCollision(const LineHorizontal& l, const SDL_FPoint& p) {
}
// Detector de colisiones entre dos lineas
SDL_FPoint checkCollision(const Line& l1, const Line& l2) {
SDL_Point checkCollision(const Line& l1, const Line& l2) {
const float x1 = l1.x1;
const float y1 = l1.y1;
const float x2 = l1.x2;
@@ -232,13 +242,13 @@ SDL_FPoint checkCollision(const Line& l1, const Line& l2) {
const float x = x1 + (uA * (x2 - x1));
const float y = y1 + (uA * (y2 - y1));
return {(float)round(x), (float)round(y)};
return {static_cast<int>(round(x)), static_cast<int>(round(y))};
}
return {-1, -1};
}
// Detector de colisiones entre dos lineas
SDL_FPoint checkCollision(const LineDiagonal& l1, const LineVertical& l2) {
SDL_Point checkCollision(const LineDiagonal& l1, const LineVertical& l2) {
const float x1 = l1.x1;
const float y1 = l1.y1;
const float x2 = l1.x2;
@@ -259,7 +269,7 @@ SDL_FPoint checkCollision(const LineDiagonal& l1, const LineVertical& l2) {
const float x = x1 + (uA * (x2 - x1));
const float y = y1 + (uA * (y2 - y1));
return {(float)x, (float)y};
return {static_cast<int>(x), static_cast<int>(y)};
}
return {-1, -1};
}
@@ -279,7 +289,9 @@ void normalizeLine(LineDiagonal& l) {
}
// Detector de colisiones entre un punto y una linea diagonal
bool checkCollision(const SDL_FPoint& p, const LineDiagonal& l) {
bool checkCollision(const SDL_FPoint& point, const LineDiagonal& l) {
SDL_Point p = toSDLPoint(point);
// Comprueba si el punto está en alineado con la linea
if (abs(p.x - l.x1) != abs(p.y - l.y1)) {
return false;

View File

@@ -42,22 +42,22 @@ struct Circle {
// Estructura para definir una linea horizontal
struct LineHorizontal {
float x1, x2, y;
int x1, x2, y;
};
// Estructura para definir una linea vertical
struct LineVertical {
float x, y1, y2;
int x, y1, y2;
};
// Estructura para definir una linea diagonal
struct LineDiagonal {
float x1, y1, x2, y2;
int x1, y1, x2, y2;
};
// Estructura para definir una linea
struct Line {
float x1, y1, x2, y2;
int x1, y1, x2, y2;
};
// Estructura para definir un color
@@ -104,10 +104,10 @@ bool checkCollision(const LineVertical& l, const SDL_FRect& r);
bool checkCollision(const LineHorizontal& l, const SDL_FPoint& p);
// Detector de colisiones entre dos lineas
SDL_FPoint checkCollision(const Line& l1, const Line& l2);
SDL_Point checkCollision(const Line& l1, const Line& l2);
// Detector de colisiones entre dos lineas
SDL_FPoint checkCollision(const LineDiagonal& l1, const LineVertical& l2);
SDL_Point checkCollision(const LineDiagonal& l1, const LineVertical& l2);
// Detector de colisiones entre un punto y una linea diagonal
bool checkCollision(const SDL_FPoint& p, const LineDiagonal& l);
@@ -153,3 +153,19 @@ void playMusic(const std::string& music_path);
// Rellena una textura de un color
void fillTextureWithColor(SDL_Renderer* renderer, SDL_Texture* texture, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
inline SDL_Rect toSDLRect(const SDL_FRect& frect) {
SDL_Rect rect;
rect.x = static_cast<int>(frect.x);
rect.y = static_cast<int>(frect.y);
rect.w = static_cast<int>(frect.w);
rect.h = static_cast<int>(frect.h);
return rect;
}
inline SDL_Point toSDLPoint(const SDL_FPoint& fpoint) {
SDL_Point point;
point.x = static_cast<int>(fpoint.x);
point.y = static_cast<int>(fpoint.y);
return point;
}