mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-07 21:56:44 +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) {
|
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;
|
if (character->dead) return;
|
||||||
character->x += x;
|
character->x += x;
|
||||||
character->y += y;
|
character->y += y;
|
||||||
character->angle += angle;
|
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;
|
if (character->dead) return;
|
||||||
character->x = x;
|
character->x = x;
|
||||||
character->y = y;
|
character->y = y;
|
||||||
character->angle = angle;
|
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) {
|
SYMBOL_EXPORT void DrawCharacter(struct Game *game, struct Character *character, ALLEGRO_COLOR tint, 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 + 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;
|
bool dead;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void SelectSpritesheet(struct Game *game, struct Character *character, char* name);
|
void SelectSpritesheet(struct Game *game, struct Character *character, char* name);
|
||||||
void ChangeSpritesheet(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 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);
|
void DrawCharacter(struct Game *game, struct Character *character, ALLEGRO_COLOR tilt, int flags);
|
||||||
|
|
||||||
struct Character* CreateCharacter(struct Game *game, char* name);
|
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 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 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
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue