summary refs log tree commit diff stats
path: root/src/transform_system.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2021-02-13 20:50:21 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-02-13 20:50:21 -0500
commit470b1d43fb6f8e17624ee90f87270de5bd6ff77e (patch)
tree966f1e18d496f12c3273684be299573e4bf443ec /src/transform_system.cpp
parented933607765a6e010689aaaf85184053ff6e8a2b (diff)
downloadtanetane-470b1d43fb6f8e17624ee90f87270de5bd6ff77e.tar.gz
tanetane-470b1d43fb6f8e17624ee90f87270de5bd6ff77e.tar.bz2
tanetane-470b1d43fb6f8e17624ee90f87270de5bd6ff77e.zip
Added lightning sprite to mailbox event
Sprites can be destroyed now, which really just means that their index is removed from the list of active sprites. The actual memory is not freed until all sprites are deleted on map change.

Sprite layers are introduced. All sprites by default are on layer 0 (Normal) which renders them in between the lower and upper map layers. There is also a layer 1 (Above) that renders above the upper map layer, and the sprite for the lightning strike uses this layer in order to not be hidden by the trees.

Fixed a bug where waiting for the end of a non-looping animation would trip the flag immediately upon the final frame activating, instead of waiting the length of the last frame.
Diffstat (limited to 'src/transform_system.cpp')
-rw-r--r--src/transform_system.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index e5b0363..6e04d70 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp
@@ -2,10 +2,11 @@
2#include "game.h" 2#include "game.h"
3#include "map.h" 3#include "map.h"
4 4
5void TransformSystem::initSprite(int spriteId, vec2i loc) { 5void TransformSystem::initSprite(int spriteId, vec2i loc, SpriteLayer layer) {
6 Sprite& sprite = game_.getSprite(spriteId); 6 Sprite& sprite = game_.getSprite(spriteId);
7 sprite.loc = loc; 7 sprite.loc = loc;
8 spritesByY_.emplace(loc.y(), spriteId); 8 sprite.layer = layer;
9 spritesByY_[static_cast<size_t>(layer)].emplace(loc.y(), spriteId);
9} 10}
10 11
11void TransformSystem::setUpCollision(int spriteId, vec2i offset, vec2i size, bool solid) { 12void TransformSystem::setUpCollision(int spriteId, vec2i offset, vec2i size, bool solid) {
@@ -26,11 +27,11 @@ void TransformSystem::moveSprite(int spriteId, vec2i newLoc) {
26 27
27 bool changedY = (sprite.loc.y() != newLoc.y()); 28 bool changedY = (sprite.loc.y() != newLoc.y());
28 if (changedY) { 29 if (changedY) {
29 spritesByY_.erase(std::make_tuple(sprite.loc.y(), spriteId)); 30 spritesByY_[static_cast<size_t>(sprite.layer)].erase(std::make_tuple(sprite.loc.y(), spriteId));
30 } 31 }
31 sprite.loc = newLoc; 32 sprite.loc = newLoc;
32 if (changedY) { 33 if (changedY) {
33 spritesByY_.emplace(newLoc.y(), spriteId); 34 spritesByY_[static_cast<size_t>(sprite.layer)].emplace(newLoc.y(), spriteId);
34 } 35 }
35 if (sprite.collidable) { 36 if (sprite.collidable) {
36 addCollidable(spriteId); 37 addCollidable(spriteId);
@@ -216,8 +217,19 @@ void TransformSystem::removeCollidable(int spriteId) {
216 downCollidables_.erase({ colUL.y(), spriteId }); 217 downCollidables_.erase({ colUL.y(), spriteId });
217} 218}
218 219
220void TransformSystem::destroySprite(int spriteId) {
221 Sprite& sprite = game_.getSprite(spriteId);
222 spritesByY_[static_cast<size_t>(sprite.layer)].erase(std::make_tuple(sprite.loc.y(), spriteId));
223
224 if (sprite.collidable) {
225 removeCollidable(spriteId);
226 }
227}
228
219void TransformSystem::clearSpriteCache() { 229void TransformSystem::clearSpriteCache() {
220 spritesByY_.clear(); 230 for (auto& layer : spritesByY_) {
231 layer.clear();
232 }
221 leftCollidables_.clear(); 233 leftCollidables_.clear();
222 rightCollidables_.clear(); 234 rightCollidables_.clear();
223 upCollidables_.clear(); 235 upCollidables_.clear();