Necto

raycasting

Aug 9th, 2022 (edited)
744
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. #define PI 3.14159265
  6.  
  7. int calc_size(sf::Vector2f a1, float size, std::vector<sf::RectangleShape>& walls, float angle) {
  8.  
  9.     sf::Vector2f a2;
  10.     a2.x = sin(PI * (angle - 180) / 180) * size + a1.x;
  11.     a2.y = cos(PI * angle / 180) * size + a1.y;
  12.  
  13.     float min = size;
  14.  
  15.     for (int i = 0; i < walls.size(); ++i) {
  16.         sf::Vector2f c;
  17.  
  18.         sf::Vector2f b1;
  19.         b1.x = walls[i].getPosition().x;
  20.         b1.y = walls[i].getPosition().y;
  21.  
  22.         sf::Vector2f b2;
  23.         b2.x = sin(PI * (walls[i].getRotation() - 180) / 180) * walls[i].getSize().y + b1.x;
  24.         b2.y = cos(PI * walls[i].getRotation() / 180) * walls[i].getSize().y + b1.y;
  25.  
  26.         float del = (a1.x - a2.x) * (b1.y - b2.y) - (a1.y - a2.y) * (b1.x - b2.x);
  27.  
  28.         if (del != 0) {
  29.             float t = ((a1.x - b1.x) * (b1.y - b2.y) - (a1.y - b1.y) * (b1.x - b2.x)) / del;
  30.             float u = ((a1.x - b1.x) * (a1.y - a2.y) - (a1.y - b1.y) * (a1.x - a2.x)) / del;
  31.  
  32.             if (0 < u && 0 < t && u < 1 && t < 1) {
  33.                 c.x = a1.x + t * (a2.x - a1.x);
  34.                 c.y = a1.y + t * (a2.y - a1.y);
  35.                 size = sqrt((c.x - a1.x) * (c.x - a1.x) + (c.y - a1.y) * (c.y - a1.y));
  36.                 if (size < min)
  37.                     min = size;
  38.             }
  39.         }
  40.     }
  41.  
  42.  
  43.     return min;
  44. }
  45.  
  46. void draw_walls(std::vector<sf::RectangleShape>& walls) {
  47.     sf::RectangleShape wall1(sf::Vector2f(1, 250));
  48.     wall1.setPosition(sf::Vector2f(200, 70));
  49.     wall1.setRotation(45);
  50.  
  51.     sf::RectangleShape wall2(sf::Vector2f(1, 300));
  52.     wall2.setPosition(sf::Vector2f(50, 400));
  53.     wall2.setRotation(-60);
  54.  
  55.     sf::RectangleShape wall3(sf::Vector2f(1, 400));
  56.     wall3.setPosition(sf::Vector2f(600, 250));
  57.     wall3.setRotation(70);
  58.  
  59.     walls.push_back(wall1);
  60.     walls.push_back(wall2);
  61.     walls.push_back(wall3);
  62. }
  63.  
  64. int WinMain()
  65. {
  66.     sf::ContextSettings settings;
  67.     settings.antialiasingLevel = 8;
  68.     sf::RenderWindow window(sf::VideoMode(600, 600), "", sf::Style::Default, settings);
  69.     window.setFramerateLimit(60);
  70.  
  71.     sf::Event event;
  72.     window.setMouseCursorGrabbed(true);
  73.     window.setMouseCursorVisible(false);
  74.  
  75.     std::vector<sf::RectangleShape> walls;
  76.     draw_walls(walls);
  77.  
  78.     std::vector <sf::RectangleShape> rays(180);
  79.     int temp = 360 / rays.size();
  80.     for (int i = 0; i < 360; i += temp) {
  81.         rays[i / temp].setSize(sf::Vector2f(1, 3000));
  82.         rays[i / temp].setRotation(i);
  83.     }
  84.  
  85.     while (window.isOpen()) {
  86.         while (window.pollEvent(event)) {
  87.             if (event.type == sf::Event::Closed)
  88.                 window.close();
  89.            
  90.            
  91.             sf::Vector2i temp_mouse = sf::Mouse::getPosition(window);
  92.  
  93.             for (int i = 0; i < rays.size(); ++i) {
  94.                 rays[i].setPosition(sf::Vector2f(temp_mouse.x, temp_mouse.y));
  95.                 float new_size = calc_size(rays[i].getPosition(), 3000, walls, rays[i].getRotation());
  96.                 rays[i].setSize(sf::Vector2f(1, new_size));
  97.             }
  98.         }
  99.         window.clear();
  100.  
  101.         for(int i = 0; i < walls.size();++i)
  102.             window.draw(walls[i]);
  103.  
  104.         for (int i = 0; i < rays.size(); ++i)
  105.             window.draw(rays[i]);
  106.  
  107.         window.display();
  108.     }
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment