summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game.cpp20
-rw-r--r--src/game.h27
-rw-r--r--src/party.cpp10
-rw-r--r--src/renderer.cpp2
4 files changed, 46 insertions, 13 deletions
diff --git a/src/game.cpp b/src/game.cpp new file mode 100644 index 0000000..ccca10f --- /dev/null +++ b/src/game.cpp
@@ -0,0 +1,20 @@
1#include "game.h"
2
3int Game::addSprite(Sprite sprite) {
4 int id = sprites_.size();
5 sprites_.push_back(std::move(sprite));
6 spritesByY_.emplace(sprite.loc().y(), id);
7 return id;
8}
9
10void Game::moveSprite(int id, vec2i newLoc) {
11 Sprite& sprite = sprites_.at(id);
12 bool changedY = (sprite.loc().y() != newLoc.y());
13 if (changedY) {
14 spritesByY_.erase(std::make_tuple(sprite.loc().y(), id));
15 }
16 sprite.loc() = newLoc;
17 if (changedY) {
18 spritesByY_.emplace(newLoc.y(), id);
19 }
20} \ No newline at end of file
diff --git a/src/game.h b/src/game.h index bb99543..abb70ce 100644 --- a/src/game.h +++ b/src/game.h
@@ -1,6 +1,8 @@
1#ifndef GAME_H_E6F1396E 1#ifndef GAME_H_E6F1396E
2#define GAME_H_E6F1396E 2#define GAME_H_E6F1396E
3 3
4#include <set>
5#include <range/v3/all.hpp>
4#include <vector> 6#include <vector>
5#include "sprite.h" 7#include "sprite.h"
6 8
@@ -14,23 +16,34 @@ struct Input {
14class Game { 16class Game {
15public: 17public:
16 18
17 int addSprite(Sprite sprite) { 19 int addSprite(Sprite sprite);
18 int id = sprites_.size();
19 sprites_.push_back(std::move(sprite));
20 return id;
21 }
22 20
23 Sprite& getSprite(int id) { 21 const Sprite& getSprite(int id) const {
24 return sprites_.at(id); 22 return sprites_.at(id);
25 } 23 }
26 24
27 std::vector<Sprite>& getSprites() { 25 const std::vector<Sprite>& getSprites() {
28 return sprites_; 26 return sprites_;
29 } 27 }
30 28
29 auto spriteView() const {
30 return ranges::views::transform([&] (int id) -> const Sprite& {
31 return sprites_.at(id);
32 });
33 }
34
35 auto getSpritesByY() const {
36 return spritesByY_ | ranges::views::transform([] (const std::tuple<int, int>& val) {
37 return std::get<1>(val);
38 });
39 }
40
41 void moveSprite(int id, vec2i newLoc);
42
31private: 43private:
32 44
33 std::vector<Sprite> sprites_; 45 std::vector<Sprite> sprites_;
46 std::set<std::tuple<int, int>> spritesByY_;
34}; 47};
35 48
36#endif /* end of include guard: GAME_H_E6F1396E */ 49#endif /* end of include guard: GAME_H_E6F1396E */
diff --git a/src/party.cpp b/src/party.cpp index 6c003b8..1ff4bb4 100644 --- a/src/party.cpp +++ b/src/party.cpp
@@ -8,7 +8,7 @@ void Party::addMember(Game& game, int spriteId) {
8 newMember.spriteId = spriteId; 8 newMember.spriteId = spriteId;
9 9
10 if (index > 0) { 10 if (index > 0) {
11 Sprite& sprite = game.getSprite(spriteId); 11 const Sprite& sprite = game.getSprite(spriteId);
12 12
13 for (int i = 0; i < PARTY_FRAME_DELAY * index; i++) { 13 for (int i = 0; i < PARTY_FRAME_DELAY * index; i++) {
14 newMember.nextPosition.push_back(sprite.loc()); 14 newMember.nextPosition.push_back(sprite.loc());
@@ -23,7 +23,7 @@ void Party::move(Game& game, const Input& keystate) {
23 return; 23 return;
24 } 24 }
25 25
26 Sprite& p1 = game.getSprite(members_[0].spriteId); 26 const Sprite& p1 = game.getSprite(members_[0].spriteId);
27 vec2i pLoc = p1.loc(); 27 vec2i pLoc = p1.loc();
28 28
29 if (keystate.up) 29 if (keystate.up)
@@ -47,12 +47,12 @@ void Party::move(Game& game, const Input& keystate) {
47 } 47 }
48 48
49 if (keystate.up || keystate.down || keystate.left || keystate.right) { 49 if (keystate.up || keystate.down || keystate.left || keystate.right) {
50 p1.loc() = pLoc; 50 game.moveSprite(members_[0].spriteId, pLoc);
51 51
52 for (int i = 1; i < members_.size(); i++) { 52 for (int i = 1; i < members_.size(); i++) {
53 Sprite& pNext = game.getSprite(members_[i].spriteId); 53 const Sprite& pNext = game.getSprite(members_[i].spriteId);
54 members_[i].nextPosition.push_back(pLoc); 54 members_[i].nextPosition.push_back(pLoc);
55 pNext.loc() = members_[i].nextPosition.front(); 55 game.moveSprite(members_[i].spriteId, members_[i].nextPosition.front());
56 members_[i].nextPosition.pop_front(); 56 members_[i].nextPosition.pop_front();
57 } 57 }
58 } 58 }
diff --git a/src/renderer.cpp b/src/renderer.cpp index bcc3e95..8053de0 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -48,7 +48,7 @@ void Renderer::render(Game& game) {
48 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); 48 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255);
49 SDL_RenderClear(ren_.get()); 49 SDL_RenderClear(ren_.get());
50 50
51 for (Sprite& sprite : game.getSprites()) { 51 for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) {
52 SDL_Rect dest { sprite.loc().x(), sprite.loc().y(), sprite.size().w(), sprite.size().h() }; 52 SDL_Rect dest { sprite.loc().x(), sprite.loc().y(), sprite.size().w(), sprite.size().h() };
53 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), nullptr, &dest); 53 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), nullptr, &dest);
54 } 54 }