Start weapon animation

This commit is contained in:
Miloslav Číž 2019-10-22 21:02:39 +02:00
parent 9b480de55c
commit 53cc278e50
3 changed files with 47 additions and 10 deletions

View File

@ -89,4 +89,10 @@
*/ */
#define SFG_EXPLOSION_DISTANCE 2048 #define SFG_EXPLOSION_DISTANCE 2048
/**
Time, in ms, after which shotgun can be fired again.
*/
#define SFG_WEAPON_SHOTGUN_COOLDOWN 500
#endif // guard #endif // guard

49
main.c
View File

@ -336,6 +336,9 @@ typedef struct
#define SFG_SPRITE_ANIMATION_FRAME_DURATION 1 #define SFG_SPRITE_ANIMATION_FRAME_DURATION 1
#endif #endif
#define SFG_WEAPON_SHOTGUN_COOLDOWN_FRAMES \
(SFG_WEAPON_SHOTGUN_COOLDOWN / SFG_MS_PER_FRAME)
/* /*
GLOBAL VARIABLES GLOBAL VARIABLES
=============================================================================== ===============================================================================
@ -355,7 +358,9 @@ struct
for determining whether player is in the for determining whether player is in the
air. */ air. */
uint16_t headBobFrame; uint16_t headBobFrame;
uint8_t weapon; //< currently selected weapon uint8_t weapon; ///< currently selected weapon
uint32_t lastShotFrame; ///< frame at which last shot was fired
} SFG_player; } SFG_player;
RCL_RayConstraints SFG_rayConstraints; RCL_RayConstraints SFG_rayConstraints;
@ -547,6 +552,8 @@ void SFG_initPlayer()
SFG_player.headBobFrame = 0; SFG_player.headBobFrame = 0;
SFG_player.weapon = 1; SFG_player.weapon = 1;
SFG_player.lastShotFrame = SFG_gameFrame;
} }
void SFG_pixelFunc(RCL_PixelInfo *pixel) void SFG_pixelFunc(RCL_PixelInfo *pixel)
@ -1439,6 +1446,8 @@ void SFG_gameStep()
SFG_CAMERA_MAX_SHEAR_PIXELS, SFG_CAMERA_MAX_SHEAR_PIXELS,
SFG_ELEMENT_COLLISION_DISTANCE + RCL_CAMERA_COLL_RADIUS SFG_ELEMENT_COLLISION_DISTANCE + RCL_CAMERA_COLL_RADIUS
); );
SFG_player.lastShotFrame = SFG_gameFrame;
} }
if (SFG_keyIsDown(SFG_KEY_A)) if (SFG_keyIsDown(SFG_KEY_A))
@ -2100,6 +2109,31 @@ uint8_t SFG_drawNumber(
return 5 - position; return 5 - position;
} }
void SFG_drawWeapon(int16_t bobOffset)
{
uint32_t shotAnimationFrame = SFG_gameFrame - SFG_player.lastShotFrame;
uint32_t animationLength = SFG_WEAPON_SHOTGUN_COOLDOWN_FRAMES;
if (shotAnimationFrame < animationLength)
{
bobOffset +=
((animationLength - shotAnimationFrame) * SFG_WEAPON_IMAGE_SCALE * 20)
/ animationLength;
if (shotAnimationFrame < animationLength / 2)
SFG_blitImage(SFG_effects[0],
SFG_WEAPON_IMAGE_POSITION_X,
SFG_WEAPON_IMAGE_POSITION_Y - (SFG_TEXTURE_SIZE / 3) * SFG_WEAPON_IMAGE_SCALE + bobOffset,
SFG_WEAPON_IMAGE_SCALE);
}
SFG_blitImage(SFG_weaponImages[SFG_player.weapon],
SFG_WEAPON_IMAGE_POSITION_X,
SFG_WEAPON_IMAGE_POSITION_Y + bobOffset,
SFG_WEAPON_IMAGE_SCALE);
}
void SFG_draw() void SFG_draw()
{ {
if (SFG_keyPressed(SFG_KEY_MAP)) if (SFG_keyPressed(SFG_KEY_MAP))
@ -2208,7 +2242,6 @@ void SFG_draw()
} }
// projecile sprites: // projecile sprites:
for (uint8_t i = 0; i < SFG_currentLevel.projectileRecordCount; ++i) for (uint8_t i = 0; i < SFG_currentLevel.projectileRecordCount; ++i)
{ {
SFG_ProjectileRecord *proj = &(SFG_currentLevel.projectileRecords[i]); SFG_ProjectileRecord *proj = &(SFG_currentLevel.projectileRecords[i]);
@ -2224,12 +2257,14 @@ void SFG_draw()
const uint8_t *s = const uint8_t *s =
SFG_effects[proj->type == SFG_PROJECTILE_FIREBALL ? 1 : 0]; SFG_effects[proj->type == SFG_PROJECTILE_FIREBALL ? 1 : 0];
int16_t spriteSize = SFG_GAME_RESOLUTION_Y / 2; int16_t spriteSize = SFG_GAME_RESOLUTION_Y / 3;
if (proj->type == SFG_PROJECTILE_EXPLOSION) if (proj->type == SFG_PROJECTILE_EXPLOSION)
{ {
// grow the explosion sprite as an animation
spriteSize = spriteSize =
(SFG_GAME_RESOLUTION_Y * (SFG_EXPLOSION_DURATION_DOUBLE_FRAMES - proj->doubleFramesToLive) ) / (SFG_GAME_RESOLUTION_Y *
(SFG_EXPLOSION_DURATION_DOUBLE_FRAMES - proj->doubleFramesToLive)) /
SFG_EXPLOSION_DURATION_DOUBLE_FRAMES; SFG_EXPLOSION_DURATION_DOUBLE_FRAMES;
} }
@ -2251,11 +2286,7 @@ SFG_drawText("ammo",
SFG_GAME_RESOLUTION_X - 10 - 4 * (SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM + 1) SFG_GAME_RESOLUTION_X - 10 - 4 * (SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM + 1)
,SFG_GAME_RESOLUTION_Y - 10 - SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM,SFG_FONT_SIZE_MEDIUM,7); ,SFG_GAME_RESOLUTION_Y - 10 - SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM,SFG_FONT_SIZE_MEDIUM,7);
SFG_blitImage(SFG_weaponImages[SFG_player.weapon], SFG_drawWeapon(weaponBobOffset);
SFG_WEAPON_IMAGE_POSITION_X,
SFG_WEAPON_IMAGE_POSITION_Y + weaponBobOffset,
SFG_WEAPON_IMAGE_SCALE);
} }
} }

View File

@ -128,7 +128,7 @@
/** /**
Duration in ms of the explosion animation. Duration in ms of the explosion animation.
*/ */
#define SFG_EXPLOSION_DURATION 70 #define SFG_EXPLOSION_DURATION 100
/** /**
Specifies how quick some sprite animations are, in frames per second. Specifies how quick some sprite animations are, in frames per second.