Implement a little junk camera on its own that we can use later for movement and views.

This commit is contained in:
Zed A. Shaw 2025-02-03 11:08:17 -05:00
parent 976822ceb6
commit 48ac6603a8
5 changed files with 64 additions and 54 deletions

View file

@ -7,6 +7,7 @@
#include "stats.hpp"
#include "levelmanager.hpp"
#include "components.hpp"
#include "camera.hpp"
#include <numbers>
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) {