character: add an ability to tint subcharacters by their parent's color

This commit is contained in:
Sebastian Krzyszkowiak 2018-11-25 05:00:42 +01:00
parent 63f7ae39b9
commit de46cff0a4
No known key found for this signature in database
GPG key ID: E8F235CF3BDBC3FF
2 changed files with 23 additions and 6 deletions

View file

@ -335,6 +335,7 @@ SYMBOL_EXPORT struct Character* CreateCharacter(struct Game* game, char* name) {
character->repeats = -1; character->repeats = -1;
character->reversing = false; character->reversing = false;
character->parent = NULL; character->parent = NULL;
character->parent_tint = true;
character->hidden = false; character->hidden = false;
character->data = NULL; character->data = NULL;
character->callback = NULL; character->callback = NULL;
@ -531,6 +532,25 @@ SYMBOL_EXPORT ALLEGRO_TRANSFORM GetCharacterTransform(struct Game* game, struct
return transform; return transform;
} }
SYMBOL_EXPORT ALLEGRO_COLOR GetCharacterTint(struct Game* game, struct Character* character) {
ALLEGRO_COLOR color;
if (character->parent && character->parent_tint) {
float r, g, b, a;
al_unmap_rgba_f(character->tint, &r, &g, &b, &a);
float r2, g2, b2, a2;
al_unmap_rgba_f(GetCharacterTint(game, character->parent), &r2, &g2, &b2, &a2);
color = al_map_rgba_f(r * r2, g * g2, b * b2, a * a2);
} else {
color = character->tint;
}
float r, g, b, a, r2, g2, b2, a2;
al_unmap_rgba_f(color, &r, &g, &b, &a);
al_unmap_rgba_f(character->frame->tint, &r2, &g2, &b2, &a2);
return al_map_rgba_f(r * r2, g * g2, b * b2, a * a2);
}
SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character) { SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character) {
if (IsCharacterHidden(game, character)) { if (IsCharacterHidden(game, character)) {
return; return;
@ -542,12 +562,7 @@ SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character)
al_compose_transform(&transform, &current); al_compose_transform(&transform, &current);
al_use_transform(&transform); al_use_transform(&transform);
float r, g, b, a, r2, g2, b2, a2; al_draw_tinted_bitmap(character->frame->bitmap, GetCharacterTint(game, character), character->spritesheet->frames[character->pos].x, character->spritesheet->frames[character->pos].y, 0);
al_unmap_rgba_f(character->tint, &r, &g, &b, &a);
al_unmap_rgba_f(character->frame->tint, &r2, &g2, &b2, &a2);
ALLEGRO_COLOR tint = al_map_rgba_f(r * r2, g * g2, b * b2, a * a2);
al_draw_tinted_bitmap(character->frame->bitmap, tint, character->spritesheet->frames[character->pos].x, character->spritesheet->frames[character->pos].y, 0);
/* al_hold_bitmap_drawing(false); /* al_hold_bitmap_drawing(false);
al_draw_filled_rectangle(character->spritesheet->width * character->spritesheet->pivotX - 5, al_draw_filled_rectangle(character->spritesheet->width * character->spritesheet->pivotX - 5,

View file

@ -90,6 +90,7 @@ struct Character {
float x; /*!< Horizontal position of character. */ float x; /*!< Horizontal position of character. */
float y; /*!< Vertical position of character. */ float y; /*!< Vertical position of character. */
ALLEGRO_COLOR tint; /*!< Color with which the character's pixels will be multiplied (tinted). White for no effect. */ ALLEGRO_COLOR tint; /*!< Color with which the character's pixels will be multiplied (tinted). White for no effect. */
bool parent_tint; /*!< When true, the character tint is multiplied by its parent tint. */
//float pivotX; /*!< Pivot point's X, for scaling and rotating, relative of character's size. */ //float pivotX; /*!< Pivot point's X, for scaling and rotating, relative of character's size. */
//float pivotY; /*!< Pivot point's Y, for scaling and rotating, relative of character's size. */ //float pivotY; /*!< Pivot point's Y, for scaling and rotating, relative of character's size. */
float scaleX; /*!< Scale factor for X axis. */ float scaleX; /*!< Scale factor for X axis. */
@ -119,6 +120,7 @@ void RegisterSpritesheet(struct Game* game, struct Character* character, char* n
struct Spritesheet* GetSpritesheet(struct Game* game, struct Character* character, char* name); struct Spritesheet* GetSpritesheet(struct Game* game, struct Character* character, char* name);
ALLEGRO_TRANSFORM GetCharacterTransform(struct Game* game, struct Character* character); ALLEGRO_TRANSFORM GetCharacterTransform(struct Game* game, struct Character* character);
ALLEGRO_COLOR GetCharacterTint(struct Game* game, struct Character* character);
void DrawCharacter(struct Game* game, struct Character* character); void DrawCharacter(struct Game* game, struct Character* character);
void DrawScaledCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, float scalex, float scaley, int flags); void DrawScaledCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, float scalex, float scaley, int flags);