summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/game.cpp24
-rw-r--r--src/game.h21
-rw-r--r--src/main.cpp6
-rw-r--r--src/renderer.cpp27
-rw-r--r--src/vector.h2
5 files changed, 66 insertions, 14 deletions
diff --git a/src/game.cpp b/src/game.cpp index ccca10f..ebb792e 100644 --- a/src/game.cpp +++ b/src/game.cpp
@@ -17,4 +17,26 @@ void Game::moveSprite(int id, vec2i newLoc) {
17 if (changedY) { 17 if (changedY) {
18 spritesByY_.emplace(newLoc.y(), id); 18 spritesByY_.emplace(newLoc.y(), id);
19 } 19 }
20} \ No newline at end of file 20}
21
22void Game::tick() {
23 if (!cameraLocked_) {
24 const Sprite& follow = getSprite(followingSprite_);
25 vec2i mapBounds = map_->getMapSize() * map_->getTileSize();
26
27 cameraPos_ = follow.loc() - (cameraFov_ / 2);
28
29 if (cameraPos_.x() < 0) {
30 cameraPos_.x() = 0;
31 }
32 if (cameraPos_.y() < 0) {
33 cameraPos_.y() = 0;
34 }
35 if (cameraPos_.x() + cameraFov_.w() >= mapBounds.w()) {
36 cameraPos_.x() = mapBounds.w() - cameraFov_.w() - 1;
37 }
38 if (cameraPos_.y() + cameraFov_.h() >= mapBounds.h()) {
39 cameraPos_.y() = mapBounds.h() - cameraFov_.h() - 1;
40 }
41 }
42}
diff --git a/src/game.h b/src/game.h index 2c1680a..a717d53 100644 --- a/src/game.h +++ b/src/game.h
@@ -7,6 +7,7 @@
7#include <memory> 7#include <memory>
8#include "sprite.h" 8#include "sprite.h"
9#include "map.h" 9#include "map.h"
10#include "consts.h"
10 11
11struct Input { 12struct Input {
12 bool left = false; 13 bool left = false;
@@ -60,11 +61,31 @@ public:
60 61
61 const Map& getMap() const { return *map_; } 62 const Map& getMap() const { return *map_; }
62 63
64 // Camera
65
66 const vec2i& getCameraPosition() const { return cameraPos_; }
67
68 const vec2i& getFieldOfView() const { return cameraFov_; }
69
70 void setFollowingSprite(int spriteId) { followingSprite_ = spriteId; }
71
72 void lockCamera() { cameraLocked_ = true; }
73
74 void unlockCamera() { cameraLocked_ = false; }
75
76 void tick();
77
63private: 78private:
64 79
65 std::vector<Sprite> sprites_; 80 std::vector<Sprite> sprites_;
66 std::set<std::tuple<int, int>> spritesByY_; 81 std::set<std::tuple<int, int>> spritesByY_;
67 std::unique_ptr<Map> map_; 82 std::unique_ptr<Map> map_;
83
84 // Camera
85 vec2i cameraPos_;
86 vec2i cameraFov_ { CANVAS_WIDTH, CANVAS_HEIGHT };
87 int followingSprite_;
88 bool cameraLocked_ = true;
68}; 89};
69 90
70#endif /* end of include guard: GAME_H_E6F1396E */ 91#endif /* end of include guard: GAME_H_E6F1396E */
diff --git a/src/main.cpp b/src/main.cpp index 587ae15..b3aee1a 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -26,6 +26,10 @@ void loop(Renderer& renderer) {
26 party.addMember(game, dusterSprite); 26 party.addMember(game, dusterSprite);
27 party.addMember(game, boneySprite); 27 party.addMember(game, boneySprite);
28 28
29 game.setFollowingSprite(lucasSprite);
30 game.unlockCamera();
31 game.tick();
32
29 renderer.render(game); 33 renderer.render(game);
30 34
31 Timer inputTimer(50); 35 Timer inputTimer(50);
@@ -65,6 +69,8 @@ void loop(Renderer& renderer) {
65 game.tickSpriteAnim(); 69 game.tickSpriteAnim();
66 } 70 }
67 71
72 game.tick();
73
68 renderer.render(game); 74 renderer.render(game);
69 } 75 }
70} 76}
diff --git a/src/renderer.cpp b/src/renderer.cpp index 9d20fee..03d5173 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -88,13 +88,15 @@ void Renderer::render(Game& game) {
88 renLay0_ = renderMapLayer(game.getMap(), 1); 88 renLay0_ = renderMapLayer(game.getMap(), 1);
89 } 89 }
90 90
91 vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize();
92
91 texture_ptr canvas( 93 texture_ptr canvas(
92 SDL_CreateTexture( 94 SDL_CreateTexture(
93 ren_.get(), 95 ren_.get(),
94 SDL_PIXELFORMAT_RGBA8888, 96 SDL_PIXELFORMAT_RGBA8888,
95 SDL_TEXTUREACCESS_TARGET, 97 SDL_TEXTUREACCESS_TARGET,
96 CANVAS_WIDTH, 98 mapBounds.w(),
97 CANVAS_HEIGHT)); 99 mapBounds.h()));
98 100
99 if (!canvas) { 101 if (!canvas) {
100 throw sdl_error(); 102 throw sdl_error();
@@ -105,12 +107,7 @@ void Renderer::render(Game& game) {
105 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255); 107 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 255, 255);
106 SDL_RenderClear(ren_.get()); 108 SDL_RenderClear(ren_.get());
107 109
108 vec2i mapBounds = game.getMap().getMapSize() * game.getMap().getTileSize(); 110 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr);
109
110 {
111 SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() };
112 SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, &dest);
113 }
114 111
115 for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) { 112 for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) {
116 const SpriteFrame& frame = sprite.getFrame(); 113 const SpriteFrame& frame = sprite.getFrame();
@@ -119,13 +116,17 @@ void Renderer::render(Game& game) {
119 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), &src, &dest); 116 SDL_RenderCopy(ren_.get(), textures_.at(sprite.getTextureId()).get(), &src, &dest);
120 } 117 }
121 118
122 { 119 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, nullptr);
123 SDL_Rect dest { -80, -80, mapBounds.w(), mapBounds.h() }; 120
124 SDL_RenderCopy(ren_.get(), renLay0_.get(), nullptr, &dest); 121 SDL_Rect cameraField {
125 } 122 game.getCameraPosition().x(),
123 game.getCameraPosition().y(),
124 game.getFieldOfView().w(),
125 game.getFieldOfView().h()
126 };
126 127
127 SDL_SetRenderTarget(ren_.get(), nullptr); 128 SDL_SetRenderTarget(ren_.get(), nullptr);
128 SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr); 129 SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr);
129 SDL_RenderPresent(ren_.get()); 130 SDL_RenderPresent(ren_.get());
130} 131}
131 132
diff --git a/src/vector.h b/src/vector.h index d54fdbb..8019edf 100644 --- a/src/vector.h +++ b/src/vector.h
@@ -1,6 +1,8 @@
1#ifndef VECTOR_H_5458ED71 1#ifndef VECTOR_H_5458ED71
2#define VECTOR_H_5458ED71 2#define VECTOR_H_5458ED71
3 3
4#include <tuple>
5
4template <typename T> 6template <typename T>
5class vec2 { 7class vec2 {
6public: 8public: