diff options
-rw-r--r-- | res/scripts/common.lua | 15 | ||||
-rw-r--r-- | res/scripts/underwater.lua | 1 | ||||
-rw-r--r-- | res/scripts/underwater_start.lua | 1 | ||||
-rw-r--r-- | src/animation_system.cpp | 19 | ||||
-rw-r--r-- | src/animation_system.h | 1 | ||||
-rw-r--r-- | src/character_system.cpp | 3 | ||||
-rw-r--r-- | src/renderer.cpp | 3 | ||||
-rw-r--r-- | src/script_system.cpp | 3 | ||||
-rw-r--r-- | src/sprite.h | 8 |
9 files changed, 52 insertions, 2 deletions
diff --git a/res/scripts/common.lua b/res/scripts/common.lua index 895ad7b..825d2e5 100644 --- a/res/scripts/common.lua +++ b/res/scripts/common.lua | |||
@@ -329,3 +329,18 @@ function AllowCrouching() | |||
329 | local playerSprite = getSprite(playerId) | 329 | local playerSprite = getSprite(playerId) |
330 | playerSprite.cantCrouch = false | 330 | playerSprite.cantCrouch = false |
331 | end | 331 | end |
332 | |||
333 | --- Makes a sprite start bobbing up and down (for underwater). | ||
334 | -- This only applies when the sprite is on a normal medium (so, not on ladders). | ||
335 | function StartBobbing(spriteName) | ||
336 | local spriteId = getSpriteByAlias(spriteName) | ||
337 | local sprite = getSprite(spriteId) | ||
338 | sprite.bobsWhenNormal = true | ||
339 | end | ||
340 | |||
341 | --- Makes a sprite stop bobbing up and down. | ||
342 | function StopBobbing(spriteName) | ||
343 | local spriteId = getSpriteByAlias(spriteName) | ||
344 | local sprite = getSprite(spriteId) | ||
345 | sprite.bobsWhenNormal = false | ||
346 | end | ||
diff --git a/res/scripts/underwater.lua b/res/scripts/underwater.lua index 4c5d2bb..3500079 100644 --- a/res/scripts/underwater.lua +++ b/res/scripts/underwater.lua | |||
@@ -2,6 +2,7 @@ underwater = {} | |||
2 | 2 | ||
3 | function underwater.leave() | 3 | function underwater.leave() |
4 | AllowCrouching() | 4 | AllowCrouching() |
5 | StopBobbing("lucas") | ||
5 | end | 6 | end |
6 | 7 | ||
7 | function underwater.fish2() | 8 | function underwater.fish2() |
diff --git a/res/scripts/underwater_start.lua b/res/scripts/underwater_start.lua index 98a6e67..c14f4b8 100644 --- a/res/scripts/underwater_start.lua +++ b/res/scripts/underwater_start.lua | |||
@@ -2,6 +2,7 @@ underwater_start = {} | |||
2 | 2 | ||
3 | function underwater_start.init() | 3 | function underwater_start.init() |
4 | PreventCrouching() | 4 | PreventCrouching() |
5 | StartBobbing("lucas") | ||
5 | end | 6 | end |
6 | 7 | ||
7 | function underwater_start.talk_to_fish1() | 8 | function underwater_start.talk_to_fish1() |
diff --git a/src/animation_system.cpp b/src/animation_system.cpp index baf94a4..5892f64 100644 --- a/src/animation_system.cpp +++ b/src/animation_system.cpp | |||
@@ -134,6 +134,25 @@ void AnimationSystem::tick(double dt) { | |||
134 | } | 134 | } |
135 | } | 135 | } |
136 | } | 136 | } |
137 | |||
138 | bobbingTimer_.accumulate(dt); | ||
139 | while (bobbingTimer_.step()) { | ||
140 | for (Sprite& sprite : game_.getSprites() | game_.spriteView()) { | ||
141 | if (sprite.isAnimated && sprite.bobbing) { | ||
142 | if (sprite.bobbingDown) { | ||
143 | sprite.bobAmount--; | ||
144 | if (sprite.bobAmount == 0) { | ||
145 | sprite.bobbingDown = false; | ||
146 | } | ||
147 | } else { | ||
148 | sprite.bobAmount++; | ||
149 | if (sprite.bobAmount == 4) { | ||
150 | sprite.bobbingDown = true; | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | } | ||
155 | } | ||
137 | } | 156 | } |
138 | 157 | ||
139 | void AnimationSystem::setSpriteDirection(int spriteId, Direction dir) { | 158 | void AnimationSystem::setSpriteDirection(int spriteId, Direction dir) { |
diff --git a/src/animation_system.h b/src/animation_system.h index c64c2dc..42aa516 100644 --- a/src/animation_system.h +++ b/src/animation_system.h | |||
@@ -30,6 +30,7 @@ private: | |||
30 | 30 | ||
31 | Game& game_; | 31 | Game& game_; |
32 | std::vector<Timer> animTimers_ = {{1000/5}, {1000/60}};//30fps * 1000 t/s;; | 32 | std::vector<Timer> animTimers_ = {{1000/5}, {1000/60}};//30fps * 1000 t/s;; |
33 | Timer bobbingTimer_ {1000/7}; | ||
33 | }; | 34 | }; |
34 | 35 | ||
35 | #endif /* end of include guard: ANIMATION_SYSTEM_H_CCCC7CB8 */ | 36 | #endif /* end of include guard: ANIMATION_SYSTEM_H_CCCC7CB8 */ |
diff --git a/src/character_system.cpp b/src/character_system.cpp index 87407af..9b91716 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp | |||
@@ -332,12 +332,14 @@ void CharacterSystem::setAnimationFor(int spriteId, CharacterState state) { | |||
332 | 332 | ||
333 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); | 333 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); |
334 | sprite.hasShadow = sprite.normallyHasShadow; | 334 | sprite.hasShadow = sprite.normallyHasShadow; |
335 | sprite.bobbing = sprite.bobsWhenNormal; | ||
335 | 336 | ||
336 | break; | 337 | break; |
337 | } | 338 | } |
338 | case CharacterMedium::Ladder: { | 339 | case CharacterMedium::Ladder: { |
339 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, "climb"); | 340 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, "climb"); |
340 | sprite.hasShadow = false; | 341 | sprite.hasShadow = false; |
342 | sprite.bobbing = false; | ||
341 | 343 | ||
342 | if (state == CharacterState::Still || state == CharacterState::Crouching) { | 344 | if (state == CharacterState::Still || state == CharacterState::Crouching) { |
343 | sprite.animPaused = true; | 345 | sprite.animPaused = true; |
@@ -355,6 +357,7 @@ void CharacterSystem::setAnimationFor(int spriteId, CharacterState state) { | |||
355 | 357 | ||
356 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); | 358 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); |
357 | sprite.hasShadow = false; | 359 | sprite.hasShadow = false; |
360 | sprite.bobbing = false; | ||
358 | 361 | ||
359 | break; | 362 | break; |
360 | } | 363 | } |
diff --git a/src/renderer.cpp b/src/renderer.cpp index 1196e50..3007378 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -115,6 +115,9 @@ void Renderer::renderSprite(const Sprite& sprite) { | |||
115 | const SpriteFrame& frame = sprite.frames.at(sprite.animations.at(sprite.animationId).frameIndices.at(sprite.animationFrame)); | 115 | const SpriteFrame& frame = sprite.frames.at(sprite.animations.at(sprite.animationId).frameIndices.at(sprite.animationFrame)); |
116 | const SDL_Rect& src = frame.srcRect; | 116 | const SDL_Rect& src = frame.srcRect; |
117 | SDL_Rect dest { sprite.loc.x() - frame.center.x(), sprite.loc.y() - frame.center.y(), frame.size.w(), frame.size.h() }; | 117 | SDL_Rect dest { sprite.loc.x() - frame.center.x(), sprite.loc.y() - frame.center.y(), frame.size.w(), frame.size.h() }; |
118 | if (sprite.bobbing) { | ||
119 | dest.y -= sprite.bobAmount; | ||
120 | } | ||
118 | SDL_RenderCopy(ren_.get(), textures_.at(loadImageFromFile(sprite.spritesheet)).get(), &src, &dest); | 121 | SDL_RenderCopy(ren_.get(), textures_.at(loadImageFromFile(sprite.spritesheet)).get(), &src, &dest); |
119 | } | 122 | } |
120 | } | 123 | } |
diff --git a/src/script_system.cpp b/src/script_system.cpp index 92e6afe..e218969 100644 --- a/src/script_system.cpp +++ b/src/script_system.cpp | |||
@@ -40,7 +40,8 @@ ScriptSystem::ScriptSystem(Game& game) : game_(game) { | |||
40 | "persistent", &Sprite::persistent, | 40 | "persistent", &Sprite::persistent, |
41 | "paused", &Sprite::paused, | 41 | "paused", &Sprite::paused, |
42 | "clipping", &Sprite::clipping, | 42 | "clipping", &Sprite::clipping, |
43 | "cantCrouch", &Sprite::cantCrouch); | 43 | "cantCrouch", &Sprite::cantCrouch, |
44 | "bobsWhenNormal", &Sprite::bobsWhenNormal); | ||
44 | 45 | ||
45 | engine_.new_usertype<MessageSystem>( | 46 | engine_.new_usertype<MessageSystem>( |
46 | "message", | 47 | "message", |
diff --git a/src/sprite.h b/src/sprite.h index 657a692..570a906 100644 --- a/src/sprite.h +++ b/src/sprite.h | |||
@@ -64,7 +64,7 @@ public: | |||
64 | std::string walkthroughScript; | 64 | std::string walkthroughScript; |
65 | std::string enclosureZone; | 65 | std::string enclosureZone; |
66 | 66 | ||
67 | // Animation | 67 | // Animation (internals) |
68 | bool isAnimated = false; | 68 | bool isAnimated = false; |
69 | std::string spritesheet; | 69 | std::string spritesheet; |
70 | Direction dir = Direction::down; | 70 | Direction dir = Direction::down; |
@@ -76,8 +76,13 @@ public: | |||
76 | std::map<std::string, std::map<Direction, int>> nameDirToAnim; | 76 | std::map<std::string, std::map<Direction, int>> nameDirToAnim; |
77 | bool animFinished = false; | 77 | bool animFinished = false; |
78 | bool hasShadow = false; | 78 | bool hasShadow = false; |
79 | int bobAmount = 0; | ||
80 | bool bobbingDown = false; | ||
81 | |||
82 | // Animation (controls) | ||
79 | bool normallyHasShadow = false; | 83 | bool normallyHasShadow = false; |
80 | bool animPaused = false; | 84 | bool animPaused = false; |
85 | bool bobbing = false; | ||
81 | 86 | ||
82 | // Character | 87 | // Character |
83 | bool orientable = false; | 88 | bool orientable = false; |
@@ -92,6 +97,7 @@ public: | |||
92 | int runningSfxChannel = -1; | 97 | int runningSfxChannel = -1; |
93 | bool clipping = false; | 98 | bool clipping = false; |
94 | bool cantCrouch = false; // Use this to prevent running | 99 | bool cantCrouch = false; // Use this to prevent running |
100 | bool bobsWhenNormal = false; // If enabled, sets the animation bobbing flag whenever medium is Normal | ||
95 | 101 | ||
96 | // Input | 102 | // Input |
97 | bool controllable = false; | 103 | bool controllable = false; |