breakhack/src/sprite.c

96 lines
2.0 KiB
C
Raw Normal View History

#include <stdlib.h>
2017-11-30 21:00:47 +01:00
#include "sprite.h"
#include "util.h"
static
Sprite* sprite_create_default(void)
2017-11-30 21:00:47 +01:00
{
Sprite *s = ec_malloc(sizeof(Sprite));
2017-12-19 23:30:58 +01:00
s->textures[0] = NULL;
s->textures[1] = NULL;
s->clip = (SDL_Rect) { 0, 0, 16, 16 };
s->destroyTextures = false;
s->pos = (Position) { 0, 0 };
s->renderTimer = timer_create();
2017-12-19 23:30:58 +01:00
s->texture_index = 0;
s->fixed = false;
s->hidden = false;
2017-11-30 21:00:47 +01:00
return s;
}
Sprite* sprite_create()
{
return sprite_create_default();
}
void
sprite_load_texture(Sprite *sprite,
char *path,
int index,
SDL_Renderer *renderer)
2017-11-30 21:00:47 +01:00
{
if (index > 1)
fatal("in sprite_load_texture() index out of bounds");
if (sprite->destroyTextures && sprite->textures[index] != NULL) {
texture_destroy(sprite->textures[index]);
sprite->textures[index] = NULL;
2017-11-30 21:00:47 +01:00
}
2017-12-15 15:03:29 +01:00
sprite->textures[index] = texture_create();
texture_load_from_file(sprite->textures[index], path, renderer);
sprite->destroyTextures = true;
}
void
sprite_set_texture(Sprite *s, Texture *t, int index)
{
if (index > 1)
fatal("in sprite_set_texture() index out of bounds");
if (s->destroyTextures)
fatal("in sprite_set_texture() sprite contains loaded textures");
s->textures[index] = t;
2017-11-30 21:00:47 +01:00
}
2017-12-01 16:03:19 +01:00
void sprite_render(Sprite *s, Camera *cam)
2017-11-30 21:00:47 +01:00
{
if (s->hidden)
return;
if (s->textures[1]) {
if (!timer_started(s->renderTimer))
timer_start(s->renderTimer);
if (timer_get_ticks(s->renderTimer) > 300) {
timer_stop(s->renderTimer);
timer_start(s->renderTimer);
s->texture_index = s->texture_index == 0 ? 1 : 0;
}
}
Position cameraPos;
if (!s->fixed)
cameraPos = camera_to_camera_position(cam, &s->pos);
else
cameraPos = s->pos;
2017-12-14 12:01:05 +01:00
texture_render_clip(s->textures[s->texture_index],
&cameraPos,
&s->clip,
cam);
2017-11-30 21:00:47 +01:00
}
void sprite_destroy(Sprite *sprite)
{
if (sprite->destroyTextures) {
if (sprite->textures[0])
texture_destroy(sprite->textures[0]);
if (sprite->textures[1])
texture_destroy(sprite->textures[1]);
}
timer_destroy(sprite->renderTimer);
2017-11-30 21:00:47 +01:00
free(sprite);
}