void next_frame(int f) { if (f == 0) { for (int r = 0; r < NUM_ROWS; r++) { for (int c = 0; c < NUM_COLUMNS; c++) { set_rgb(pixels, pixel_index(r, c), (r+c)%2, (r+c)%2, 0); } } } float x = f; //sin(f/100.0)*50 + 60; float y = f; //sin(f/100.0)*50 + 60; draw_ball(x, y, 0.5, 240, 120, 0); for (int s = 0; s < NUM_SEGS; s++) { put_pixels(s, pixels + s*SEG_PIXELS*3, SEG_PIXELS); } erase_ball(x, y, 3); }
void put_ball(t_ole *t, int ball) { int i; int j; erase_ball(t, ball); i = 0; while (i < S_BALL) { j = 0; while (j < S_BALL) { if (i == 0 || i == S_BALL - 1 || j == 0 || j == S_BALL - 1) my_pixel_put_image(t->img, t->ball[ball] % W + i, t->ball[ball] / W + j, COLOR_BD_BALL); else my_pixel_put_image(t->img, t->ball[ball] % W + i, t->ball[ball] / W + j, COLOR_BALL); j = j + 1; } i = i + 1; } expose(t); }
int play_game(struct Game* game) { clear(); refresh(); WINDOW* win = newwin(game->height, game->width, INFO_WIN_HEIGHT, 0); WINDOW* info_win = newwin(INFO_WIN_HEIGHT, game->width, 0, 0); Timer* timer = sgl_timer_new(); //int ball_vx = EASY_BALL_VX; //int ball_vy = EASY_BALL_VY; //FIX THIS ^^^ struct Ball* ball = make_ball(game->width/2, game->height/2, .2, .075); struct Paddle* paddle1 = make_paddle(1, game->height/2, 5, game->sensitivity); struct Paddle* paddle2 = make_paddle(game->width-2, game->height/2, 5, game->sensitivity); //Used for checking where paddles are going to be... struct Paddle check_pad; int ai_wait = 0; int ai_wait_time = 0; switch (game->difficulty){ case 1: ai_wait_time = EASY_AI_WAIT; break; case 2: ai_wait_time = MEDIUM_AI_WAIT; break; case 3: ai_wait_time = HARD_AI_WAIT; break; } int key; int game_won = 0; char* pause_message = "PAUSED"; //Use this for any printing, etc. char* tmp_str = malloc(sizeof(char) * MAX_STRING_LENGTH); while ((key = getch()) != 'q'){ switch (key) { case ERR:break;//Ignore this key... case 'm': if (game->sound) game->sound = 0; else game->sound = 1; break; case 'p': if (game->paused){ game->paused = 0; erase_rect(win, game->max_height / 3, game->max_width / 2 - strlen(pause_message), strlen(pause_message), 1); } else { game->paused = 1; mvwaddstr(win, game->max_height / 3, game->max_width / 2 - strlen(pause_message), pause_message); } break; case 'w': if (game->paused || game_won) break; if (game->p1_aictrl) break;//The AI is controlling this paddle, so don't let player move it... check_pad = move_paddle_dir_f(*paddle1, UP); if (check_pad.y + paddle1->vel < 0){ move_paddle_xy(paddle1, paddle1->x, game->height - paddle1->width); }else { move_paddle_dir(paddle1, UP); } break; case 's': if (game->paused || game_won) break; if (game->p1_aictrl) break;//The AI is controlling this paddle, so don't let player move it... check_pad = move_paddle_dir_f(*paddle1, UP); if ((paddle1->y + paddle1->vel + paddle1->width) > game->height){ move_paddle_xy(paddle1, paddle1->x, 0); }else { move_paddle_dir(paddle1, DOWN); } break; case KEY_UP: if (game->paused || game_won) break; if (game->p2_aictrl) break;//The AI is controlling this paddle, so don't let player move it... check_pad = move_paddle_dir_f(*paddle2, UP); if ((check_pad.y + paddle2->vel) < 0){ move_paddle_xy(paddle2, paddle2->x, game->height - paddle2->width); }else { move_paddle_dir(paddle2, UP); } break; case KEY_DOWN: if (game->paused || game_won) break; if (game->p2_aictrl) break;//The AI is controlling this paddle, so don't let player move it... check_pad = move_paddle_dir_f(*paddle2, DOWN); if (((check_pad.y + check_pad.width) - paddle2->vel) > game->height){ move_paddle_xy(paddle2, paddle2->x, 0); }else { move_paddle_dir(paddle2, DOWN); } break; default: if (game_won){ clear(); refresh(); return 0; } break; } //AI Checks whether it has the ball and then moves if (ai_wait > ai_wait_time){ if (game->p1_aictrl && ball->vx < 0){ switch (ball_in_paddle(ball, paddle1)) { case 0: break; case 1: move_paddle_dir(paddle1, UP); break; case -1: move_paddle_dir(paddle1, DOWN); break; } }else if (game->p2_aictrl && ball->vx > 0){ switch (ball_in_paddle(ball, paddle2)) { case 0: break; case 1: move_paddle_dir(paddle2, UP); break; case -1: move_paddle_dir(paddle2, DOWN); break; } } ai_wait = 0; } if ((sgl_timer_elapsed_milliseconds(timer) > TICKS) && !(game->paused || game_won)){ sgl_timer_reset(timer); ai_wait++; //Ball has collided with paddle1 if ((ball->x <= paddle1->x) && ball_intersect_paddle(ball, paddle1)){ if (game->sound) fbeep(660, 10); //Move the ball 1 forward from paddle, this paddle is on left move_ball_xy(ball, paddle1->x + 1, ball->y); //Flip the ball's direction ball->vx = -ball->vx; float prcnt = collision_dist_prcnt(ball, paddle1); float vxi = (1 - prcnt) * EASY_BALL_V_INC; float vyi = prcnt * EASY_BALL_V_INC; ball->vx = sign(ball->vx) * (fabsf(ball->vx) + vxi); ball->vy = sign(ball->vy) * (fabsf(ball->vy) + vyi); } else if (ball->x <= paddle1->x){ if (game->sound) fbeep(550, 20); //Increase score... game->p2_score++; ball->vx = EASY_BALL_VX; ball->vy = EASY_BALL_VY; move_ball_xy(ball, game->width / 2, game->height / 2); } //Ball has collided with paddle2 if ((ball->x >= paddle2->x) && ball_intersect_paddle(ball, paddle2)){ fbeep(660, 10); //Move the ball 1 back from the paddle, this paddle is the one on right... move_ball_xy(ball, paddle2->x - 1, ball->y); ball->vx = -ball->vx; float prcnt = collision_dist_prcnt(ball, paddle2); float vxi = (1 - prcnt) * EASY_BALL_V_INC; float vyi = prcnt * EASY_BALL_V_INC; ball->vx = sign(ball->vx) * (fabsf(ball->vx) + vxi); ball->vy = sign(ball->vy) * (fabsf(ball->vy) + vyi); } else if (ball->x >= paddle2->x){ if (game->sound) fbeep(550, 20); game->p1_score++; ball->vx = -(EASY_BALL_VX); ball->vy = EASY_BALL_VY; move_ball_xy(ball, game->width / 2, game->height / 2); } //We need to erase it _now_ because??? erase_ball(win, ball); if ((ball->y + 1 > game->height - 1) || (ball->y < 1)) ball->vy = -ball->vy; move_ball(ball); } if (game->p1_score == game->max_score){ game_won = 1; snprintf(tmp_str, MAX_STRING_LENGTH, "%s Wins!", game->p1_name); mvwaddstr(win, game->max_height / 3, game->max_width / 2 - strlen(tmp_str), tmp_str); }else if (game->p2_score == game->max_score){ game_won = 1; snprintf(tmp_str, MAX_STRING_LENGTH, "%s Wins!", game->p2_name); mvwaddstr(win, game->max_height / 3, game->max_width / 2 - strlen(tmp_str), tmp_str); } erase_draw_ball(win, ball, RED); erase_draw_paddle(win, paddle1, BLUE); erase_draw_paddle(win, paddle2, GREEN); //Display some info box(info_win, 0 , 0); box(win, 0, 0); snprintf(tmp_str, MAX_STRING_LENGTH, "%s: %d", game->p1_name, game->p1_score); mvwaddstr(info_win, 1, 1, tmp_str); snprintf(tmp_str, MAX_STRING_LENGTH, "%s: %d", game->p2_name, game->p2_score); mvwaddstr(info_win, 1, game->width - strlen(tmp_str) - 1, tmp_str); wrefresh(info_win); wrefresh(win); refresh(); } clear(); refresh(); return 0; }
void erase_draw_ball(WINDOW* win, struct Ball* ball, int color) { erase_ball(win, ball); draw_ball(win, ball, color); }