add SetCharacterPivotPoint function

This commit is contained in:
Sebastian Krzyszkowiak 2017-09-15 23:44:44 +02:00
parent b4c7edf335
commit c34c13739d
2 changed files with 11 additions and 2 deletions

View file

@ -148,6 +148,8 @@ SYMBOL_EXPORT struct Character* CreateCharacter(struct Game* game, char* name) {
character->pos_tmp = 0; character->pos_tmp = 0;
character->x = -1; character->x = -1;
character->y = -1; character->y = -1;
character->pivotx = 0.5;
character->pivoty = 0.5;
character->spritesheets = NULL; character->spritesheets = NULL;
character->spritesheet = NULL; character->spritesheet = NULL;
character->successor = NULL; character->successor = NULL;
@ -230,11 +232,16 @@ SYMBOL_EXPORT void SetCharacterPosition(struct Game* game, struct Character* cha
SetCharacterPositionF(game, character, x / (float)game->viewport.width, y / (float)game->viewport.height, angle); SetCharacterPositionF(game, character, x / (float)game->viewport.width, y / (float)game->viewport.height, angle);
} }
SYMBOL_EXPORT void SetCharacterPivotPoint(struct Game* game, struct Character* character, float x, float y) {
character->pivotx = x;
character->pivoty = y;
}
SYMBOL_EXPORT void DrawScaledCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, float scalex, float scaley, int flags) { SYMBOL_EXPORT void DrawScaledCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, float scalex, float scaley, int flags) {
if (character->dead) { return; } if (character->dead) { return; }
int spritesheetX = al_get_bitmap_width(character->bitmap) * (character->pos % character->spritesheet->cols); int spritesheetX = al_get_bitmap_width(character->bitmap) * (character->pos % character->spritesheet->cols);
int spritesheetY = al_get_bitmap_height(character->bitmap) * (character->pos / character->spritesheet->cols); int spritesheetY = al_get_bitmap_height(character->bitmap) * (character->pos / character->spritesheet->cols);
al_draw_tinted_scaled_rotated_bitmap_region(character->spritesheet->bitmap, spritesheetX, spritesheetY, al_get_bitmap_width(character->bitmap), al_get_bitmap_height(character->bitmap), tint, al_get_bitmap_width(character->bitmap) / 2, al_get_bitmap_height(character->bitmap) / 2, character->x * game->viewport.width + al_get_bitmap_width(character->bitmap) * scalex / 2, character->y * game->viewport.height + al_get_bitmap_height(character->bitmap) * scaley / 2, scalex, scaley, character->angle, flags); al_draw_tinted_scaled_rotated_bitmap_region(character->spritesheet->bitmap, spritesheetX, spritesheetY, al_get_bitmap_width(character->bitmap), al_get_bitmap_height(character->bitmap), tint, al_get_bitmap_width(character->bitmap) * character->pivotx, al_get_bitmap_height(character->bitmap) * character->pivoty, character->x * game->viewport.width + al_get_bitmap_width(character->bitmap) * scalex * character->pivotx, character->y * game->viewport.height + al_get_bitmap_height(character->bitmap) * scaley * character->pivoty, scalex, scaley, character->angle, flags);
} }
SYMBOL_EXPORT void DrawCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, int flags) { SYMBOL_EXPORT void DrawCharacterF(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, int flags) {
@ -245,7 +252,7 @@ SYMBOL_EXPORT void DrawScaledCharacter(struct Game* game, struct Character* char
if (character->dead) { return; } if (character->dead) { return; }
int spritesheetX = al_get_bitmap_width(character->bitmap) * (character->pos % character->spritesheet->cols); int spritesheetX = al_get_bitmap_width(character->bitmap) * (character->pos % character->spritesheet->cols);
int spritesheetY = al_get_bitmap_height(character->bitmap) * (character->pos / character->spritesheet->cols); int spritesheetY = al_get_bitmap_height(character->bitmap) * (character->pos / character->spritesheet->cols);
al_draw_tinted_scaled_rotated_bitmap_region(character->spritesheet->bitmap, spritesheetX, spritesheetY, al_get_bitmap_width(character->bitmap), al_get_bitmap_height(character->bitmap), tint, al_get_bitmap_width(character->bitmap) / 2, al_get_bitmap_height(character->bitmap) / 2, (int)(character->x * game->viewport.width + al_get_bitmap_width(character->bitmap) * scalex / 2), (int)(character->y * game->viewport.height + al_get_bitmap_height(character->bitmap) * scaley / 2), scalex, scaley, character->angle, flags); al_draw_tinted_scaled_rotated_bitmap_region(character->spritesheet->bitmap, spritesheetX, spritesheetY, al_get_bitmap_width(character->bitmap), al_get_bitmap_height(character->bitmap), tint, al_get_bitmap_width(character->bitmap) * character->pivotx, al_get_bitmap_height(character->bitmap) * character->pivoty, (int)(character->x * game->viewport.width + al_get_bitmap_width(character->bitmap) * scalex * character->pivotx), (int)(character->y * game->viewport.height + al_get_bitmap_height(character->bitmap) * scaley * character->pivoty), scalex, scaley, character->angle, flags);
} }
SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, int flags) { SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, int flags) {

View file

@ -54,6 +54,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. */
float angle; /*!< Characters display angle (radians). */ float angle; /*!< Characters display angle (radians). */
float pivotx, pivoty; /*!< Pivot point, relative of character's size. */
void* data; /*!< Additional, custom character data (HP etc.). */ void* data; /*!< Additional, custom character data (HP etc.). */
int repeat; int repeat;
bool shared; bool shared;
@ -80,6 +81,7 @@ void MoveCharacter(struct Game* game, struct Character* character, float x, floa
void MoveCharacterF(struct Game* game, struct Character* character, float x, float y, float angle); void MoveCharacterF(struct Game* game, struct Character* character, float x, float y, float angle);
void SetCharacterPosition(struct Game* game, struct Character* character, float x, float y, float angle); void SetCharacterPosition(struct Game* game, struct Character* character, float x, float y, float angle);
void SetCharacterPositionF(struct Game* game, struct Character* character, float x, float y, float angle); void SetCharacterPositionF(struct Game* game, struct Character* character, float x, float y, float angle);
void SetCharacterPivotPoint(struct Game* game, struct Character* character, float x, float y);
int GetCharacterX(struct Game* game, struct Character* character); int GetCharacterX(struct Game* game, struct Character* character);
int GetCharacterY(struct Game* game, struct Character* character); int GetCharacterY(struct Game* game, struct Character* character);