QUOTE: Be your own kind of beautiful.

freezo

A retro platform game

effect.c (1897B)


      1#include <stdlib.h>
      2
      3#include "../include/effect.h"
      4#include "../include/util.h"
      5#include "../include/const.h"
      6
      7effect_t *effect_create(pos_t pos, effect_e type) {
      8  effect_t *effect = malloc(sizeof(effect_t));
      9  effect->type = type;
     10  effect->pos = pos;
     11  switch (type) {
     12    case EFFECT_FALL:
     13      effect->timer = fz_timer_create(7, 3);
     14      break;
     15    case EFFECT_BREAK:
     16      effect->timer = fz_timer_create(10, 3);
     17      break;
     18    case EFFECT_PARTICLE:
     19      effect->timer = fz_timer_create(14, 4);
     20      break;
     21  }
     22  effect->count = 0;
     23  return effect;
     24}
     25
     26void effect_update(effect_t *effect, game_t *game) {
     27  fz_timer_update(effect->timer);
     28  if (fz_timer_check(effect->timer)) {
     29    effect->count++;
     30  }
     31  // remove effect after one iteration
     32  if (effect->count > 0) {
     33    for (int i = 0; i < game->effects_len; i++) {
     34      if (game->effects[i] == effect) {
     35        if (i + 1 < game->effects_len) {
     36          for (int j = i; j < game->effects_len - 1; j++) {
     37            game->effects[j] = game->effects[j + 1];
     38          }
     39        }
     40        game->effects_len--;
     41        game->effects = realloc(game->effects, sizeof(effect_t) * game->effects_len);
     42        break;
     43      }
     44    }
     45  }
     46}
     47
     48void effect_draw(effect_t *effect, game_t *game) {
     49  int x;
     50  switch (effect->type) {
     51    case EFFECT_FALL:
     52      x = 1;
     53      break;
     54    case EFFECT_BREAK:
     55      x = 0;
     56      break;
     57    case EFFECT_PARTICLE:
     58      x = 3;
     59      break;
     60  }
     61  int frame = fz_timer_get(effect->timer);
     62  DrawTextureRec(game->assets.entities, texture_rect(frame, x, PLAYER_WIDTH, PLAYER_HEIGHT), pos_snap(effect->pos), WHITE);
     63}
     64
     65void effect_free(effect_t *effect) {
     66  free(effect);
     67}
     68
     69void effect_play(pos_t pos, effect_e type, game_t *game) {
     70  game->effects = realloc(game->effects, sizeof(effect_t) * (game->effects_len + 1));
     71  game->effects[game->effects_len] = effect_create(pos, type);
     72  game->effects_len++;
     73}