implemented animation and sprite flipping
This commit is contained in:
parent
b91880c17c
commit
bfb354a3cf
36
src/sprite.c
36
src/sprite.c
|
@ -15,6 +15,8 @@ struct Sprite {
|
||||||
|
|
||||||
// The local transformation of this sprite.
|
// The local transformation of this sprite.
|
||||||
Vector origin;
|
Vector origin;
|
||||||
|
|
||||||
|
SDL_RendererFlip flip_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) {
|
Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) {
|
||||||
|
@ -25,6 +27,7 @@ Sprite* sprite_from_spritesheet(Spritesheet* sheet, size_t initial_frame) {
|
||||||
self->spritesheet = sheet;
|
self->spritesheet = sheet;
|
||||||
self->origin = (Vector){0.5f, 0.5f};
|
self->origin = (Vector){0.5f, 0.5f};
|
||||||
self->tile_index = initial_frame;
|
self->tile_index = initial_frame;
|
||||||
|
self->flip_state = SDL_FLIP_NONE;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -34,22 +37,28 @@ void sprite_destroy(Sprite* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void sprite_draw(Sprite* self, Transform transform) {
|
void sprite_draw(Sprite* self, Transform transform) {
|
||||||
// #warning "sprite drawing disabled"
|
|
||||||
// return;
|
|
||||||
SDL_Texture* texture = spritesheet_get_texture(self->spritesheet);
|
SDL_Texture* texture = spritesheet_get_texture(self->spritesheet);
|
||||||
SDL_Rect source = spritesheet_get_tile_rect(self->spritesheet, self->tile_index);
|
SDL_Rect source = spritesheet_get_tile_rect(self->spritesheet, self->tile_index);
|
||||||
|
|
||||||
Vector left_top = transform_point(&transform, vinvf(self->origin));
|
Vector origin = self->origin;
|
||||||
|
if(self->flip_state && SDL_FLIP_HORIZONTAL) {
|
||||||
|
origin.x = 1.0-origin.x;
|
||||||
|
}
|
||||||
|
if((self->flip_state & SDL_FLIP_VERTICAL) != 0) {
|
||||||
|
origin.y = 1.0-origin.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector left_top = transform_point(&transform, vinvf(origin));
|
||||||
SDL_FRect destination = (SDL_FRect) {
|
SDL_FRect destination = (SDL_FRect) {
|
||||||
left_top.x, left_top.y,
|
left_top.x, left_top.y,
|
||||||
transform.scale.x, transform.scale.y
|
transform.scale.x, transform.scale.y
|
||||||
};
|
};
|
||||||
destination = camera_world_to_pixel_rect(&g_camera, &destination);
|
destination = camera_world_to_pixel_rect(&g_camera, &destination);
|
||||||
Vector origin = vmulf(self->origin, transform.scale);
|
|
||||||
|
origin = vmulf(origin, transform.scale);
|
||||||
|
|
||||||
SDL_RenderCopyExF(g_renderer, texture, &source, &destination,
|
SDL_RenderCopyExF(g_renderer, texture, &source, &destination,
|
||||||
transform.rotation * 57.2958, &origin, SDL_FLIP_NONE);
|
transform.rotation * 57.2958, &origin, self->flip_state);
|
||||||
SDL_SetRenderDrawColor(g_renderer, 255, 255, 255, 255);
|
SDL_SetRenderDrawColor(g_renderer, 255, 255, 255, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +75,7 @@ size_t sprite_get_tile(const Sprite* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void sprite_set_tile(Sprite* self, size_t frame) {
|
void sprite_set_tile(Sprite* self, size_t frame) {
|
||||||
|
frame = frame % spritesheet_get_tile_count(self->spritesheet);
|
||||||
self->tile_index = frame;
|
self->tile_index = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,3 +86,19 @@ Spritesheet* sprite_get_spritesheet(const Sprite* self) {
|
||||||
void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet) {
|
void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet) {
|
||||||
self->spritesheet = spritesheet;
|
self->spritesheet = spritesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sprite_flip_horizontal(Sprite* self, int horizontal) {
|
||||||
|
if(horizontal) {
|
||||||
|
self->flip_state |= SDL_FLIP_HORIZONTAL;
|
||||||
|
} else {
|
||||||
|
self->flip_state &= ~SDL_FLIP_HORIZONTAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sprite_flip_vertical(Sprite* self, int vertical) {
|
||||||
|
if(vertical) {
|
||||||
|
self->flip_state |= SDL_FLIP_VERTICAL;
|
||||||
|
} else {
|
||||||
|
self->flip_state &= ~SDL_FLIP_VERTICAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -24,4 +24,7 @@ extern void sprite_set_tile(Sprite* self, size_t tile);
|
||||||
extern Spritesheet* sprite_get_spritesheet(const Sprite* self);
|
extern Spritesheet* sprite_get_spritesheet(const Sprite* self);
|
||||||
extern void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet);
|
extern void sprite_set_spritesheet(Sprite* self, Spritesheet* spritesheet);
|
||||||
|
|
||||||
|
extern void sprite_flip_horizontal(Sprite* self, int horizontal);
|
||||||
|
extern void sprite_flip_vertical(Sprite* self, int vertical);
|
||||||
|
|
||||||
#endif // !_fencer_sprite_h
|
#endif // !_fencer_sprite_h
|
||||||
|
|
|
@ -71,6 +71,10 @@ IVector spritesheet_get_resolution(const Spritesheet* self) {
|
||||||
return self->resolution;
|
return self->resolution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t spritesheet_get_tile_count(const Spritesheet* self) {
|
||||||
|
return self->tile_count;
|
||||||
|
}
|
||||||
|
|
||||||
asset_id spritesheet_get_asset_id(Spritesheet* self) {
|
asset_id spritesheet_get_asset_id(Spritesheet* self) {
|
||||||
return self->asset_id;
|
return self->asset_id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ extern void spritesheet_destroy(Spritesheet* self);
|
||||||
extern SDL_Texture* spritesheet_get_texture(const Spritesheet* self);
|
extern SDL_Texture* spritesheet_get_texture(const Spritesheet* self);
|
||||||
extern SDL_Rect spritesheet_get_tile_rect(const Spritesheet* self, size_t index);
|
extern SDL_Rect spritesheet_get_tile_rect(const Spritesheet* self, size_t index);
|
||||||
extern IVector spritesheet_get_resolution(const Spritesheet* self);
|
extern IVector spritesheet_get_resolution(const Spritesheet* self);
|
||||||
|
extern size_t spritesheet_get_tile_count(const Spritesheet* self);
|
||||||
|
|
||||||
extern asset_id spritesheet_get_asset_id(Spritesheet* self);
|
extern asset_id spritesheet_get_asset_id(Spritesheet* self);
|
||||||
extern void spritesheet_set_asset_id(Spritesheet* self, asset_id id);
|
extern void spritesheet_set_asset_id(Spritesheet* self, asset_id id);
|
||||||
|
|
Loading…
Reference in a new issue