raycasting/camera.cpp

68 lines
1.8 KiB
C++
Raw Normal View History

2023-04-01 07:16:14 +08:00
#include "camera.h"
#include <cmath>
#define PI 3.14159265
2023-04-02 07:41:32 +08:00
#define DEG_RAD PI/180.f
#define ROTATION_SPEED 180
#define TRANSLATIONAL_SPEED 100.f
2023-04-01 07:16:14 +08:00
static void drawLine(sf::RenderWindow* window, sf::Vector2f pos, float angle, float length, sf::Color color);
2023-04-02 07:41:32 +08:00
static void draw(Camera* camera, sf::RenderWindow* window);
static void move(Camera* camera, float t);
2023-04-01 07:16:14 +08:00
2023-04-02 07:41:32 +08:00
void camera_update(Camera* camera, sf::RenderWindow* window, float t)
2023-04-01 07:16:14 +08:00
{
if (!camera || !window) return;
2023-04-02 07:41:32 +08:00
draw(camera, window);
move(camera, t);
}
static void draw(Camera* camera, sf::RenderWindow* window)
{
const float circleRadius = 5.f;
sf::CircleShape circle(circleRadius);
circle.setPosition(camera->pos);
circle.setOrigin(circleRadius, circleRadius);
circle.setFillColor(sf::Color::Green);
2023-04-01 07:16:14 +08:00
drawLine(window, camera->pos, camera->direction, 100, sf::Color::Red);
2023-04-02 07:41:32 +08:00
window->draw(circle);
2023-04-01 07:16:14 +08:00
}
static void drawLine(sf::RenderWindow* window, sf::Vector2f pos, float angle, float length, sf::Color color)
{
if (!window) return;
2023-04-02 07:41:32 +08:00
sf::Vector2f endOffset(length * cos(angle * DEG_RAD), length * sin(angle * DEG_RAD));
2023-04-01 07:16:14 +08:00
sf::Vertex start(pos);
sf::Vertex end(pos + endOffset);
start.color = color;
end.color = color;
sf::Vertex line[] = { start, end };
window->draw(line, 2, sf::Lines);
}
2023-04-02 07:41:32 +08:00
static void move(Camera* camera, float t)
{
int forward = 0;
int rotation = 0;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::F))
forward += 1;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
forward -= 1;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::T))
rotation +=1;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::R))
rotation -=1;
float magnitude = forward * t * TRANSLATIONAL_SPEED;
sf::Vector2f offset(magnitude * cos(camera->direction * DEG_RAD), magnitude *sin(camera->direction * DEG_RAD));
camera->pos += offset;
camera->direction += rotation * t * ROTATION_SPEED;
}