6 #include "./dying_rect.h"
19 dying_rect_t *create_dying_rect(rect_t rect,
23 lt_t *lt = create_lt();
28 dying_rect_t *dying_rect = PUSH_LT(lt, malloc(sizeof(dying_rect_t)), free);
29 if (dying_rect == NULL) {
30 throw_error(ERROR_TYPE_LIBC);
35 dying_rect->position = vec(rect.x, rect.y);
36 dying_rect->size = vec(rect.w, rect.h);
37 dying_rect->color = color;
38 dying_rect->duration = duration;
39 dying_rect->time_passed = 0;
44 void destroy_dying_rect(dying_rect_t *dying_rect)
47 RETURN_LT0(dying_rect->lt);
50 /* TODO(#109): Dying Rect animation is too boring */
51 int dying_rect_render(const dying_rect_t *dying_rect,
52 SDL_Renderer *renderer,
53 const camera_t *camera)
59 const float scale = 1.0f - (float) dying_rect->time_passed / (float) dying_rect->duration;
60 const vec_t center = vec_sum(
65 const vec_t scaled_size =
66 vec_scala_mult(dying_rect->size, scale);
67 const vec_t scaled_position =
68 vec_sum(center, vec_scala_mult(scaled_size, -0.5f));
70 return camera_fill_rect(
73 rect_from_vecs(scaled_position, scaled_size),
77 int dying_rect_update(dying_rect_t *dying_rect,
81 assert(delta_time > 0);
83 if (!dying_rect_is_dead(dying_rect)) {
84 dying_rect->time_passed = dying_rect->time_passed + delta_time;
90 int dying_rect_is_dead(const dying_rect_t *dying_rect)
93 return dying_rect->time_passed >= dying_rect->duration;