Exploring raycasters and possibly make a little "doom like" game based on it.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
raycaster/raycaster.hpp

65 lines
1.5 KiB

#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/System/Clock.hpp>
#include "spatialmap.hpp"
#include "levelmanager.hpp"
#include "textures.hpp"
using matrix::Matrix;
using RGBA = uint32_t;
struct Raycaster {
int $pitch=0;
sf::Clock $clock;
sf::Shader $brightness;
double $pos_x = 0;
double $pos_y = 0;
// initial direction vector
double $dir_x = 1;
double $dir_y = 0;
// the 2d raycaster version of camera plane
double $plane_x = 0;
double $plane_y = 0.66;
sf::Texture $view_texture;
sf::Sprite $view_sprite;
const uint32_t *$floor_texture = nullptr;
const uint32_t *$ceiling_texture = nullptr;
std::unique_ptr<RGBA[]> $pixels = nullptr;
int $width;
int $height;
int $screen_pos_x = RAY_VIEW_X;
int $screen_pos_y = RAY_VIEW_Y;
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
GameLevel $level;
Matrix $map;
std::vector<double> $zbuffer; // width
Raycaster(int width, int height);
void cast_rays();
void draw_ceiling_floor();
void draw_pixel_buffer();
void sprite_casting(sf::RenderTarget& target);
void render();
void draw(sf::RenderTarget& target);
void sort_sprites(std::vector<int>& order, std::vector<double>& dist, int amount);
void position_camera(float player_x, float player_y);
void set_position(int x, int y);
inline size_t pixcoord(int x, int y) {
return ((y) * $width) + (x);
}
void update_level(GameLevel level);
void update_sprite(DinkyECS::Entity ent, components::Sprite& sprite);
void init_shaders();
};