Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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;
}
Example #4
0
void erase_draw_ball(WINDOW* win, struct Ball* ball, int color)
{
    erase_ball(win, ball);
    draw_ball(win, ball, color);
}