void paddle_game_init(void) { al_hide_mouse_cursor(t3f_display); /* place paddles */ paddle[0].x = 32.0; paddle[0].y = 240.0 - 64.0 / 2.0; paddle[0].object = t3f_create_collision_object(0, 0, 16, 64, 32, 32, 0); t3f_move_collision_object_xy(paddle[0].object, paddle[0].x, paddle[0].y); paddle[0].active = true; paddle[1].x = 640.0 - 32.0 - 16.0; paddle[1].y = 240.0 - 64.0 / 2.0; paddle[1].object = t3f_create_collision_object(0, 0, 16, 64, 32, 32, 0); t3f_move_collision_object_xy(paddle[1].object, paddle[1].x, paddle[1].y); paddle[1].active = true; /* place ball */ ball.object = t3f_create_collision_object(0, 0, 16, 16, 32, 32, 0); paddle_init_ball(1.0); /* reset scores */ score[0] = 0; score[1] = 0; t3f_srand(&rng_state, time(0)); paddle_state = EXAMPLE_STATE_GAME; t3f_play_music("data/music/game.xm"); }
void paddle_init_ball(float dir) { float angle = t3f_drand(&rng_state) * ALLEGRO_PI; ball.x = 320.0 - 16.0 / 2.0; ball.y = 240.0 - 16.0 / 2.0; t3f_move_collision_object_xy(ball.object, ball.x, ball.y); ball.vx = cos(angle) * EXAMPLE_START_SPEED * dir; ball.vy = sin(angle) * EXAMPLE_START_SPEED * dir; if(ball.vx > 0.0 && dir < 0.0) { ball.vx = -ball.vx; } else if(ball.vx < 0.0 && dir > 0.0) { ball.vx = -ball.vx; } ball.active = true; /* handle AI */ if(ball.vx > 0) { paddle[1].dy = paddle_ai_predict_y() - 32 + 8.0; paddle[1].dvy = t3f_drand(&rng_state) * 6.0 - 3.0; } }
void powerup_logic(void) { int i; for(i = 0; i < GAME_MAX_POWERUPS; i++) { if(powerup[i].active) { switch(powerup[i].type) { case POWERUP_TYPE_SPIRIT: { powerup[i].var--; powerup[i].x += powerup[i].vx; powerup[i].y += powerup[i].vy; if(powerup[i].var <= 0) { powerup[i].active = false; } else { t3f_move_collision_object_xy(powerup[i].object, powerup[i].x, powerup[i].y); if(player.active && t3f_check_object_collision(powerup[i].object, player.object)) { al_play_sample(sample[SAMPLE_POWERUP], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score += 10 * multiplier; multiplier_tick++; if(multiplier_tick >= 10) { al_play_sample(sample[SAMPLE_MULTIPLIER], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); multiplier++; if(multiplier == 10) { al_play_sample(sample[SAMPLE_MAX_MULTIPLIER], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); } if(multiplier > 10) { multiplier = 10; } multiplier_tick = 0; } powerup[i].active = 0; } } powerup[i].tick++; break; } case POWERUP_TYPE_UPGRADE: { break; } } } } }
/* logic routines, passed to T^3 Framework */ void paddle_logic(void * data) { /* logic switch, use different logic for each state */ switch(paddle_state) { case EXAMPLE_STATE_TITLE: { t3f_process_gui(paddle_menu, data); break; } case EXAMPLE_STATE_GAME: { /* return to menu if Escape pressed */ if(t3f_key[ALLEGRO_KEY_ESCAPE]) { paddle_game_exit(); } /* store old paddle positions */ paddle[0].oy = paddle[0].y; paddle[1].oy = paddle[1].y; /* move paddle */ paddle[0].y = t3f_mouse_y - 32; if(paddle[0].y < 0) { paddle[0].y = 0; } if(paddle[0].y > 480.0 - 64.0) { paddle[0].y = 480.0 - 64.0; } t3f_move_collision_object_xy(paddle[0].object, paddle[0].x, paddle[0].y); /* move CPU paddle */ if(ball.vx > 0.0) { if(ball.x > paddle[1].x - 24) { paddle[1].y += paddle[1].dvy; } else { if(paddle[1].y < paddle[1].dy - 2.0) { paddle[1].y += 2.0; if(paddle[1].y > 480.0 - 64.0) { paddle[1].y = 480.0 - 64.0; } } else if(paddle[1].y > paddle[1].dy + 2.0) { paddle[1].y -= 2.0; if(paddle[1].y < 0.0) { paddle[1].y = 0.0; } } } /* correct paddle position so it doesn't go past edge */ if(paddle[1].y > 480.0 - 64.0) { paddle[1].y = 480.0 - 64.0; } if(paddle[1].y < 0.0) { paddle[1].y = 0.0; } } t3f_move_collision_object_xy(paddle[1].object, paddle[1].x, paddle[1].y); /* move ball */ ball.x += ball.vx; t3f_move_collision_object_xy(ball.object, ball.x, ball.y); if(ball.vx < 0 && t3f_check_object_collision(paddle[0].object, ball.object)) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_HIT], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); ball.x = paddle[0].x + 16.0; ball.vx = -ball.vx; ball.vx += EXAMPLE_SPEED_INCREASE; ball.vy -= (paddle[0].oy - paddle[0].y) / 4.0; if(ball.vy < -3.0) { ball.vy = -3.0; } if(ball.vy > 3.0) { ball.vy = 3.0; } paddle[1].dy = paddle_ai_predict_y() - 32 + 8.0; paddle[1].dvy = t3f_drand(&rng_state) * 6.0 - 3.0; } else if(ball.vx > 0 && t3f_check_object_collision(paddle[1].object, ball.object)) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_HIT], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); ball.x = paddle[1].x - 16.0 - 1.0; ball.vx = -ball.vx; ball.vx -= EXAMPLE_SPEED_INCREASE; ball.vy -= (paddle[1].oy - paddle[1].y) / 4.0; if(ball.vy < -3.0) { ball.vy = -3.0; } if(ball.vy > 3.0) { ball.vy = 3.0; } } if(ball.x < -16.0) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_SCORE], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score[1]++; if(score[1] >= 5) { t3f_stop_music(); paddle_state = EXAMPLE_STATE_GAME_OVER; } paddle_init_ball(1.0); } else if(ball.x > 640.0) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_SCORE], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score[0]++; if(score[0] >= 5) { t3f_stop_music(); paddle_state = EXAMPLE_STATE_GAME_OVER; } paddle_init_ball(-1.0); } ball.y += ball.vy; if(ball.y < 0.0) { ball.y = 0.0; ball.vy = -ball.vy; } else if(ball.y > 480.0 - 16.0) { ball.y = 480.0 - 16.0; ball.vy = -ball.vy; } break; } case EXAMPLE_STATE_GAME_OVER: { /* return to menu if Escape pressed */ if(t3f_mouse_button[0] || t3f_key[ALLEGRO_KEY_ESCAPE]) { paddle_game_exit(); } break; } } }