Advertisement
Guest User

Raycayst

a guest
Sep 9th, 2017
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <cmath>
  3.  
  4.  
  5. #define DEFAULT    sf::Style::Default
  6. #define FULLSCREEN sf:Style::Fullscreen
  7.  
  8. #define WIDTH  24
  9. #define HEIGHT 24
  10.  
  11. int worldMap[WIDTH][HEIGHT]={
  12.   {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  13.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  14.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  15.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  16.   {1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
  17.   {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
  18.   {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1},
  19.   {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},
  20.   {1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},
  21.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  22.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  23.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  24.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  25.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  26.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  27.   {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  28.   {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  29.   {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  30.   {1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  31.   {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  32.   {1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  33.   {1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  34.   {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  35.   {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
  36. };
  37.  
  38. int main(void){
  39.  
  40.     sf::RenderWindow window(sf::VideoMode(800, 600), "Raycast test", DEFAULT);
  41.     window.setFramerateLimit(30);
  42.    
  43.     double posX = 22, posY = 12;
  44.     double dirX = -1, dirY = 0;
  45.     double planeX = 0, planeY = 0.66;
  46.  
  47.     double time = 0;
  48.     double oldTime = 0;
  49.  
  50.  
  51.     while(window.isOpen()){
  52.         for(int x = 0; x < 800; x++){
  53.             double cameraX = 2 * x / (double)800 - 1;
  54.             double rayPosX = posX;
  55.             double rayPosY = posY;
  56.             double rayDirX = dirX + planeX * cameraX;
  57.             double rayDirY = dirY + planeY * cameraX;
  58.  
  59.             int mapX = (int)rayPosX;
  60.             int mapY = (int)rayPosY;
  61.  
  62.             double sideDistX;
  63.             double sideDistY;
  64.  
  65.             double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
  66.             double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
  67.             double perpWallDist;
  68.  
  69.             int stepX;
  70.             int stepY;
  71.  
  72.             int hit = 0;
  73.             int side;
  74.  
  75.             if(rayDirX < 0){
  76.                 stepX = -1;
  77.                 sideDistX = (rayPosX - mapX) * deltaDistX;
  78.             }else{
  79.                 stepX = 1;
  80.                 sideDistX = (mapX + 1.0 - rayPosX) * deltaDistX;
  81.             }
  82.             if(rayDirY < 0){
  83.                 stepY = -1;
  84.                 sideDistY = (rayPosY - mapY) * deltaDistY;
  85.             }else{
  86.                 stepY = 1;
  87.                 sideDistY = (mapY + 1.0 - rayPosY) * deltaDistY;
  88.             }
  89.  
  90.             while(hit == 0){
  91.                 if(sideDistX < sideDistY){
  92.                     sideDistX += deltaDistX;
  93.                     mapX += stepX;
  94.                     side = 0;
  95.                 }else{
  96.                     sideDistY += deltaDistY;
  97.                     mapY += stepY;
  98.                     side = 1;
  99.                 }
  100.  
  101.                 if (worldMap[mapX][mapY] > 0){
  102.                     hit = 1;
  103.                 }
  104.             }
  105.  
  106.             if(side == 0){
  107.                 perpWallDist = (mapX - rayPosX + (1 - stepX) / 2) /rayDirX;
  108.             }else{
  109.                 perpWallDist = (mapY - rayPosY + (1 - stepY) / 2) /rayDirY;
  110.             }
  111.  
  112.             int lineHeight = (int)(800 / perpWallDist);
  113.  
  114.             int drawStart = -lineHeight / 2 + 800 / 2;
  115.             if(drawStart < 0){
  116.                 drawStart = 0;
  117.             }
  118.             int drawEnd = lineHeight / 2 + 800 / 2;
  119.             if(drawEnd >= 800){
  120.                 drawEnd = 800 - 1;
  121.             }
  122.  
  123.             sf::Color color;
  124.             switch(worldMap[mapX][mapY]){
  125.             case 1: color = sf::Color::Red; break;
  126.             case 2: color = sf::Color::Green; break;
  127.             case 3: color = sf::Color::Blue; break;
  128.             case 4: color = sf::Color::White; break;
  129.             default: color = sf::Color::Yellow; break;
  130.             }
  131.  
  132.             sf::Vertex line[2] ={
  133.                 sf::Vertex(sf::Vector2f(x, drawStart), color),
  134.                 sf::Vertex(sf::Vector2f(x, drawEnd), color)
  135.             };
  136.  
  137.             window.draw(line, 2, sf::Lines);
  138.             window.display();
  139.         }
  140.  
  141.         sf::Event event;
  142.         while(window.pollEvent(event)){
  143.             if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){
  144.                 window.close();
  145.             }
  146.         }
  147.     }
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement