Improve border indicators

This commit is contained in:
Miloslav Číž 2020-01-12 16:48:42 +01:00
parent 464e61160c
commit 9d3ae365c6
3 changed files with 64 additions and 22 deletions

View File

@ -279,14 +279,14 @@
#define SFG_HUD_MARGIN (SFG_GAME_RESOLUTION_X / 40) #define SFG_HUD_MARGIN (SFG_GAME_RESOLUTION_X / 40)
#define SFG_HUD_HEALTH_INDICATOR_WIDTH_PIXELS \ #define SFG_HUD_BORDER_INDICATOR_WIDTH_PIXELS \
(SFG_GAME_RESOLUTION_Y / SFG_HUD_HEALTH_INDICATOR_WIDTH) (SFG_GAME_RESOLUTION_Y / SFG_HUD_BORDER_INDICATOR_WIDTH)
#define SFG_HUD_HEALTH_INDICATOR_DURATION_FRAMES \ #define SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES \
(SFG_HUD_HEALTH_INDICATOR_DURATION / SFG_MS_PER_FRAME) (SFG_HUD_BORDER_INDICATOR_DURATION / SFG_MS_PER_FRAME)
#if SFG_HUD_HEALTH_INDICATOR_DURATION_FRAMES == 0 #if SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES == 0
#define SFG_HUD_HEALTH_INDICATOR_DURATION_FRAMES 1 #define SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES 1
#endif #endif
#define SFG_HUD_BAR_HEIGHT \ #define SFG_HUD_BAR_HEIGHT \

45
main.c
View File

@ -219,6 +219,7 @@ struct
uint32_t weaponCooldownStartFrame; /**< frame from which weapon cooldown is uint32_t weaponCooldownStartFrame; /**< frame from which weapon cooldown is
counted */ counted */
uint32_t lastHurtFrame; uint32_t lastHurtFrame;
uint32_t lastItemTakenFrame;
} SFG_player; } SFG_player;
RCL_RayConstraints SFG_rayConstraints; RCL_RayConstraints SFG_rayConstraints;
@ -905,6 +906,7 @@ void SFG_initPlayer()
SFG_player.weaponCooldownStartFrame = SFG_gameFrame; SFG_player.weaponCooldownStartFrame = SFG_gameFrame;
SFG_player.lastHurtFrame = SFG_gameFrame; SFG_player.lastHurtFrame = SFG_gameFrame;
SFG_player.lastItemTakenFrame = SFG_gameFrame;
SFG_player.health = SFG_PLAYER_MAX_HEALTH; SFG_player.health = SFG_PLAYER_MAX_HEALTH;
} }
@ -2018,22 +2020,42 @@ void SFG_gameStep()
) )
) )
{ {
if (e->type == SFG_LEVEL_ELEMENT_HEALTH) uint8_t eliminate = 1;
switch (e->type)
{ {
case SFG_LEVEL_ELEMENT_HEALTH:
SFG_playerChangeHealth(SFG_HEALTH_KIT_VALUE); SFG_playerChangeHealth(SFG_HEALTH_KIT_VALUE);
break;
// take, eliminate the item case SFG_LEVEL_ELEMENT_BULLETS:
break;
case SFG_LEVEL_ELEMENT_ROCKETS:
break;
case SFG_LEVEL_ELEMENT_PLASMA:
break;
default:
eliminate = 0;
break;
}
if (eliminate)
{
SFG_removeItem(i); SFG_removeItem(i);
SFG_player.lastItemTakenFrame = SFG_gameFrame;
i--; i--;
} }
else // collide else // collide
{
moveOffset = SFG_resolveCollisionWithElement( moveOffset = SFG_resolveCollisionWithElement(
SFG_player.camera.position,moveOffset,ePos); SFG_player.camera.position,moveOffset,ePos);
} }
} }
} }
}
#if SFG_PREVIEW_MODE #if SFG_PREVIEW_MODE
SFG_player.camera.position.x += SFG_player.camera.position.x +=
@ -2555,7 +2577,11 @@ uint8_t SFG_drawNumber(
return 5 - position; return 5 - position;
} }
void SFG_drawHealthChangeBorder(uint16_t width, uint8_t color) /**
Draws a border that indicates something is happening, e.g. being hurt or
taking an item.
*/
void SFG_drawIndicationBorder(uint16_t width, uint8_t color)
{ {
for (uint16_t j = 0; j < width; ++j) for (uint16_t j = 0; j < width; ++j)
{ {
@ -2832,9 +2858,16 @@ void SFG_draw()
SFG_FONT_SIZE_MEDIUM, SFG_FONT_SIZE_MEDIUM,
4); 4);
// border indicator
if (SFG_gameFrame - SFG_player.lastHurtFrame if (SFG_gameFrame - SFG_player.lastHurtFrame
<= SFG_HUD_HEALTH_INDICATOR_DURATION_FRAMES) <= SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES)
SFG_drawHealthChangeBorder(SFG_HUD_HEALTH_INDICATOR_WIDTH_PIXELS,175); SFG_drawIndicationBorder(SFG_HUD_BORDER_INDICATOR_WIDTH_PIXELS,
SFG_HUD_HURT_INDICATION_COLOR);
else if (SFG_gameFrame - SFG_player.lastItemTakenFrame
<= SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES)
SFG_drawIndicationBorder(SFG_HUD_BORDER_INDICATOR_WIDTH_PIXELS,
SFG_HUD_ITEM_TAKEN_INDICATION_COLOR);
} }
} }

View File

@ -50,7 +50,7 @@
/** /**
Turn on for previes mode for map editing (flying, noclip, fast movement etc.). Turn on for previes mode for map editing (flying, noclip, fast movement etc.).
*/ */
#define SFG_PREVIEW_MODE 1 #define SFG_PREVIEW_MODE 0
/** /**
How much faster movement is in the preview mode. How much faster movement is in the preview mode.
@ -131,15 +131,24 @@
#define SFG_SPRITE_ANIMATION_SPEED 4 #define SFG_SPRITE_ANIMATION_SPEED 4
/** /**
How wide the health indicator (screen border) is, in fractions of screen How wide the border indicator is, in fractions of screen width.
width.
*/ */
#define SFG_HUD_HEALTH_INDICATOR_WIDTH 32 #define SFG_HUD_BORDER_INDICATOR_WIDTH 32
/** /**
For how long health indicator stays shown, in ms. For how long border indication (being hurt etc.) stays shown, in ms.
*/ */
#define SFG_HUD_HEALTH_INDICATOR_DURATION 500 #define SFG_HUD_BORDER_INDICATOR_DURATION 500
/**
Color (palette index) by which being hurt is indicated.
*/
#define SFG_HUD_HURT_INDICATION_COLOR 175
/**
Color (palette index) by which taking an item is indicated.
*/
#define SFG_HUD_ITEM_TAKEN_INDICATION_COLOR 207
/** /**
How many element (items, monsters, ...) distances will be checked per frame How many element (items, monsters, ...) distances will be checked per frame