character: support sub-characters (characters positioned relatively to parent character)

This commit is contained in:
Sebastian Krzyszkowiak 2018-08-02 23:32:03 +02:00
parent c7fbf08e12
commit b60bcfda54
2 changed files with 25 additions and 7 deletions

View file

@ -369,7 +369,7 @@ SYMBOL_EXPORT void DestroyCharacter(struct Game* game, struct Character* charact
}
SYMBOL_EXPORT void AnimateCharacter(struct Game* game, struct Character* character, float delta, float speed_modifier) {
if (character->hidden) {
if (IsCharacterHidden(game, character)) {
return;
}
@ -484,11 +484,15 @@ SYMBOL_EXPORT ALLEGRO_TRANSFORM GetCharacterTransform(struct Game* game, struct
al_scale_transform(&transform, character->scaleX, character->scaleY);
al_rotate_transform(&transform, character->angle);
al_translate_transform(&transform, GetCharacterX(game, character), GetCharacterY(game, character)); // position
if (character->parent) {
ALLEGRO_TRANSFORM parent = GetCharacterTransform(game, character->parent);
al_compose_transform(&transform, &parent);
}
return transform;
}
SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character) {
if (character->hidden) {
if (IsCharacterHidden(game, character)) {
return;
}
@ -510,17 +514,21 @@ SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character)
al_use_transform(&current);
}
SYMBOL_EXPORT void SetParentCharacter(struct Game* game, struct Character* character, struct Character* parent) {
character->parent = parent;
}
SYMBOL_EXPORT void SetCharacterConfines(struct Game* game, struct Character* character, int x, int y) {
character->confineX = x;
character->confineY = y;
}
SYMBOL_EXPORT int GetCharacterConfineX(struct Game* game, struct Character* character) {
return (character->confineX >= 0) ? character->confineX : game->viewport.width;
return (character->confineX >= 0) ? character->confineX : (character->parent ? GetCharacterConfineX(game, character->parent) : game->viewport.width);
}
SYMBOL_EXPORT int GetCharacterConfineY(struct Game* game, struct Character* character) {
return (character->confineY >= 0) ? character->confineY : game->viewport.height;
return (character->confineY >= 0) ? character->confineY : (character->parent ? GetCharacterConfineY(game, character->parent) : game->viewport.height);
}
SYMBOL_EXPORT float GetCharacterX(struct Game* game, struct Character* character) {
@ -540,7 +548,7 @@ static void SortTwoFloats(float* v1, float* v2) {
}
SYMBOL_EXPORT bool IsOnCharacter(struct Game* game, struct Character* character, float x, float y, bool pixelperfect) {
if (character->hidden) {
if (IsCharacterHidden(game, character)) {
return false;
}
@ -571,3 +579,12 @@ SYMBOL_EXPORT void ShowCharacter(struct Game* game, struct Character* character)
SYMBOL_EXPORT void HideCharacter(struct Game* game, struct Character* character) {
character->hidden = true;
}
SYMBOL_EXPORT bool IsCharacterHidden(struct Game* game, struct Character* character) {
if (character->hidden) {
return true;
}
if (character->parent) {
return IsCharacterHidden(game, character->parent);
}
return false;
}

View file

@ -105,8 +105,6 @@ struct Character {
void* callbackData;
CharacterDestructor* destructor;
bool shared; /*!< Marks the list of spritesheets as shared, so it won't be freed together with the character. */
// TODO: parents
};
// TODO: document functions
@ -136,6 +134,8 @@ void SetCharacterPosition(struct Game* game, struct Character* character, float
void SetCharacterPositionF(struct Game* game, struct Character* character, float x, float y, float angle);
void SetCharacterConfines(struct Game* game, struct Character* character, int x, int y);
void SetParentCharacter(struct Game* game, struct Character* character, struct Character* parent);
float GetCharacterX(struct Game* game, struct Character* character);
float GetCharacterY(struct Game* game, struct Character* character);
int GetCharacterConfineX(struct Game* game, struct Character* character);
@ -144,5 +144,6 @@ int GetCharacterConfineY(struct Game* game, struct Character* character);
bool IsOnCharacter(struct Game* game, struct Character* character, float x, float y, bool pixelperfect);
void ShowCharacter(struct Game* game, struct Character* character);
void HideCharacter(struct Game* game, struct Character* character);
bool IsCharacterHidden(struct Game* game, struct Character* character);
#endif