Teo-CD
cad775f88e
Implement the basic raycaster, checking every block intersection and the block linked to that position. Split the screen uniformally along the width. Add data needed for camera maths in the Player class Specify constraints on the raycast parameters. Render the screen using the raycasts. Call the renderer in the main loop.
60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
//
|
|
// Created by trotfunky on 27/05/19.
|
|
//
|
|
|
|
#ifndef RAYCASTING_WORLD_H
|
|
#define RAYCASTING_WORLD_H
|
|
|
|
#include <vector>
|
|
#include <ostream>
|
|
#include <SFML/Graphics.hpp>
|
|
#include <iostream>
|
|
|
|
#include "Player.h"
|
|
|
|
enum class BlockType {
|
|
AIR,
|
|
WALL,
|
|
DOOR,
|
|
WINDOW,
|
|
};
|
|
|
|
class World {
|
|
public:
|
|
Player player;
|
|
|
|
World(int w, int h,
|
|
sf::Color groundColor = sf::Color{67, 137, 39},
|
|
sf::Color ceilingColor = sf::Color{39, 69, 137},
|
|
std::vector<BlockType> worldMap = {});
|
|
int getW() const;
|
|
int getH() const;
|
|
|
|
BlockType getBlock(float x, float y) const;
|
|
void setBlock(BlockType block, int x, int y, int width = 1, int height = 1);
|
|
|
|
void render(sf::RenderWindow&) const;
|
|
|
|
friend std::ostream& operator<<(std::ostream& ostream, World const & world);
|
|
private:
|
|
int w;
|
|
int h;
|
|
std::vector<BlockType> map;
|
|
|
|
sf::Color groundColor;
|
|
sf::Color ceilingColor;
|
|
|
|
void fillColumn(sf::RenderWindow&, int column, float scale,
|
|
sf::Color wallColor = sf::Color(84,56,34)) const;
|
|
/**
|
|
* Cast a ray from a given position and return the on-screen scale.
|
|
* @param originX Ray X origin, strictly positive
|
|
* @param originY Ray Y origin, strictly positive
|
|
* @param orientation Angle to cast to, in degrees between 0 and 360
|
|
* @return Scale on the screen of the hit wall.
|
|
*/
|
|
float castRay(float originX, float originY, float orientation) const;
|
|
};
|
|
|
|
|
|
#endif //RAYCASTING_WORLD_H
|