I'm doing a pong and I give graphics with a library. all collisions are fine except that when the ball bounces with the lower edge of the paddles it enters them, bounces and then continues its trajectory.
#include "pch.h"
#include "raylib.h"
int screenWidth = 800;
int screenHeight = 450;
struct Paddle
{
const float basePosX0 = (screenWidth / 2) + (screenWidth / 3);
const float basePosX1 = (screenWidth / 2) - (screenWidth / 3);
const float basePosY = (screenHeight / 2) - 35;
float posX0 = basePosX0;
float posX1 = basePosX1;
float posY = basePosY;
float sizeX = 15;
float sizeY = 70;
int vel = 5;
int keyUp = KEY_UP;
int keyDown = KEY_DOWN;
Rectangle collider = { posX0,posY, sizeX,sizeY };
};
struct Ball
{
const float basePosX = screenWidth / 2;
const float basePoxY = (screenHeight / 2) - 4;
float size = 8;
int velX = 5;
int velY = 0;
float posX = basePosX;
float posY = basePoxY;
Rectangle collider = { posX,posY, size, size };
};
bool flag = true;
Paddle paddles[2];
Ball gameBall;
void PaddleMovement(Paddle &paddle);
void BallMovement();
void CollisionDetector();
void PaddleCollision();
void ColliderUpdate();
void DrawEverything();
int main()
{
paddles[1].collider.x = paddles[1].posX1;
paddles[1].keyUp = KEY_W;
paddles[1].keyDown = KEY_S;
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - basic shapes drawing");
SetTargetFPS(60);
while (!WindowShouldClose()) // Detect window close button or ESC key
{
DrawEverything();
BeginDrawing();
ClearBackground(BLACK);
ColliderUpdate();
DrawEverything();
CollisionDetector();
PaddleCollision();
PaddleMovement(paddles[0]);
PaddleMovement(paddles[1]);
if(flag == true){
BallMovement();
}
EndDrawing();
}
CloseWindow(); // Close window and OpenGL context
}
void DrawEverything()
{
DrawRectangle(paddles[0].posX0, paddles[0].posY, paddles[0].sizeX, paddles[0].sizeY, WHITE);
DrawRectangle(paddles[1].posX1, paddles[1].posY, paddles[1].sizeX, paddles[1].sizeY, WHITE);
DrawCircle(gameBall.posX, gameBall.posY, gameBall.size, WHITE);
}
void CollisionDetector()
{
if ((gameBall.posY > screenHeight) || (gameBall.posY < 0))
{
gameBall.velY *= -1;
}
if ((gameBall.posX > screenWidth) || (gameBall.posX < (screenWidth - screenWidth)))
{
paddles[0].posX0 = paddles[0].basePosX0;
paddles[1].posX1 = paddles[1].basePosX1;
gameBall.posX = gameBall.basePosX;
gameBall.posY = gameBall.basePoxY;
DrawEverything();
flag = false;
}
}
void PaddleCollision()
{
if (CheckCollisionRecs(gameBall.collider,paddles[0].collider))
{
gameBall.velY = 5;
gameBall.velX *= -1;
}
if (CheckCollisionRecs(gameBall.collider, paddles[1].collider))
{
gameBall.velY = 5;
gameBall.velX *= -1;
}
}
void PaddleMovement(Paddle &paddle)
{
if (IsKeyDown(paddle.keyUp))
{
paddle.posY -= paddle.vel;
flag = true;
}
if (IsKeyDown(paddle.keyDown))
{
flag = true;
paddle.posY += paddle.vel;
}
}
void BallMovement()
{
gameBall.posX += gameBall.velX;
gameBall.posY += gameBall.velY;
}
void ColliderUpdate()
{
paddles[0].collider = { paddles[0].posX0,paddles[0].posY,paddles[0].sizeX,paddles[0].sizeY };
paddles[1].collider = { paddles[1].posX1,paddles[1].posY,paddles[1].sizeX,paddles[1].sizeY };
gameBall.collider = { gameBall.posX,gameBall.posY,gameBall.size,gameBall.size };
}