mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-08 06:06:43 +01:00
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).
This commit is contained in:
parent
cb4b9638c8
commit
749bb1ef50
2 changed files with 30 additions and 11 deletions
|
@ -148,8 +148,10 @@ 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->pivotX = 0.5;
|
||||||
character->pivoty = 0.5;
|
character->pivotY = 0.5;
|
||||||
|
character->confineX = -1;
|
||||||
|
character->confineY = -1;
|
||||||
character->spritesheets = NULL;
|
character->spritesheets = NULL;
|
||||||
character->spritesheet = NULL;
|
character->spritesheet = NULL;
|
||||||
character->successor = 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) {
|
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) {
|
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) {
|
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) {
|
SYMBOL_EXPORT void SetCharacterPivotPoint(struct Game* game, struct Character* character, float x, float y) {
|
||||||
character->pivotx = x;
|
character->pivotX = x;
|
||||||
character->pivoty = y;
|
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) * 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) {
|
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; }
|
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) * 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) {
|
SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character, ALLEGRO_COLOR tint, int flags) {
|
||||||
DrawScaledCharacter(game, character, tint, 1, 1, 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) {
|
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) {
|
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) {
|
SYMBOL_EXPORT float GetCharacterAngle(struct Game* game, struct Character* character) {
|
||||||
|
|
|
@ -54,7 +54,8 @@ 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. */
|
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.). */
|
void* data; /*!< Additional, custom character data (HP etc.). */
|
||||||
int repeat;
|
int repeat;
|
||||||
bool shared;
|
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 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);
|
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 GetCharacterX(struct Game* game, struct Character* character);
|
||||||
int GetCharacterY(struct Game* game, struct Character* character);
|
int GetCharacterY(struct Game* game, struct Character* character);
|
||||||
float GetCharacterAngle(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);
|
bool IsOnCharacter(struct Game* game, struct Character* character, int x, int y);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue