diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/consts.h | 6 | ||||
-rw-r--r-- | src/input_system.cpp | 20 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/message_system.cpp | 34 | ||||
-rw-r--r-- | src/message_system.h | 42 | ||||
-rw-r--r-- | src/renderer.cpp | 30 | ||||
-rw-r--r-- | src/system.h | 3 |
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 | ||
47 | set_property(TARGET tanetane PROPERTY CXX_STANDARD 17) | 48 | set_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 | ||
4 | const int GAME_WIDTH = 640; | 4 | const int GAME_WIDTH = 720; |
5 | const int GAME_HEIGHT = 480; | 5 | const int GAME_HEIGHT = 480; |
6 | 6 | ||
7 | const int CANVAS_WIDTH = 320; | 7 | const int CANVAS_WIDTH = 240; |
8 | const int CANVAS_HEIGHT = 240; | 8 | const int CANVAS_HEIGHT = 160; |
9 | 9 | ||
10 | const int MOVEMENT_SPEED = 2; | 10 | const int MOVEMENT_SPEED = 2; |
11 | const int PARTY_FRAME_DELAY = 10;// / MOVEMENT_SPEED; | 11 | const 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 | ||
5 | struct Input { | 6 | struct 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 | ||
14 | void loop(Renderer& renderer) { | 15 | void 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 | |||
3 | void 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 | |||
17 | void MessageSystem::displayCutsceneBars() { | ||
18 | accum_ = 0.0; | ||
19 | barsState_ = BarsState::Opening; | ||
20 | } | ||
21 | |||
22 | void MessageSystem::hideCutsceneBars() { | ||
23 | accum_ = 0.0; | ||
24 | barsState_ = BarsState::Closing; | ||
25 | } | ||
26 | |||
27 | double 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 | |||
6 | class Game; | ||
7 | |||
8 | class MessageSystem : public System { | ||
9 | public: | ||
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 | |||
27 | private: | ||
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 | ||
8 | Renderer::Renderer() { | 9 | Renderer::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 | ||
12 | class System { | 13 | class System { |