Implement a little junk camera on its own that we can use later for movement and views.
This commit is contained in:
parent
976822ceb6
commit
48ac6603a8
5 changed files with 64 additions and 54 deletions
|
@ -21,6 +21,5 @@ struct Animator {
|
||||||
}
|
}
|
||||||
|
|
||||||
void step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h);
|
void step(sf::Sprite& sprite, int rect_x, int rect_y, int rect_w, int rect_h);
|
||||||
|
|
||||||
void play(bool sound_too=true);
|
void play(bool sound_too=true);
|
||||||
};
|
};
|
||||||
|
|
40
camera.cpp
Normal file
40
camera.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include "camera.hpp"
|
||||||
|
#include <numbers>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
20
camera.hpp
Normal file
20
camera.hpp
Normal file
|
@ -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);
|
||||||
|
};
|
56
main.cpp
56
main.cpp
|
@ -7,6 +7,7 @@
|
||||||
#include "stats.hpp"
|
#include "stats.hpp"
|
||||||
#include "levelmanager.hpp"
|
#include "levelmanager.hpp"
|
||||||
#include "components.hpp"
|
#include "components.hpp"
|
||||||
|
#include "camera.hpp"
|
||||||
#include <numbers>
|
#include <numbers>
|
||||||
|
|
||||||
using namespace components;
|
using namespace components;
|
||||||
|
@ -46,57 +47,6 @@ enum MoveState {
|
||||||
IDLE
|
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,
|
inline void handle_window_events(sf::RenderWindow &window, Raycaster &rayview,
|
||||||
MoveState &state, CameraLOL &camera)
|
MoveState &state, CameraLOL &camera)
|
||||||
{
|
{
|
||||||
|
@ -188,11 +138,11 @@ int main() {
|
||||||
if(state == IDLE) {
|
if(state == IDLE) {
|
||||||
handle_window_events(window, rayview, state, camera);
|
handle_window_events(window, rayview, state, camera);
|
||||||
} else if(state == MOVE) {
|
} else if(state == MOVE) {
|
||||||
if(camera.lerp_run(rayview)) {
|
if(camera.play_run(rayview)) {
|
||||||
state = IDLE;
|
state = IDLE;
|
||||||
}
|
}
|
||||||
} else if(state == ROTATE) {
|
} else if(state == ROTATE) {
|
||||||
if(camera.lerp_rotate(rayview)) {
|
if(camera.play_rotate(rayview)) {
|
||||||
state = IDLE;
|
state = IDLE;
|
||||||
}
|
}
|
||||||
} else if(state == STRAFE) {
|
} else if(state == STRAFE) {
|
||||||
|
|
|
@ -41,6 +41,7 @@ dependencies = [
|
||||||
|
|
||||||
sources = [
|
sources = [
|
||||||
'animator.cpp',
|
'animator.cpp',
|
||||||
|
'camera.cpp',
|
||||||
'combat.cpp',
|
'combat.cpp',
|
||||||
'components.cpp',
|
'components.cpp',
|
||||||
'config.cpp',
|
'config.cpp',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue