From 138e0a8f83e82c6109bfc387ac7417d4f41711b4 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 3 Feb 2021 21:29:52 -0500 Subject: Added cutscene bars (and resized game) --- CMakeLists.txt | 1 + src/consts.h | 6 +++--- src/input_system.cpp | 20 +++++++++++++++----- src/main.cpp | 2 ++ src/message_system.cpp | 34 ++++++++++++++++++++++++++++++++++ src/message_system.h | 42 ++++++++++++++++++++++++++++++++++++++++++ src/renderer.cpp | 30 +++++++++++++++++++++++++++++- src/system.h | 3 ++- 8 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 src/message_system.cpp create mode 100644 src/message_system.h 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 src/animation_system.cpp src/character_system.cpp src/input_system.cpp + src/message_system.cpp ) 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 @@ #ifndef CONSTS_H_9561E49C #define CONSTS_H_9561E49C -const int GAME_WIDTH = 640; +const int GAME_WIDTH = 720; const int GAME_HEIGHT = 480; -const int CANVAS_WIDTH = 320; -const int CANVAS_HEIGHT = 240; +const int CANVAS_WIDTH = 240; +const int CANVAS_HEIGHT = 160; const int MOVEMENT_SPEED = 2; 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 @@ #include "input_system.h" #include "game.h" #include "character_system.h" +#include "message_system.h" struct Input { bool left = false; @@ -16,11 +17,20 @@ void InputSystem::tick(double dt) { game_.quit(); return; - } else if (e.type == SDL_KEYDOWN && (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT)) { - for (int spriteId : game_.getSprites()) { - Sprite& sprite = game_.getSprite(spriteId); - if (sprite.controllable) { - game_.getSystem().beginCrouch(spriteId); + } else if (e.type == SDL_KEYDOWN) { + if (e.key.keysym.sym == SDLK_LSHIFT || e.key.keysym.sym == SDLK_RSHIFT) { + for (int spriteId : game_.getSprites()) { + Sprite& sprite = game_.getSprite(spriteId); + if (sprite.controllable) { + game_.getSystem().beginCrouch(spriteId); + } + } + } else if (e.key.keysym.sym == SDLK_a) { + // TODO: Remove this, it's just for testing. + if (game_.getSystem().getCutsceneBarsProgress() == 1.0) { + game_.getSystem().hideCutsceneBars(); + } else { + game_.getSystem().displayCutsceneBars(); } } } 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 @@ #include "animation_system.h" #include "character_system.h" #include "input_system.h" +#include "message_system.h" void loop(Renderer& renderer) { Game game; @@ -18,6 +19,7 @@ void loop(Renderer& renderer) { game.emplaceSystem(); game.emplaceSystem(); game.emplaceSystem(); + game.emplaceSystem(); auto map = std::make_unique("../res/map1.tmx", renderer); 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 @@ +#include "message_system.h" + +void MessageSystem::tick(double dt) { + if (barsState_ == BarsState::Opening || barsState_ == BarsState::Closing) { + accum_ += dt; + + if (accum_ >= length_) { + if (barsState_ == BarsState::Opening) { + barsState_ = BarsState::Open; + } else { + barsState_ = BarsState::Closed; + } + } + } +} + +void MessageSystem::displayCutsceneBars() { + accum_ = 0.0; + barsState_ = BarsState::Opening; +} + +void MessageSystem::hideCutsceneBars() { + accum_ = 0.0; + barsState_ = BarsState::Closing; +} + +double MessageSystem::getCutsceneBarsProgress() const { + switch (barsState_) { + case BarsState::Closed: return 0.0; + case BarsState::Opening: return accum_ / length_; + case BarsState::Open: return 1.0; + case BarsState::Closing: return 1.0 - (accum_ / length_); + } +} 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 @@ +#ifndef MESSAGE_SYSTEM_H_DE10D011 +#define MESSAGE_SYSTEM_H_DE10D011 + +#include "system.h" + +class Game; + +class MessageSystem : public System { +public: + + static constexpr SystemKey Key = SystemKey::Message; + + MessageSystem(Game& game) : game_(game) {} + + void tick(double dt) override; + + // Commands + + void displayCutsceneBars(); + + void hideCutsceneBars(); + + // Info + + double getCutsceneBarsProgress() const; + +private: + + enum class BarsState { + Closed, + Opening, + Open, + Closing + }; + + Game& game_; + BarsState barsState_ = BarsState::Closed; + double accum_ = 0.0; + double length_ = 1000.0/8; +}; + +#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 @@ #include "map.h" #include "transform_system.h" #include "camera_system.h" +#include "message_system.h" Renderer::Renderer() { win_ = window_ptr( @@ -127,8 +128,35 @@ void Renderer::render(Game& game) { game.getSystem().getFieldOfView().h() }; - SDL_SetRenderTarget(ren_.get(), nullptr); + texture_ptr cameraTex( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + CANVAS_WIDTH, + CANVAS_HEIGHT)); + + if (!cameraTex) { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), cameraTex.get()); SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr); + + if (game.getSystem().getCutsceneBarsProgress() > 0) { + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + + int topBarHeight = 16.0 * game.getSystem().getCutsceneBarsProgress(); + SDL_Rect topBar { 0, 0, CANVAS_WIDTH, topBarHeight }; + SDL_RenderFillRect(ren_.get(), &topBar); + + int bottomBarHeight = 36.0 * game.getSystem().getCutsceneBarsProgress(); + SDL_Rect bottomBar { 0, CANVAS_HEIGHT - bottomBarHeight, CANVAS_WIDTH, bottomBarHeight }; + SDL_RenderFillRect(ren_.get(), &bottomBar); + } + + SDL_SetRenderTarget(ren_.get(), nullptr); + SDL_RenderCopy(ren_.get(), cameraTex.get(), nullptr, nullptr); SDL_RenderPresent(ren_.get()); } 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 { Input, Character, Animation, - Camera + Camera, + Message }; class System { -- cgit 1.4.1