mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2024-12-05 00:38:00 +01:00
character: Add ability to specify a spritesheet's hitbox area
This commit is contained in:
parent
99e49129be
commit
992d827daf
2 changed files with 36 additions and 9 deletions
|
@ -367,6 +367,11 @@ SYMBOL_EXPORT void RegisterSpritesheet(struct Game* game, struct Character* char
|
|||
s->offsetX = strtolnull(al_get_config_value(config, "offset", "x"), 0);
|
||||
s->offsetY = strtolnull(al_get_config_value(config, "offset", "y"), 0);
|
||||
|
||||
s->hitbox.x1 = strtodnull(al_get_config_value(config, "hitbox", "x1"), 0.0);
|
||||
s->hitbox.y1 = strtodnull(al_get_config_value(config, "hitbox", "y1"), 0.0);
|
||||
s->hitbox.x2 = strtodnull(al_get_config_value(config, "hitbox", "x2"), 0.0);
|
||||
s->hitbox.y2 = strtodnull(al_get_config_value(config, "hitbox", "y2"), 0.0);
|
||||
|
||||
s->frames = calloc(s->frame_count, sizeof(struct SpritesheetFrame));
|
||||
|
||||
for (int i = 0; i < s->frame_count; i++) {
|
||||
|
@ -385,11 +390,10 @@ SYMBOL_EXPORT void RegisterSpritesheet(struct Game* game, struct Character* char
|
|||
s->frames[i].flipX = strtolnull(al_get_config_value(config, framename, "flipX"), 0);
|
||||
s->frames[i].flipY = strtolnull(al_get_config_value(config, framename, "flipY"), 0);
|
||||
|
||||
double r = 0, g = 0, b = 0, a = 0;
|
||||
r = strtodnull(al_get_config_value(config, framename, "r"), 1);
|
||||
g = strtodnull(al_get_config_value(config, framename, "g"), 1);
|
||||
b = strtodnull(al_get_config_value(config, framename, "b"), 1);
|
||||
a = strtodnull(al_get_config_value(config, framename, "a"), 1);
|
||||
double r = strtodnull(al_get_config_value(config, framename, "r"), 1.0);
|
||||
double g = strtodnull(al_get_config_value(config, framename, "g"), 1.0);
|
||||
double b = strtodnull(al_get_config_value(config, framename, "b"), 1.0);
|
||||
double a = strtodnull(al_get_config_value(config, framename, "a"), 1.0);
|
||||
s->frames[i].tint = al_premul_rgba_f(r, g, b, a);
|
||||
|
||||
s->frames[i].file = NULL;
|
||||
|
@ -790,6 +794,10 @@ SYMBOL_EXPORT ALLEGRO_COLOR GetCharacterTint(struct Game* game, struct Character
|
|||
return al_map_rgba_f(r * r2, g * g2, b * b2, a * a2);
|
||||
}
|
||||
|
||||
static bool HasValidHitbox(struct Spritesheet* spritesheet) {
|
||||
return spritesheet->hitbox.x1 != 0.0 && spritesheet->hitbox.y1 != 0.0 && spritesheet->hitbox.x2 != 0.0 && spritesheet->hitbox.y2 != 0.0;
|
||||
}
|
||||
|
||||
SYMBOL_EXPORT void DrawCharacter(struct Game* game, struct Character* character) {
|
||||
if (IsCharacterHidden(game, character)) {
|
||||
return;
|
||||
|
@ -824,6 +832,12 @@ SYMBOL_EXPORT void DrawDebugCharacter(struct Game* game, struct Character* chara
|
|||
|
||||
al_draw_rectangle(0, 0, character->spritesheet->width, character->spritesheet->height, al_map_rgb(0, 255, 255), 5);
|
||||
|
||||
if (HasValidHitbox(character->spritesheet)) {
|
||||
al_draw_rectangle(character->spritesheet->hitbox.x1 * character->spritesheet->width, character->spritesheet->hitbox.y1 * character->spritesheet->height,
|
||||
character->spritesheet->hitbox.x2 * character->spritesheet->width, character->spritesheet->hitbox.y2 * character->spritesheet->height,
|
||||
al_map_rgb(255, 255, 0), 3);
|
||||
}
|
||||
|
||||
al_draw_filled_rectangle(character->spritesheet->width * character->spritesheet->pivotX - 5,
|
||||
character->spritesheet->height * character->spritesheet->pivotY - 5,
|
||||
character->spritesheet->width * character->spritesheet->pivotX + 5,
|
||||
|
@ -893,6 +907,14 @@ SYMBOL_EXPORT bool IsOnCharacter(struct Game* game, struct Character* character,
|
|||
float x1 = MIN(0.0, character->spritesheet->offsetX) + MIN(0.0, character->frame->x), y1 = MIN(0.0, character->spritesheet->offsetY) + MIN(0.0, character->frame->y);
|
||||
float x2 = character->spritesheet->width, y2 = character->spritesheet->height;
|
||||
|
||||
if (HasValidHitbox(character->spritesheet)) {
|
||||
PrintConsole(game, "valid %f %d", character->spritesheet->hitbox.x1, isnan(character->spritesheet->hitbox.x1));
|
||||
x1 = character->spritesheet->hitbox.x1 * character->spritesheet->width;
|
||||
y1 = character->spritesheet->hitbox.y1 * character->spritesheet->height;
|
||||
x2 = character->spritesheet->hitbox.x2 * character->spritesheet->width;
|
||||
y2 = character->spritesheet->hitbox.y2 * character->spritesheet->height;
|
||||
}
|
||||
|
||||
ALLEGRO_TRANSFORM transform = GetCharacterTransform(game, character);
|
||||
al_transform_coordinates(&transform, &x1, &y1);
|
||||
al_transform_coordinates(&transform, &x2, &y2);
|
||||
|
|
|
@ -70,8 +70,8 @@ struct Spritesheet {
|
|||
char* predecessor;
|
||||
bool bidir;
|
||||
bool reversed;
|
||||
double pivotX;
|
||||
double pivotY;
|
||||
double pivotX; /*!< Pivot point's X, for scaling and rotating, relative of character's size. */
|
||||
double pivotY; /*!< Pivot point's Y, for scaling and rotating, relative of character's size. */
|
||||
int offsetX;
|
||||
int offsetY;
|
||||
bool flipX;
|
||||
|
@ -83,6 +83,13 @@ struct Spritesheet {
|
|||
SpritesheetStreamDestructor* stream_destructor;
|
||||
void* stream_data;
|
||||
|
||||
struct {
|
||||
double x1;
|
||||
double y1;
|
||||
double x2;
|
||||
double y2;
|
||||
} hitbox;
|
||||
|
||||
int width;
|
||||
int height;
|
||||
|
||||
|
@ -112,8 +119,6 @@ struct Character {
|
|||
float y; /*!< Vertical position of character. */
|
||||
ALLEGRO_COLOR tint; /*!< Color with which the character's pixels will be multiplied (tinted). White for no effect. */
|
||||
bool parent_tint; /*!< When true, the character tint is multiplied by its parent tint. */
|
||||
//float pivotX; /*!< Pivot point's X, for scaling and rotating, relative of character's size. */
|
||||
//float pivotY; /*!< Pivot point's Y, for scaling and rotating, relative of character's size. */
|
||||
float scaleX; /*!< Scale factor for X axis. */
|
||||
float scaleY; /*!< Scale factor for Y axis. */
|
||||
float angle; /*!< Character's rotation angle (radians). */
|
||||
|
|
Loading…
Reference in a new issue