diff options
| -rw-r--r-- | res/pinhole.png | bin | 0 -> 5615 bytes | |||
| -rw-r--r-- | src/effect_system.cpp | 16 | ||||
| -rw-r--r-- | src/effect_system.h | 17 | ||||
| -rw-r--r-- | src/renderer.cpp | 54 | ||||
| -rw-r--r-- | src/script_system.cpp | 4 |
5 files changed, 90 insertions, 1 deletions
| diff --git a/res/pinhole.png b/res/pinhole.png new file mode 100644 index 0000000..7dc7953 --- /dev/null +++ b/res/pinhole.png | |||
| Binary files differ | |||
| diff --git a/src/effect_system.cpp b/src/effect_system.cpp index aeccebb..4dff13c 100644 --- a/src/effect_system.cpp +++ b/src/effect_system.cpp | |||
| @@ -37,6 +37,15 @@ void EffectSystem::tick(double dt) { | |||
| 37 | cameraShakeOffset_.y() = 0; | 37 | cameraShakeOffset_.y() = 0; |
| 38 | } | 38 | } |
| 39 | } | 39 | } |
| 40 | |||
| 41 | if (circleEffect_ != circleEffectDest_) { | ||
| 42 | circleEffectThus_ += dt; | ||
| 43 | if (circleEffectThus_ >= circleEffectLength_) { | ||
| 44 | circleEffectThus_ = circleEffectLength_; | ||
| 45 | } | ||
| 46 | |||
| 47 | circleEffect_ = (circleEffectDest_ - circleEffectStart_) / circleEffectLength_ * circleEffectThus_ + circleEffectStart_; | ||
| 48 | } | ||
| 40 | } | 49 | } |
| 41 | 50 | ||
| 42 | void EffectSystem::fadeScreen(int length, double amount) { | 51 | void EffectSystem::fadeScreen(int length, double amount) { |
| @@ -64,3 +73,10 @@ void EffectSystem::stopShakingCamera() { | |||
| 64 | cameraShaking_ = false; | 73 | cameraShaking_ = false; |
| 65 | cameraShakeOffset_ = { 0, 0 }; | 74 | cameraShakeOffset_ = { 0, 0 }; |
| 66 | } | 75 | } |
| 76 | |||
| 77 | void EffectSystem::circleTransition(int length, double amount) { | ||
| 78 | circleEffectStart_ = circleEffect_; | ||
| 79 | circleEffectDest_ = amount; | ||
| 80 | circleEffectLength_ = length; | ||
| 81 | circleEffectThus_ = 0; | ||
| 82 | } | ||
| diff --git a/src/effect_system.h b/src/effect_system.h index 12ec7ca..904e6cb 100644 --- a/src/effect_system.h +++ b/src/effect_system.h | |||
| @@ -34,6 +34,11 @@ public: | |||
| 34 | 34 | ||
| 35 | void stopShakingCamera(); | 35 | void stopShakingCamera(); |
| 36 | 36 | ||
| 37 | // Hides or reveals the screen using a circle transition. | ||
| 38 | // - length is the time in milliseconds | ||
| 39 | // - amount is [0,1], where 0 is fully revealed and 1 is fully hidden | ||
| 40 | void circleTransition(int length, double amount); | ||
| 41 | |||
| 37 | /* Information */ | 42 | /* Information */ |
| 38 | 43 | ||
| 39 | bool isScreenFaded() const { return screenFade_ > 0.0; } | 44 | bool isScreenFaded() const { return screenFade_ > 0.0; } |
| @@ -52,6 +57,12 @@ public: | |||
| 52 | 57 | ||
| 53 | bool isCameraShaking() const { return cameraShaking_; } | 58 | bool isCameraShaking() const { return cameraShaking_; } |
| 54 | 59 | ||
| 60 | bool isCircleTransitionActive() const { return circleEffect_ > 0.0; } | ||
| 61 | |||
| 62 | double getCircleTransitionProgress() const { return circleEffect_; } | ||
| 63 | |||
| 64 | bool isCircleTransitionComplete() const { return circleEffect_ == circleEffectDest_; } | ||
| 65 | |||
| 55 | private: | 66 | private: |
| 56 | 67 | ||
| 57 | Game& game_; | 68 | Game& game_; |
| @@ -72,6 +83,12 @@ private: | |||
| 72 | vec2i cameraShakeOffset_ { 0, 0 }; | 83 | vec2i cameraShakeOffset_ { 0, 0 }; |
| 73 | bool cameraShakeOn_ = false; | 84 | bool cameraShakeOn_ = false; |
| 74 | Timer cameraShakeTimer_ { 0 }; | 85 | Timer cameraShakeTimer_ { 0 }; |
| 86 | |||
| 87 | double circleEffect_ = 0.0; | ||
| 88 | double circleEffectDest_ = 0.0; | ||
| 89 | double circleEffectStart_ = 0.0; | ||
| 90 | double circleEffectLength_ = 0.0; | ||
| 91 | double circleEffectThus_ = 0.0; | ||
| 75 | }; | 92 | }; |
| 76 | 93 | ||
| 77 | #endif /* end of include guard: EFFECT_SYSTEM_H_0B497B39 */ | 94 | #endif /* end of include guard: EFFECT_SYSTEM_H_0B497B39 */ |
| diff --git a/src/renderer.cpp b/src/renderer.cpp index 3007378..5ab623a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
| @@ -353,6 +353,60 @@ void Renderer::render(Game& game) { | |||
| 353 | SDL_RenderFillRect(ren_.get(), nullptr); | 353 | SDL_RenderFillRect(ren_.get(), nullptr); |
| 354 | } | 354 | } |
| 355 | 355 | ||
| 356 | if (effects.isCircleTransitionActive()) { | ||
| 357 | if (effects.getCircleTransitionProgress() == 1.0) { | ||
| 358 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | ||
| 359 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | ||
| 360 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
| 361 | SDL_RenderClear(ren_.get()); | ||
| 362 | } else { | ||
| 363 | texture_ptr circleEffectTex( | ||
| 364 | SDL_CreateTexture( | ||
| 365 | ren_.get(), | ||
| 366 | SDL_PIXELFORMAT_RGBA8888, | ||
| 367 | SDL_TEXTUREACCESS_TARGET, | ||
| 368 | CANVAS_WIDTH, | ||
| 369 | CANVAS_HEIGHT)); | ||
| 370 | |||
| 371 | if (!circleEffectTex) { | ||
| 372 | throw sdl_error(); | ||
| 373 | } | ||
| 374 | |||
| 375 | SDL_SetRenderTarget(ren_.get(), circleEffectTex.get()); | ||
| 376 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | ||
| 377 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
| 378 | SDL_RenderClear(ren_.get()); | ||
| 379 | |||
| 380 | int circleDiameter = 290 * (1.0 - effects.getCircleTransitionProgress()); | ||
| 381 | SDL_Rect circleSize { | ||
| 382 | CANVAS_WIDTH / 2 - circleDiameter / 2, | ||
| 383 | CANVAS_HEIGHT / 2 - circleDiameter / 2, | ||
| 384 | circleDiameter, | ||
| 385 | circleDiameter | ||
| 386 | }; | ||
| 387 | |||
| 388 | SDL_Rect copyFromCamera = circleSize; | ||
| 389 | if (circleDiameter > CANVAS_WIDTH) { | ||
| 390 | copyFromCamera.x = 0; | ||
| 391 | copyFromCamera.w = CANVAS_WIDTH; | ||
| 392 | } | ||
| 393 | if (circleDiameter > CANVAS_HEIGHT) { | ||
| 394 | copyFromCamera.y = 0; | ||
| 395 | copyFromCamera.h = CANVAS_HEIGHT; | ||
| 396 | } | ||
| 397 | |||
| 398 | SDL_RenderCopy(ren_.get(), cameraTex.get(), ©FromCamera, ©FromCamera); | ||
| 399 | |||
| 400 | int pinholeTexId = loadImageFromFile("../res/pinhole.png"); | ||
| 401 | SDL_SetTextureBlendMode(textures_[pinholeTexId].get(), SDL_BLENDMODE_MOD); | ||
| 402 | SDL_RenderCopy(ren_.get(), textures_[pinholeTexId].get(), nullptr, &circleSize); | ||
| 403 | |||
| 404 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | ||
| 405 | SDL_SetTextureBlendMode(circleEffectTex.get(), SDL_BLENDMODE_NONE); | ||
| 406 | SDL_RenderCopy(ren_.get(), circleEffectTex.get(), nullptr, nullptr); | ||
| 407 | } | ||
| 408 | } | ||
| 409 | |||
| 356 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { | 410 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { |
| 357 | // Not sure why I'm supposed to copy the cached texture to the screen | 411 | // Not sure why I'm supposed to copy the cached texture to the screen |
| 358 | // BEFORE rendering it, but we get flickering if we don't, so. | 412 | // BEFORE rendering it, but we get flickering if we don't, so. |
| diff --git a/src/script_system.cpp b/src/script_system.cpp index a3686b4..3325b79 100644 --- a/src/script_system.cpp +++ b/src/script_system.cpp | |||
| @@ -89,7 +89,9 @@ ScriptSystem::ScriptSystem(Game& game) : game_(game) { | |||
| 89 | "fadeMap", &EffectSystem::fadeMap, | 89 | "fadeMap", &EffectSystem::fadeMap, |
| 90 | "isMapFadeComplete", &EffectSystem::isMapFadeComplete, | 90 | "isMapFadeComplete", &EffectSystem::isMapFadeComplete, |
| 91 | "shakeCamera", &EffectSystem::shakeCamera, | 91 | "shakeCamera", &EffectSystem::shakeCamera, |
| 92 | "stopShakingCamera", &EffectSystem::stopShakingCamera); | 92 | "stopShakingCamera", &EffectSystem::stopShakingCamera, |
| 93 | "circleTransition", &EffectSystem::circleTransition, | ||
| 94 | "isCircleTransitionComplete", &EffectSystem::isCircleTransitionComplete); | ||
| 93 | 95 | ||
| 94 | engine_.new_usertype<CameraSystem>( | 96 | engine_.new_usertype<CameraSystem>( |
| 95 | "camera", | 97 | "camera", |
