// brick ball collision handler void brick_ball(sprite_t* s1, sprite_t* s2) { sprite_t* ball; sprite_t* brick; unsigned int collision_direction; ball = s1->type == BALL_SPRITE ? s1 : s2; brick = s1->type == BRICK_SPRITE ? s1 : s2; collision_direction = detect_collision(ball, brick); if (collision_direction == NORTH_COLLISION || collision_direction == SOUTH_COLLISION ) breakout_data.ball_speed_y = -breakout_data.ball_speed_y; if (collision_direction == EAST_COLLISION || collision_direction == WEST_COLLISION ) breakout_data.ball_speed_x = -breakout_data.ball_speed_x; ball_tick(ball); breakout_data.num_bricks--; if (breakout_data.num_bricks) { //sound_play_enemy_killed(); sound_play_shoot(); } else { sound_play_big_explosion(); } sprite_release(&breakout_sprites_vector, brick); }
// ball paddle collision handler void ball_paddle(sprite_t* s1, sprite_t* s2) { sprite_t* ball; sprite_t* paddle; unsigned int collision_direction; ball = s1->type == BALL_SPRITE ? s1 : s2; paddle = s1->type == PADDLE_SPRITE ? s1 : s2; sound_play_fast_invader(0); collision_direction = detect_collision(paddle, ball); if (collision_direction == NORTH_COLLISION && breakout_data.ball_speed_y > 0 ) //|| collision_direction == SOUTH_COLLISION ) { breakout_data.ball_speed_y = -breakout_data.ball_speed_y; breakout_data.ball_speed_x += breakout_data.paddle_speed_x / 8; // Make sure the ball is above the paddle to avoid multiple collition between the ball and the paddle ball->center_pos_y = paddle->center_pos_y - (paddle->size_y_div_2 + ball->size_y_div_2); } if (collision_direction == EAST_COLLISION || collision_direction == WEST_COLLISION ) { breakout_data.ball_in_play = false; sprite_release(&breakout_sprites_vector, ball); } }
void ball_tick(sprite_t* sprite) { sprite->center_pos_x += breakout_data.ball_speed_x; sprite->center_pos_y += breakout_data.ball_speed_y; if ( (sprite->center_pos_x <= sprite->size_x_div_2 && breakout_data.ball_speed_x < 0) || (sprite->center_pos_x >= ( (SCREENW << 8) - sprite->size_x_div_2 ) && breakout_data.ball_speed_x > 0 ) ) breakout_data.ball_speed_x = -breakout_data.ball_speed_x; if ( sprite->center_pos_y <= sprite->size_y_div_2 && breakout_data.ball_speed_y < 0) breakout_data.ball_speed_y = -breakout_data.ball_speed_y; if (sprite->center_pos_y >= (SCREENH << 8) && breakout_data.ball_speed_y > 0 ) { breakout_data.ball_in_play = false; sprite_release(&breakout_sprites_vector, sprite); } }
void scorekeeper() { char cbuf[500]; char cbuf2[40]; sprite_t *s; int i; update_teams_score(nbTeams,nbPlayers); int endOfGame=0; int maxscore = 0; /** une équipe atteint le score max**/ for (i = 0; i < nbTeams; i++){ if (teams[i].points>=max_points) endOfGame=1; if (teams[i].points>maxscore) maxscore=teams[i].points; } /** le temps est écoulé **/ if (sprite_global.game_clock>timeToStop) endOfGame=1; if(endOfGame){ sprintf(cbuf,"Les gagnants sont :\n"); for (i = 0; i < nbTeams; i++){ if(teams[i].points==maxscore){ /*<string-array name="colors"> <item>vert Clair</item> <item>Rouge</item> <item>Bleu</item> <item>Jaune</item> <item>Turquoise</item> <item>Violet</item> <item>Orange</item> <item>Gris</item> <item>Vert Foncé</item> <item>Bleu Foncé</item> </string-array>*/ switch (i){ case 0: sprintf(cbuf2," Les Verts Clairs \n"); break; case 1: sprintf(cbuf2," Les Rouges \n"); break; case 2: sprintf(cbuf2," Les Bleus \n"); break; case 3: sprintf(cbuf2," Les Jaunes \n"); break; case 4: sprintf(cbuf2," Les Turquoises \n"); break; case 5: sprintf(cbuf2," Les Violets \n"); break; case 6: sprintf(cbuf2," Les Oranges \n"); break; case 7: sprintf(cbuf2," Les Gris \n"); break; case 8: sprintf(cbuf2," Les Verts Foncés \n"); break; case 9: sprintf(cbuf2," Les Bleus Foncés \n"); break; default: break; } //sprintf(cbuf2," Team %d\n",i); strcat(cbuf,cbuf2); } } sprintf(cbuf2,"\n\n %d points\n",maxscore); strcat(cbuf,cbuf2); message_time(cbuf,10); message_time("Starting in 3",1); message_time("Starting in 2",1); message_time("Starting in 1",1); message_time("GO !",1); init_spawn_delays(); int j; for (j = 0; j< nbTeams; j++){ teams[j].points=0; } for (j = 0; j < playerCount; j++){ players[j].points=0; sprite_kill(players[j].sprite); } timeToStop=sprite_global.game_clock+1000*cfgnum("game.max_duration",60); return; } for (i = 0; i < playerCount; i++) { if (!sprite_isvalid(&(players[i].controller->target))) { if (!players[i].spawnTimer){ sprite_release(&(players[i].sprite)); sprite_timer_set(&(players[i].spawnTimer),players[i].timeBeforeRespawn); printf("timer set player %d %d\n", i ,players[i].timeBeforeRespawn ); }else{ if (sprite_timer_finished(players[i].spawnTimer)){ s = sprite_create(players[i].sprite_type,&players[i]); sprite_aquire(s, &(players[i].sprite)); sprite_aquire(players[i].sprite, &(players[i].controller->target)); assert(sprite_isvalid(&(players[i].controller->target))); s = players[i].sprite; sprite_group_insert(mech_group, s); sprite_set_pos(s, players[i].startpos[0], players[i].startpos[1]); players[i].spawnTimer=NULL; } } } } }