From 48ac6603a8dc26cf6b943e71fea19b18c26aba09 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 3 Feb 2025 11:08:17 -0500 Subject: [PATCH] Implement a little junk camera on its own that we can use later for movement and views. --- animator.hpp | 1 - camera.cpp | 40 +++++++++++++++++++++++++++++++++++++ camera.hpp | 20 +++++++++++++++++++ main.cpp | 56 +++------------------------------------------------- meson.build | 1 + 5 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 camera.cpp create mode 100644 camera.hpp diff --git a/animator.hpp b/animator.hpp index abc1e4a..96380ca 100644 --- a/animator.hpp +++ b/animator.hpp @@ -21,6 +21,5 @@ struct Animator { } void step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h); - void play(bool sound_too=true); }; diff --git a/camera.cpp b/camera.cpp new file mode 100644 index 0000000..a091637 --- /dev/null +++ b/camera.cpp @@ -0,0 +1,40 @@ +#include "camera.hpp" +#include +#include + +void CameraLOL::plan_run(Raycaster &rayview, int dir) { + t = 0.0; + targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir); + targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir); + targetDir = dir; +} + +bool CameraLOL::play_run(Raycaster &rayview) { + t += moveSpeed; + rayview.$posX = std::lerp(rayview.$posX, targetX, t); + rayview.$posY = std::lerp(rayview.$posY, targetY, t); + return t >= 1.0; +} + +void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { + t = 0.0; + double angle_dir = std::numbers::pi * 0.5 * dir; + + targetDirX = rayview.$dirX * cos(angle_dir) - rayview.$dirY * sin(angle_dir); + targetDirY = rayview.$dirX * sin(angle_dir) + rayview.$dirY * cos(angle_dir); + + targetPlaneX = rayview.$planeX * cos(angle_dir) - rayview.$planeY * sin(angle_dir); + targetPlaneY = rayview.$planeX * sin(angle_dir) + rayview.$planeY * cos(angle_dir); + + targetDir = dir; +} + +bool CameraLOL::play_rotate(Raycaster &rayview) { + t += rotSpeed; + rayview.$dirX = std::lerp(rayview.$dirX, targetDirX, t); + rayview.$dirY = std::lerp(rayview.$dirY, targetDirY, t); + rayview.$planeX = std::lerp(rayview.$planeX, targetPlaneX, t); + rayview.$planeY = std::lerp(rayview.$planeY, targetPlaneY, t); + + return t > 1.0; +} diff --git a/camera.hpp b/camera.hpp new file mode 100644 index 0000000..a813569 --- /dev/null +++ b/camera.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "raycaster.hpp" + +struct CameraLOL { + double t = 0.0; + double moveSpeed = 0.1; + double rotSpeed = 0.1; + double targetX = 0.0; + double targetY = 0.0; + int targetDir = 0; + double targetDirX = 0.0; + double targetDirY = 0.0; + double targetPlaneX = 0.0; + double targetPlaneY = 0.0; + + void plan_run(Raycaster &rayview, int dir); + bool play_run(Raycaster &rayview); + void plan_rotate(Raycaster &rayview, int dir); + bool play_rotate(Raycaster &rayview); +}; diff --git a/main.cpp b/main.cpp index 2293a06..4258d80 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,7 @@ #include "stats.hpp" #include "levelmanager.hpp" #include "components.hpp" +#include "camera.hpp" #include using namespace components; @@ -46,57 +47,6 @@ enum MoveState { IDLE }; -struct CameraLOL { - double t = 0.0; - double moveSpeed = 0.1; - double rotSpeed = 0.1; - double targetX = 0.0; - double targetY = 0.0; - int targetDir = 0; - double targetDirX = 0.0; - double targetDirY = 0.0; - double targetPlaneX = 0.0; - double targetPlaneY = 0.0; - - void plan_run(Raycaster &rayview, int dir) { - t = 0.0; - targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir); - targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir); - targetDir = dir; - } - - bool lerp_run(Raycaster &rayview) { - t += moveSpeed; - rayview.$posX = std::lerp(rayview.$posX, targetX, t); - rayview.$posY = std::lerp(rayview.$posY, targetY, t); - return t >= 1.0; - } - - void plan_rotate(Raycaster &rayview, int dir) { - t = 0.0; - double angle_dir = std::numbers::pi * 0.5 * dir; - - targetDirX = rayview.$dirX * cos(angle_dir) - rayview.$dirY * sin(angle_dir); - targetDirY = rayview.$dirX * sin(angle_dir) + rayview.$dirY * cos(angle_dir); - - targetPlaneX = rayview.$planeX * cos(angle_dir) - rayview.$planeY * sin(angle_dir); - targetPlaneY = rayview.$planeX * sin(angle_dir) + rayview.$planeY * cos(angle_dir); - - targetDir = dir; - } - - bool lerp_rotate(Raycaster &rayview) { - t += rotSpeed; - rayview.$dirX = std::lerp(rayview.$dirX, targetDirX, t); - rayview.$dirY = std::lerp(rayview.$dirY, targetDirY, t); - rayview.$planeX = std::lerp(rayview.$planeX, targetPlaneX, t); - rayview.$planeY = std::lerp(rayview.$planeY, targetPlaneY, t); - - return t > 1.0; - } -}; - - inline void handle_window_events(sf::RenderWindow &window, Raycaster &rayview, MoveState &state, CameraLOL &camera) { @@ -188,11 +138,11 @@ int main() { if(state == IDLE) { handle_window_events(window, rayview, state, camera); } else if(state == MOVE) { - if(camera.lerp_run(rayview)) { + if(camera.play_run(rayview)) { state = IDLE; } } else if(state == ROTATE) { - if(camera.lerp_rotate(rayview)) { + if(camera.play_rotate(rayview)) { state = IDLE; } } else if(state == STRAFE) { diff --git a/meson.build b/meson.build index 58464ca..9800ea5 100644 --- a/meson.build +++ b/meson.build @@ -41,6 +41,7 @@ dependencies = [ sources = [ 'animator.cpp', + 'camera.cpp', 'combat.cpp', 'components.cpp', 'config.cpp',