From 749bb1ef50e1e732f519f894c38a6566d6b659cb Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sat, 3 Feb 2018 03:17:36 +0100 Subject: [PATCH] character: add ability to set the size of the confines Useful when the size of the canvas being drawn to is different than the size of the viewport (default confine). --- src/character.c | 35 +++++++++++++++++++++++++---------- src/character.h | 6 +++++- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/character.c b/src/character.c index 1873e6f..7b38954 100644 --- a/src/character.c +++ b/src/character.c @@ -148,8 +148,10 @@ SYMBOL_EXPORT struct Character* CreateCharacter(struct Game* game, char* name) { character->pos_tmp = 0; character->x = -1; character->y = -1; - character->pivotx = 0.5; - character->pivoty = 0.5; + character->pivotX = 0.5; + character->pivotY = 0.5; + character->confineX = -1; + character->confineY = -1; character->spritesheets = NULL; character->spritesheet = NULL; character->successor = NULL; @@ -211,7 +213,7 @@ SYMBOL_EXPORT void AnimateCharacter(struct Game* game, struct Character* charact } SYMBOL_EXPORT void MoveCharacter(struct Game* game, struct Character* character, float x, float y, float angle) { - MoveCharacterF(game, character, x / (float)game->viewport.width, y / (float)game->viewport.height, angle); + MoveCharacterF(game, character, x / (float)GetCharacterConfineX(game, character), y / (float)GetCharacterConfineY(game, character), angle); } SYMBOL_EXPORT void MoveCharacterF(struct Game* game, struct Character* character, float x, float y, float angle) { @@ -229,19 +231,19 @@ SYMBOL_EXPORT void SetCharacterPositionF(struct Game* game, struct Character* ch } SYMBOL_EXPORT void SetCharacterPosition(struct Game* game, struct Character* character, float x, float y, float angle) { - SetCharacterPositionF(game, character, x / (float)game->viewport.width, y / (float)game->viewport.height, angle); + SetCharacterPositionF(game, character, x / (float)GetCharacterConfineX(game, character), y / (float)GetCharacterConfineY(game, character), angle); } SYMBOL_EXPORT void SetCharacterPivotPoint(struct Game* game, struct Character* character, float x, float y) { - character->pivotx = x; - character->pivoty = 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) { if (character->dead) { return; } 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); - 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); + 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, GetCharacterX(game, character) + al_get_bitmap_width(character->bitmap) * scalex * character->pivotX, GetCharacterY(game, character) + 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) { @@ -252,19 +254,32 @@ SYMBOL_EXPORT void DrawScaledCharacter(struct Game* game, struct Character* char if (character->dead) { return; } 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); - 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); + 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)(GetCharacterX(game, character) + al_get_bitmap_width(character->bitmap) * scalex * character->pivotX), (int)(GetCharacterY(game, character) + 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) { DrawScaledCharacter(game, character, tint, 1, 1, flags); } +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; +} + +SYMBOL_EXPORT int GetCharacterConfineY(struct Game* game, struct Character* character) { + return (character->confineY >= 0) ? character->confineY : game->viewport.height; +} + SYMBOL_EXPORT int GetCharacterX(struct Game* game, struct Character* character) { - return character->x * game->viewport.width; + return character->x * GetCharacterConfineX(game, character); } SYMBOL_EXPORT int GetCharacterY(struct Game* game, struct Character* character) { - return character->y * game->viewport.height; + return character->y * GetCharacterConfineY(game, character); } SYMBOL_EXPORT float GetCharacterAngle(struct Game* game, struct Character* character) { diff --git a/src/character.h b/src/character.h index f5c5b9d..6b9d150 100644 --- a/src/character.h +++ b/src/character.h @@ -54,7 +54,8 @@ struct Character { float x; /*!< Horizontal position of character. */ float y; /*!< Vertical position of character. */ float angle; /*!< Characters display angle (radians). */ - float pivotx, pivoty; /*!< Pivot point, relative of character's size. */ + float pivotX, pivotY; /*!< Pivot point, relative of character's size. */ + int confineX, confineY; /*!< Size of the canvas being drawn to, for correct position calculation; when -1, uses viewport size */ void* data; /*!< Additional, custom character data (HP etc.). */ int repeat; bool shared; @@ -82,10 +83,13 @@ void MoveCharacterF(struct Game* game, struct Character* character, float x, flo 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 SetCharacterPivotPoint(struct Game* game, struct Character* character, float x, float y); +void SetCharacterConfines(struct Game* game, struct Character* character, int x, int y); int GetCharacterX(struct Game* game, struct Character* character); int GetCharacterY(struct Game* game, struct Character* character); float GetCharacterAngle(struct Game* game, struct Character* character); +int GetCharacterConfineX(struct Game* game, struct Character* character); +int GetCharacterConfineY(struct Game* game, struct Character* character); bool IsOnCharacter(struct Game* game, struct Character* character, int x, int y);