summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/consts.h6
-rw-r--r--src/input_system.cpp20
-rw-r--r--src/main.cpp2
-rw-r--r--src/message_system.cpp34
-rw-r--r--src/message_system.h42
-rw-r--r--src/renderer.cpp30
-rw-r--r--src/system.h3
8 files changed, 128 insertions, 10 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a87b017..36acd0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -42,6 +42,7 @@ add_executable(tanetane
42 src/animation_system.cpp 42 src/animation_system.cpp
43 src/character_system.cpp 43 src/character_system.cpp
44 src/input_system.cpp 44 src/input_system.cpp
45 src/message_system.cpp
45) 46)
46 47
47set_property(TARGET tanetane PROPERTY CXX_STANDARD 17) 48set_property(TARGET tanetane PROPERTY CXX_STANDARD 17)
diff --git a/src/consts.h b/src/consts.h index fcfdff2..5ef2c21 100644 --- a/src/consts.h +++ b/src/consts.h
@@ -1,11 +1,11 @@
1#ifndef CONSTS_H_9561E49C 1#ifndef CONSTS_H_9561E49C
2#define CONSTS_H_9561E49C 2#define CONSTS_H_9561E49C
3 3
4const int GAME_WIDTH = 640; 4const int GAME_WIDTH = 720;
5const int GAME_HEIGHT = 480; 5const int GAME_HEIGHT = 480;
6 6
7const int CANVAS_WIDTH = 320; 7const int CANVAS_WIDTH = 240;
8const int CANVAS_HEIGHT = 240; 8const int CANVAS_HEIGHT = 160;
9 9
10const int MOVEMENT_SPEED = 2; 10const int MOVEMENT_SPEED = 2;
11const int PARTY_FRAME_DELAY = 10;// / MOVEMENT_SPEED; 11const int PARTY_FRAME_DELAY = 10;// / MOVEMENT_SPEED;
diff --git a/src/input_system.cpp b/src/input_system.cpp index 54a291c..7bd605c 100644 --- a/src/input_system.cpp +++ b/src/input_system.cpp
@@ -1,6 +1,7 @@
1#include "input_system.h" 1#include "input_system.h"
2#include "game.h" 2#include "game.h"
3#include "character_system.h" 3#include "character_system.h"
4#include "message_system.h"
4 5
5struct Input { 6struct Input {
6 bool left = false; 7 bool left = false;
@@ -16,11 +17,20 @@ void InputSystem::tick(double dt) {
16 game_.quit(); 17 game_.quit();
17 18
18 return; 19 return;
19 } else if (e.type == SDL_KEYDOWN && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) { 20 } else if (e.type == SDL_KEYDOWN) {
20 for (int spriteId : game_.getSprites()) { 21 if (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT) {
21 Sprite& sprite = game_.getSprite(spriteId); 22 for (int spriteId : game_.getSprites()) {
22 if (sprite.controllable) { 23 Sprite& sprite = game_.getSprite(spriteId);
23 game_.getSystem<CharacterSystem>().beginCrouch(spriteId); 24 if (sprite.controllable) {
25 game_.getSystem<CharacterSystem>().beginCrouch(spriteId);
26 }
27 }
28 } else if (e.key.keysym.sym == SDLK_a) {
29 // TODO: Remove this, it's just for testing.
30 if (game_.getSystem<MessageSystem>().getCutsceneBarsProgress() == 1.0) {
31 game_.getSystem<MessageSystem>().hideCutsceneBars();
32 } else {
33 game_.getSystem<MessageSystem>().displayCutsceneBars();
24 } 34 }
25 } 35 }
26 } else if (e.type == SDL_KEYUP && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) { 36 } else if (e.type == SDL_KEYUP && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) {
diff --git a/src/main.cpp b/src/main.cpp index e5a96e4..6674c0c 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -10,6 +10,7 @@
10#include "animation_system.h" 10#include "animation_system.h"
11#include "character_system.h" 11#include "character_system.h"
12#include "input_system.h" 12#include "input_system.h"
13#include "message_system.h"
13 14
14void loop(Renderer& renderer) { 15void loop(Renderer& renderer) {
15 Game game; 16 Game game;
@@ -18,6 +19,7 @@ void loop(Renderer& renderer) {
18 game.emplaceSystem<CharacterSystem>(); 19 game.emplaceSystem<CharacterSystem>();
19 game.emplaceSystem<AnimationSystem>(); 20 game.emplaceSystem<AnimationSystem>();
20 game.emplaceSystem<CameraSystem>(); 21 game.emplaceSystem<CameraSystem>();
22 game.emplaceSystem<MessageSystem>();
21 23
22 auto map = std::make_unique<Map>("../res/map1.tmx", renderer); 24 auto map = std::make_unique<Map>("../res/map1.tmx", renderer);
23 game.setMap(std::move(map)); 25 game.setMap(std::move(map));
diff --git a/src/message_system.cpp b/src/message_system.cpp new file mode 100644 index 0000000..71e8a5a --- /dev/null +++ b/src/message_system.cpp
@@ -0,0 +1,34 @@
1#include "message_system.h"
2
3void MessageSystem::tick(double dt) {
4 if (barsState_ == BarsState::Opening || barsState_ == BarsState::Closing) {
5 accum_ += dt;
6
7 if (accum_ >= length_) {
8 if (barsState_ == BarsState::Opening) {
9 barsState_ = BarsState::Open;
10 } else {
11 barsState_ = BarsState::Closed;
12 }
13 }
14 }
15}
16
17void MessageSystem::displayCutsceneBars() {
18 accum_ = 0.0;
19 barsState_ = BarsState::Opening;
20}
21
22void MessageSystem::hideCutsceneBars() {
23 accum_ = 0.0;
24 barsState_ = BarsState::Closing;
25}
26
27double MessageSystem::getCutsceneBarsProgress() const {
28 switch (barsState_) {
29 case BarsState::Closed: return 0.0;
30 case BarsState::Opening: return accum_ / length_;
31 case BarsState::Open: return 1.0;
32 case BarsState::Closing: return 1.0 - (accum_ / length_);
33 }
34}
diff --git a/src/message_system.h b/src/message_system.h new file mode 100644 index 0000000..4dd0166 --- /dev/null +++ b/src/message_system.h
@@ -0,0 +1,42 @@
1#ifndef MESSAGE_SYSTEM_H_DE10D011
2#define MESSAGE_SYSTEM_H_DE10D011
3
4#include "system.h"
5
6class Game;
7
8class MessageSystem : public System {
9public:
10
11 static constexpr SystemKey Key = SystemKey::Message;
12
13 MessageSystem(Game& game) : game_(game) {}
14
15 void tick(double dt) override;
16
17 // Commands
18
19 void displayCutsceneBars();
20
21 void hideCutsceneBars();
22
23 // Info
24
25 double getCutsceneBarsProgress() const;
26
27private:
28
29 enum class BarsState {
30 Closed,
31 Opening,
32 Open,
33 Closing
34 };
35
36 Game& game_;
37 BarsState barsState_ = BarsState::Closed;
38 double accum_ = 0.0;
39 double length_ = 1000.0/8;
40};
41
42#endif /* end of include guard: MESSAGE_SYSTEM_H_DE10D011 */
diff --git a/src/renderer.cpp b/src/renderer.cpp index 92083db..2c6cf5c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -4,6 +4,7 @@
4#include "map.h" 4#include "map.h"
5#include "transform_system.h" 5#include "transform_system.h"
6#include "camera_system.h" 6#include "camera_system.h"
7#include "message_system.h"
7 8
8Renderer::Renderer() { 9Renderer::Renderer() {
9 win_ = window_ptr( 10 win_ = window_ptr(
@@ -127,8 +128,35 @@ void Renderer::render(Game& game) {
127 game.getSystem<CameraSystem>().getFieldOfView().h() 128 game.getSystem<CameraSystem>().getFieldOfView().h()
128 }; 129 };
129 130
130 SDL_SetRenderTarget(ren_.get(), nullptr); 131 texture_ptr cameraTex(
132 SDL_CreateTexture(
133 ren_.get(),
134 SDL_PIXELFORMAT_RGBA8888,
135 SDL_TEXTUREACCESS_TARGET,
136 CANVAS_WIDTH,
137 CANVAS_HEIGHT));
138
139 if (!cameraTex) {
140 throw sdl_error();
141 }
142
143 SDL_SetRenderTarget(ren_.get(), cameraTex.get());
131 SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr); 144 SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr);
145
146 if (game.getSystem<MessageSystem>().getCutsceneBarsProgress() > 0) {
147 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255);
148
149 int topBarHeight = 16.0 * game.getSystem<MessageSystem>().getCutsceneBarsProgress();
150 SDL_Rect topBar { 0, 0, CANVAS_WIDTH, topBarHeight };
151 SDL_RenderFillRect(ren_.get(), &topBar);
152
153 int bottomBarHeight = 36.0 * game.getSystem<MessageSystem>().getCutsceneBarsProgress();
154 SDL_Rect bottomBar { 0, CANVAS_HEIGHT - bottomBarHeight, CANVAS_WIDTH, bottomBarHeight };
155 SDL_RenderFillRect(ren_.get(), &bottomBar);
156 }
157
158 SDL_SetRenderTarget(ren_.get(), nullptr);
159 SDL_RenderCopy(ren_.get(), cameraTex.get(), nullptr, nullptr);
132 SDL_RenderPresent(ren_.get()); 160 SDL_RenderPresent(ren_.get());
133} 161}
134 162
diff --git a/src/system.h b/src/system.h index fc89503..298c5f8 100644 --- a/src/system.h +++ b/src/system.h
@@ -6,7 +6,8 @@ enum class SystemKey {
6 Input, 6 Input,
7 Character, 7 Character,
8 Animation, 8 Animation,
9 Camera 9 Camera,
10 Message
10}; 11};
11 12
12class System { 13class System {