mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-01 02:56:43 +01:00
character: support sub-characters (characters positioned relatively to parent character)
This commit is contained in:
parent
c7fbf08e12
commit
b60bcfda54
2 changed files with 25 additions and 7 deletions
|
@ -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(¤t);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue