mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-01 02:56:43 +01:00
refine Character API
BREAKING CHANGES: character->x and character->y now refer to position relative to screen width and height (0.0,0.0 being top left; 1.0,1.0 being bottom right). Use GetCharacterX and GetCharacterY to get position in pixels. For consistency, it's also recommended to use GetCharacterAngle. SetCharacterPosition/MoveCharacter still accept pixels. To use relative positions, call SetCharacterPositionF/MoveCharacterF instead. Also, DrawCharacter now casts the position to integer, effectively disabling Allegro's subpixel precision. To disable casts, use DrawCharacterF.
This commit is contained in:
parent
af6636009e
commit
04db328028
2 changed files with 38 additions and 4 deletions
|
@ -184,22 +184,50 @@ 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);
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT void MoveCharacterF(struct Game *game, struct Character *character, float x, float y, float angle) {
|
||||
if (character->dead) return;
|
||||
character->x += x;
|
||||
character->y += y;
|
||||
character->angle += angle;
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT void SetCharacterPosition(struct Game *game, struct Character *character, int x, int y, float angle) {
|
||||
SYMBOL_EXPORT void SetCharacterPositionF(struct Game *game, struct Character *character, float x, float y, float angle) {
|
||||
if (character->dead) return;
|
||||
character->x = x;
|
||||
character->y = y;
|
||||
character->angle = 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);
|
||||
}
|
||||
|
||||
|
||||
SYMBOL_EXPORT void DrawCharacterF(struct Game *game, struct Character *character, ALLEGRO_COLOR tint, 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)/2, al_get_bitmap_height(character->bitmap)/2, character->x*game->viewport.width + al_get_bitmap_width(character->bitmap)/2, character->y*game->viewport.height + al_get_bitmap_height(character->bitmap)/2, 1, 1, character->angle, flags);
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT void DrawCharacter(struct Game *game, struct Character *character, ALLEGRO_COLOR tint, 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)/2, al_get_bitmap_height(character->bitmap)/2, character->x + al_get_bitmap_width(character->bitmap)/2, character->y + al_get_bitmap_height(character->bitmap)/2, 1, 1, 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)/2, al_get_bitmap_height(character->bitmap)/2, (int)(character->x*game->viewport.width + al_get_bitmap_width(character->bitmap)/2), (int)(character->y*game->viewport.height + al_get_bitmap_height(character->bitmap)/2), 1, 1, character->angle, flags);
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT int GetCharacterX(struct Game *game, struct Character *character) {
|
||||
return character->x * game->viewport.width;
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT int GetCharacterY(struct Game *game, struct Character *character) {
|
||||
return character->y * game->viewport.height;
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT float GetCharacterAngle(struct Game *game, struct Character *character) {
|
||||
return character->angle;
|
||||
}
|
||||
|
|
|
@ -59,11 +59,11 @@ struct Character {
|
|||
bool dead;
|
||||
};
|
||||
|
||||
|
||||
void SelectSpritesheet(struct Game *game, struct Character *character, char* name);
|
||||
void ChangeSpritesheet(struct Game *game, struct Character *character, char* name);
|
||||
void RegisterSpritesheet(struct Game *game, struct Character *character, char* name);
|
||||
|
||||
void DrawCharacterF(struct Game *game, struct Character *character, ALLEGRO_COLOR tilt, int flags);
|
||||
void DrawCharacter(struct Game *game, struct Character *character, ALLEGRO_COLOR tilt, int flags);
|
||||
|
||||
struct Character* CreateCharacter(struct Game *game, char* name);
|
||||
|
@ -74,6 +74,12 @@ void UnloadSpritesheets(struct Game *game, struct Character *character);
|
|||
|
||||
void AnimateCharacter(struct Game *game, struct Character *character, float speed_modifier);
|
||||
void MoveCharacter(struct Game *game, struct Character *character, float x, float y, float angle);
|
||||
void SetCharacterPosition(struct Game *game, struct Character *character, int x, int 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 SetCharacterPositionF(struct Game *game, struct Character *character, float x, float y, float angle);
|
||||
|
||||
int GetCharacterX(struct Game *game, struct Character *character);
|
||||
int GetCharacterY(struct Game *game, struct Character *character);
|
||||
float GetCharacterAngle(struct Game *game, struct Character *character);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue