Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
      }
    }
  }
}
Ejemplo n.º 4
0
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);
    }
  }
}