diff options
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 75 |
1 files changed, 27 insertions, 48 deletions
diff --git a/src/game.cpp b/src/game.cpp index b7ca869..ffa52cf 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
@@ -5,9 +5,19 @@ | |||
5 | #include "camera_system.h" | 5 | #include "camera_system.h" |
6 | 6 | ||
7 | int Game::emplaceSprite(std::string alias) { | 7 | int Game::emplaceSprite(std::string alias) { |
8 | int id = sprites_.size(); | 8 | int id; |
9 | sprites_.emplace_back(); | 9 | |
10 | sprites_.back().alias = alias; | 10 | if (idsToReuse_.empty()) { |
11 | id = sprites_.size(); | ||
12 | sprites_.emplace_back(); | ||
13 | sprites_.back().alias = alias; | ||
14 | } else { | ||
15 | id = idsToReuse_.front(); | ||
16 | idsToReuse_.pop_front(); | ||
17 | sprites_[id] = Sprite(); | ||
18 | sprites_[id].alias = alias; | ||
19 | } | ||
20 | |||
11 | spriteIds_.insert(id); | 21 | spriteIds_.insert(id); |
12 | spritesByAlias_[alias] = id; | 22 | spritesByAlias_[alias] = id; |
13 | return id; | 23 | return id; |
@@ -19,56 +29,28 @@ void Game::destroySprite(int id) { | |||
19 | } | 29 | } |
20 | 30 | ||
21 | spriteIds_.erase(id); | 31 | spriteIds_.erase(id); |
32 | idsToReuse_.push_back(id); | ||
22 | spritesByAlias_.erase(sprites_.at(id).alias); | 33 | spritesByAlias_.erase(sprites_.at(id).alias); |
23 | } | 34 | } |
24 | 35 | ||
25 | void Game::clearSprites() { | 36 | void Game::loadMap(std::string filename) { |
26 | for (std::unique_ptr<System>& system : systems_) { | 37 | // Clear out non-persistent sprites. |
27 | system->clearSpriteCache(); | 38 | std::list<int> spritesToDelete; |
28 | } | 39 | for (int spriteId : spriteIds_) { |
40 | Sprite& sprite = sprites_.at(spriteId); | ||
29 | 41 | ||
30 | sprites_.clear(); | 42 | if (!sprite.persistent) { |
31 | spriteIds_.clear(); | 43 | spritesToDelete.push_back(spriteId); |
32 | spritesByAlias_.clear(); | 44 | } |
33 | } | 45 | } |
34 | 46 | ||
35 | void Game::loadMap(std::string filename, std::string warpPoint, Direction dir) { | 47 | for (int spriteId : spritesToDelete) { |
36 | clearSprites(); | 48 | destroySprite(spriteId); |
49 | } | ||
37 | 50 | ||
51 | // Load the new map. | ||
38 | map_ = std::make_unique<Map>(filename); | 52 | map_ = std::make_unique<Map>(filename); |
39 | 53 | ||
40 | vec2i warpLoc = map_->getWarpPoint(warpPoint); | ||
41 | |||
42 | int lucasSprite = emplaceSprite("lucas"); | ||
43 | getSystem<TransformSystem>().initSprite(lucasSprite, warpLoc); | ||
44 | getSystem<TransformSystem>().setUpCollision(lucasSprite, {-8, -8}, {12, 8}, true); | ||
45 | getSystem<AnimationSystem>().initSprite(lucasSprite, "../res/sprites/lucas_anim.txt"); | ||
46 | getSystem<AnimationSystem>().setSpriteDirection(lucasSprite, dir); | ||
47 | getSprite(lucasSprite).hasShadow = true; | ||
48 | getSprite(lucasSprite).player = true; | ||
49 | getSystem<CharacterSystem>().initSprite(lucasSprite); | ||
50 | |||
51 | int kumaSprite = emplaceSprite("kuma"); | ||
52 | getSystem<TransformSystem>().initSprite(kumaSprite, warpLoc); | ||
53 | getSystem<AnimationSystem>().initSprite(kumaSprite, "../res/sprites/kuma_anim.txt"); | ||
54 | getSystem<AnimationSystem>().setSpriteDirection(kumaSprite, dir); | ||
55 | getSprite(kumaSprite).hasShadow = true; | ||
56 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, kumaSprite); | ||
57 | |||
58 | int dusterSprite = emplaceSprite("duster"); | ||
59 | getSystem<TransformSystem>().initSprite(dusterSprite, warpLoc); | ||
60 | getSystem<AnimationSystem>().initSprite(dusterSprite, "../res/sprites/duster_anim.txt"); | ||
61 | getSystem<AnimationSystem>().setSpriteDirection(dusterSprite, dir); | ||
62 | getSprite(dusterSprite).hasShadow = true; | ||
63 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, dusterSprite); | ||
64 | |||
65 | int boneySprite = emplaceSprite("boney"); | ||
66 | getSystem<TransformSystem>().initSprite(boneySprite, warpLoc); | ||
67 | getSystem<AnimationSystem>().initSprite(boneySprite, "../res/sprites/boney_anim.txt"); | ||
68 | getSystem<AnimationSystem>().setSpriteDirection(boneySprite, dir); | ||
69 | getSprite(boneySprite).hasShadow = true; | ||
70 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, boneySprite); | ||
71 | |||
72 | for (const Prototype& p : map_->getPrototypes()) { | 54 | for (const Prototype& p : map_->getPrototypes()) { |
73 | int spriteId = emplaceSprite(p.name); | 55 | int spriteId = emplaceSprite(p.name); |
74 | getSystem<TransformSystem>().initSprite(spriteId, p.pos); | 56 | getSystem<TransformSystem>().initSprite(spriteId, p.pos); |
@@ -86,7 +68,4 @@ void Game::loadMap(std::string filename, std::string warpPoint, Direction dir) { | |||
86 | getSystem<TransformSystem>().setUpCollision(spriteId, {0, 0}, t.size, false); | 68 | getSystem<TransformSystem>().setUpCollision(spriteId, {0, 0}, t.size, false); |
87 | getSprite(spriteId).walkthroughScript = t.script; | 69 | getSprite(spriteId).walkthroughScript = t.script; |
88 | } | 70 | } |
89 | |||
90 | getSystem<CameraSystem>().setFollowingSprite(lucasSprite); | ||
91 | getSystem<CameraSystem>().unlockCamera(); | ||
92 | } | 71 | } |