#include "pong.h" void ball(Rectangle *Player, Rectangle *Enemy, struct Balls *Ball, int *PlayerScore, int *EnemyScore) { bool NoEnemy = false; if (Enemy == NULL) { NoEnemy = true; } // Moves int CurrentTick = SDL_AtomicGet(&Ticks); if(Ball->NextTick <= CurrentTick){ int RunThisManyTimes = 1; if (CurrentTick > Ball->NextTick) { RunThisManyTimes = (CurrentTick - Ball->NextTick); printf("%d\n",RunThisManyTimes); } for (int i = 0; i <= RunThisManyTimes; i++) { Ball->Y += Ball->Angle; if (Ball->Direction == LEFT) { Ball->X -= Ball->Speed; } else { Ball->X += Ball->Speed; } // Moves hitbox with ball. Ball->HitBox.x = Ball->X; Ball->HitBox.y = Ball->Y; // Check collisions against players. if (CheckCollisionRecs(*Player, Ball->HitBox) && Ball->Direction == LEFT) { Ball->Direction = RIGHT; Ball->Speed *= 1.5f; if (Ball->Speed > 40) { Ball->Speed = 40; } if (Ball->Speed != 40) { Ball->Angle = GetRandomValue(-10, 10); } else { Ball->Angle = GetRandomValue(-30, 30); } play_audio(0); } if (NoEnemy == false) { if (CheckCollisionRecs(*Enemy, Ball->HitBox) && Ball->Direction == RIGHT) { Ball->Direction = LEFT; Ball->Speed *= 1.5f; if (Ball->Speed > 40) { Ball->Speed = 40; } if (Ball->Speed != 40) { Ball->Angle = GetRandomValue(-10, 10); } else { Ball->Angle = GetRandomValue(-30, 30); } play_audio(SOUND_BOUNCE); } } // Bounce ball if touches top or bottom of screen. if ( (Ball->Y+32 >= 720 && Ball->Angle >=1) || (Ball->Y <= 0 && Ball->Angle <= -1) ) { Ball->Angle *= -1; play_audio(SOUND_BOUNCE); } } Ball->NextTick = SDL_AtomicGet(&Ticks)+1; // printf("%d,%d\n", SDL_AtomicGet(&Ticks), Ball->NextTick); } // printf("%d,%d\n", SDL_AtomicGet(&Ticks), Ball->NextTick); // Calculates score and resets ball. bool Scored = false; if (Ball->X < 0 && NoEnemy == false) { *EnemyScore += 1; Scored = true; } else if (Ball ->X > 1280 && NoEnemy == false) { *PlayerScore += 1; Scored = true; } else if (Ball->X > (1280-32) && NoEnemy == true) { *PlayerScore += 1; Scored = false; Ball->Direction = LEFT; play_audio(SOUND_PLAYER_SCORE); } if (Scored == true) { Ball->X = 1280/2.0f; Ball->Y = 720/2.0f; Ball->Speed = 3.0f; Ball->Angle = 0; } return; }