From 8f0d90360af74ac081cd69b436b5eb10a2863ef3 Mon Sep 17 00:00:00 2001 From: Rockingcool Date: Mon, 18 Dec 2023 22:43:10 -0600 Subject: [PATCH] Implement y-velocity, and added other minor changes --- pong.c | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/pong.c b/pong.c index 97c0d90..bf73153 100644 --- a/pong.c +++ b/pong.c @@ -1,9 +1,11 @@ #include +#include #include #include #include #include #include +#include #define WIN_WIDTH 1000 #define WIN_HEIGHT 600 @@ -32,7 +34,8 @@ int main(int argc, char** argv) { ALLEGRO_COLOR black = al_map_rgba(0,0,0,255); ALLEGRO_COLOR white = al_map_rgba(255,255,255,255); ALLEGRO_EVENT event; - bool running = true; + bool running = false; + srand(time(NULL)); // Seed for RNG float width = 25; // Width and height of paddles float height = 150; @@ -43,11 +46,14 @@ int main(int argc, char** argv) { float velocity_1 = 0; // Vertical velocity of first paddle float velocity_2 = 0; // Vertical velocity of second paddle - float circ_x = WIN_WIDTH / 2; // Center coordinates of ball - float circ_y = WIN_HEIGHT / 2; - float circ_rad = 10; // Radius of ball - float circ_vel_x = 5; // Horizontal velocity of ball - float circ_vel_y = 0; // Vertical velocity of ball + float circ_x = 25; // Center coordinates of ball + float circ_y = 25; + float circ_rad = 15; // Radius of ball + float ball_speed = sqrt(72); // Pythagorean distance travelled by ball in one main-loop iteration + float circ_vel_x = (float)(rand())/(float)(RAND_MAX / 3) + 4.0; // Horizontal velocity of ball (Randomly generated, 4 to 7) - borrowed from https://stackoverflow.com/a/13409133 + printf("%f\n",circ_vel_x); + float circ_vel_y = sqrt(pow(ball_speed,2) - pow(circ_vel_x,2)); // Vertical velocity of ball - Subtract X velocity from hypotenuse / ball_speed + printf("%f\n",circ_vel_y); al_clear_to_color(black); al_draw_filled_rectangle(start_x_1, start_y_1, start_x_1 + width, start_y_1 + height, white); @@ -55,6 +61,12 @@ int main(int argc, char** argv) { al_draw_filled_circle(circ_x, circ_y, circ_rad, white); al_flip_display(); + do { + al_wait_for_event(queue, &event); + } while (!(event.type == ALLEGRO_EVENT_KEY_DOWN && event.keyboard.keycode == ALLEGRO_KEY_SPACE)); + + running = true; + while (running) { // Code borrowed from: https://stackoverflow.com/a/30078011 @@ -68,7 +80,7 @@ int main(int argc, char** argv) { break; case ALLEGRO_KEY_S: velocity_1 += 5; - break; + break; case ALLEGRO_KEY_UP: velocity_2 -= 5; break; @@ -107,12 +119,6 @@ int main(int argc, char** argv) { ((velocity_2 < 0 && start_y_2 > 0) || (velocity_2 > 0 && start_y_2 + height < WIN_HEIGHT)) && (start_y_2 += velocity_2); circ_x += circ_vel_x; circ_y += circ_vel_y; - - //Redraw shapes - al_draw_filled_rectangle(start_x_1, start_y_1, start_x_1 + width, start_y_1 + height + velocity_1, white); - al_draw_filled_rectangle(start_x_2, start_y_2, start_x_2 + width, start_y_2 + height + velocity_2, white); - al_draw_filled_circle(circ_x, circ_y, circ_rad, white); - al_flip_display(); if (circ_x + circ_rad >= WIN_WIDTH - 10 - width) { // FOR PADDLE 2: If the circle has reached the point where the paddle would be... if (circ_y > start_y_2 && circ_y < start_y_2 + height) { // If the circle is touching the paddle... @@ -120,15 +126,27 @@ int main(int argc, char** argv) { } } else if (circ_x - circ_rad <= 10 + width) { // FOR PADDLE 1 if (circ_y > start_y_1 && circ_y < start_y_1 + height) { - circ_vel_x =- circ_vel_x; + circ_vel_x = -circ_vel_x; } } + if ((circ_y + circ_rad >= WIN_HEIGHT) || (circ_y - circ_rad <= 0)) { + circ_vel_y = -circ_vel_y; + } + + + + //Redraw shapes + al_draw_filled_rectangle(start_x_1, start_y_1, start_x_1 + width, start_y_1 + height + velocity_1, white); + al_draw_filled_rectangle(start_x_2, start_y_2, start_x_2 + width, start_y_2 + height + velocity_2, white); + al_draw_filled_circle(circ_x, circ_y, circ_rad, white); + al_flip_display(); + } // Clean up al_destroy_display(disp); - al_destroy_event_queue(queue); - + al_destroy_event_queue(queue); + return 0; }