SDL_Rect object_rect(void * object) { SDL_Rect rect; rect.x = (int)object_x(object); rect.y = (int)object_y(object); rect.w = (int)object_width(object); rect.h = (int)object_height(object); return rect; }
void object_found_cleanup(scan_FSM *fsm) { // Another object has been found. object *cur_obj = fsm->objects + fsm->objects_found; // This is the object being finalized. cur_obj->dist = object_dist(fsm->cur_object_width, fsm->cur_object_readings); cur_obj->width = object_width(cur_obj->theta1, cur_obj->theta2, cur_obj->dist); fsm->objects_found++; // The readings in `fsm->cur_object_readings[]` buffer is now garbage. fsm->cur_object_width = 0; }
void handle_input(Outbreak * outbreak) { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN && event.key.keysym.sym == CONTROLS_PAUSE) { outbreak->paused = !outbreak->paused; } else if (event.type == SDL_QUIT) { outbreak->quit = TRUE; } if (!outbreak->paused) { switch(event.type) { case SDL_KEYDOWN: if (event.key.keysym.sym == CONTROLS_RIGHT) { set_object_velocity_x(outbreak->player, PADDLE_VELOCITY); } else if (event.key.keysym.sym == CONTROLS_LEFT) { set_object_velocity_x(outbreak->player, -PADDLE_VELOCITY); } else if (event.key.keysym.sym == CONTROLS_LAUNCH) { launch_ball(outbreak->ball); } break; case SDL_KEYUP: if (event.key.keysym.sym == CONTROLS_RIGHT) { if (object_direction_x(outbreak->player) == DIRECTION_RIGHT) { set_object_velocity_x(outbreak->player, 0); } } else if (event.key.keysym.sym == CONTROLS_LEFT) { if (object_direction_x(outbreak->player) == DIRECTION_LEFT) { set_object_velocity_x(outbreak->player, 0); } } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == MOUSE_CONTROLS_LAUNCH) { launch_ball(outbreak->ball); } break; case SDL_MOUSEMOTION: set_object_velocity_x(outbreak->player, 0); set_object_x(outbreak->player, event.motion.x - object_width(outbreak->player) / 2); if (object_offscreen(outbreak->player)) { set_object_x(outbreak->player, object_x(outbreak->player) < 0 ? 0 : SCREEN_WIDTH - object_width(outbreak->player)); } break; } } } }
void update_gamestate(Outbreak * outbreak) { if (!outbreak->paused) { object_update_position(outbreak->player); if (object_offscreen(outbreak->player)) { set_object_x(outbreak->player, (object_direction_x(outbreak->player) == DIRECTION_LEFT) ? 0 : SCREEN_WIDTH - object_width(outbreak->player)); } if (ball_magnetized(outbreak->ball)) { set_object_x(outbreak->ball, object_x(outbreak->player) + (object_width(outbreak->player) - object_width(outbreak->ball)) / 2.0f); } object_update_x(outbreak->ball); if (object_offscreen(outbreak->ball)) { set_object_x(outbreak->ball, (object_direction_x(outbreak->ball) == DIRECTION_LEFT) ? 0 : SCREEN_WIDTH - object_width(outbreak->ball)); object_bounce_x(outbreak->ball); } else if (object_collision(outbreak->player, outbreak->ball)) { object_rollback_x(outbreak->ball); object_bounce_x(outbreak->ball); } else { int i; for (i = 0; i < outbreak->num_blocks; i++) { if (object_collision(outbreak->ball, outbreak->blocks[i])) { hit_block(outbreak->blocks[i]); if (outbreak->blocks[i]->health == 0) { remove_block(outbreak, outbreak->blocks[i]); } object_rollback_x(outbreak->ball); object_bounce_x(outbreak->ball); break; } } } object_update_y(outbreak->ball); if (object_y(outbreak->ball) >= SCREEN_HEIGHT) { outbreak->quit = TRUE; } else if (object_y(outbreak->ball) < 0) { set_object_y(outbreak->ball, 0); object_bounce_y(outbreak->ball); } else if (object_collision(outbreak->player, outbreak->ball)) { object_rollback_y(outbreak->ball); object_bounce_y(outbreak->ball); set_object_angle(outbreak->ball, object_angle(outbreak->ball) - ((object_x(outbreak->ball) - object_x(outbreak->player)) - (object_width(outbreak->player) + object_width(outbreak->ball)) / 2.0f) * PADDLE_CURVINESS); } else { int i; for (i = 0; i < outbreak->num_blocks; i++) { if (object_collision(outbreak->ball, outbreak->blocks[i])) { hit_block(outbreak->blocks[i]); if (outbreak->blocks[i]->health == 0) { remove_block(outbreak, outbreak->blocks[i]); } object_rollback_y(outbreak->ball); object_bounce_y(outbreak->ball); break; } } } if (!ball_magnetized(outbreak->ball)) { set_object_speed(outbreak->ball, object_speed(outbreak->ball) + BALL_ACCELERATION); } } }