Advertisement
Guest User

Untitled

a guest
May 28th, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <SFML/Graphics.hpp>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. sf::Clock g_Clock;
  7. float     g_LastTime = 0.0f;
  8. float     g_Delta = 0.0f;
  9. sf::RenderWindow* window;
  10.  
  11. float worldHeight = 640.0f;
  12.  
  13. sf::Vector2f pPos(300, 350);
  14. sf::Vector2f pVel(0,0);
  15.  
  16. bool world[10][10] = { {1,1,1,1,1,1,1,1,1,1},
  17.                        {1,0,1,0,0,0,0,0,0,1},
  18.                        {1,0,1,0,0,0,0,0,0,1},
  19.                        {1,0,0,0,0,0,0,0,0,1},
  20.                        {1,0,0,0,0,0,0,0,0,1},
  21.                        {1,0,0,0,0,0,0,1,1,1},
  22.                        {1,0,0,0,0,1,1,1,1,1},
  23.                        {1,0,0,0,0,0,0,0,0,1},
  24.                        {1,0,0,0,0,0,0,0,0,1},
  25.                        {1,1,1,1,1,1,1,1,1,1}};
  26.  
  27. bool blockIsSolid(int x, int y)
  28. {
  29.     x = min(x, 9); x = max(x, 0);
  30.     y = min(y, 9); y = max(y, 0);
  31.     return world[y][x];
  32. }
  33.  
  34. float length(sf::Vector2f vec)
  35. {
  36.     return sqrt(vec.x*vec.x+vec.y*vec.y);
  37. }
  38.  
  39. void drawPoint(sf::Vector2f& coord)
  40. {
  41.     sf::RectangleShape As = sf::RectangleShape(sf::Vector2f(4.0f,4.0f));
  42.     As.setOrigin(sf::Vector2f(2.0f,2.0f));
  43.     As.setPosition(coord.x, coord.y);
  44.     window->draw(As);
  45. }
  46.  
  47. void updatePlayer()
  48. {
  49.     float koef = max(500.0f/length(pVel),1.5f);
  50.     sf::Vector2f delta = pVel*koef*g_Delta;
  51.     sf::Vector2f points[6];
  52.     points[0] = pPos + sf::Vector2f(-28.0f,-58.0f);
  53.     points[1] = pPos + sf::Vector2f(-28.0f,  0.0f);
  54.     points[2] = pPos + sf::Vector2f(-28.0f,+58.0f);
  55.     points[3] = pPos + sf::Vector2f(+28.0f,+58.0f);
  56.     points[4] = pPos + sf::Vector2f(+28.0f,  0.0f);
  57.     points[5] = pPos + sf::Vector2f(+28.0f,-58.0f);
  58.  
  59.     for(int i=0; i<6; i++)
  60.     {
  61.         if(delta.x>0)
  62.         {
  63.             if(delta.y>0)
  64.             {
  65.                 if(i<2)
  66.                     continue;
  67.             } else
  68.             if(delta.y<0)
  69.             {
  70.                 if(i<3 && i!=0)
  71.                     continue;
  72.             } else
  73.             {
  74.                 if(i<3)
  75.                     continue;
  76.             }
  77.         } else
  78.         if(delta.x<0)
  79.         {
  80.             if(delta.y>0)
  81.             {
  82.                 if(i>3)
  83.                     continue;
  84.             } else
  85.             if(delta.y<0)
  86.             {
  87.                 if(i>2 && i!=5)
  88.                     continue;
  89.             } else
  90.             {
  91.                 if(i>2)
  92.                     continue;
  93.             }
  94.         } else
  95.         {
  96.             if(delta.y>0)
  97.             {
  98.                 if(i!=2 && i!=3)
  99.                     continue;
  100.             } else
  101.             if(delta.y<0)
  102.             {
  103.                 if(i!=0 && i!=5)
  104.                     continue;
  105.             } else
  106.             {
  107.                 return;
  108.             }
  109.         }
  110.         sf::Vector2f &point = points[i];
  111.  
  112.         int hLoop = ((int)delta.y)/64;
  113.         int vLoop = ((int)delta.x)/64;
  114.  
  115.         float tanAlpha = (delta.y!=0.0f?delta.x/delta.y:0.0f);
  116.  
  117.         float dDist = length(delta);
  118.         float sDist = dDist*2.0f;
  119.  
  120.         //HORIZONTAL INTERSECTION
  121.         if(delta.y!=0.0f)
  122.         {
  123.             sf::Vector2f A;
  124.             A.y = (((int)point.y)/64)*64.0f + (delta.y>0?64.0f:-1.0f);
  125.             A.x = point.x - (point.y - A.y)*tanAlpha;
  126.             sf::Vector2f D;
  127.             D.y = (delta.y>0?64.0f:-64.0f);
  128.             D.x = (delta.y>0?64.0f:-64.0f)*tanAlpha;
  129.  
  130.             do
  131.             {
  132.                 int cX, cY;
  133.                 cX = ((int)A.x)/64;
  134.                 cY = ((int)A.y)/64;
  135.                 if(blockIsSolid(cX, cY))
  136.                 {
  137.                     sDist = min(sDist, length(A-point));
  138.                     break;
  139.                 }
  140.                 A += D;
  141.             } while(hLoop--);
  142.         }
  143.  
  144.         //VERTICAL INTERSECTION
  145.         if(delta.x!=0.0f)
  146.         {
  147.             sf::Vector2f A;
  148.             A.x = (((int)point.x)/64)*64 + (delta.x>0?64.0f:-1.0f);
  149.             A.y = (tanAlpha!=0.0f?point.y + (A.x - point.x)/tanAlpha:point.y);
  150.             sf::Vector2f D;
  151.             D.x = (delta.x>0?64.0f:-64.0f);
  152.             D.y = (tanAlpha!=0.0f?(delta.x>0?64.0f:-64.0f)/tanAlpha:0.0f);
  153.  
  154.             do
  155.             {
  156.                 int cX, cY;
  157.                 cX = ((int)A.x)/64;
  158.                 cY = ((int)A.y)/64;
  159.                 if(blockIsSolid(cX, cY))
  160.                 {
  161.                     sDist = min(sDist, length(A-point));
  162.                     break;
  163.                 }
  164.                 A += D;
  165.             } while(vLoop--);
  166.         }
  167.  
  168.         if(sDist < dDist)
  169.         {
  170.             if(pVel.x != 0.0f && pVel.y != 0.0f)
  171.             {
  172.                 sf::Vector2f oldVel = pVel;
  173.                 pVel.y = 0.0f;
  174.                 updatePlayer();
  175.                 pVel = oldVel;
  176.                 pVel.x = 0.0f;
  177.                 updatePlayer();
  178.             }
  179.             return;
  180.         }
  181.  
  182.     }
  183.  
  184.     pPos += delta/koef;
  185.     return;
  186. }
  187.  
  188. void renWorld()
  189. {
  190.     for(int i=9; i>=0; i--)
  191.     {
  192.         for(int j=0; j<10; j++)
  193.         {
  194.             if(world[i][j])
  195.             {
  196.                 sf::RectangleShape rect = sf::RectangleShape(sf::Vector2f(64.0f, 64.0f));
  197.                 rect.setPosition(j*64, i*64);
  198.                 rect.setFillColor(sf::Color(255*(j+1)/10.0, 255*(i+1)/10.0, 0, 128));
  199.                 window->draw(rect);
  200.             }
  201.         }
  202.     }
  203. }
  204.  
  205. void renPlayer()
  206. {
  207.     sf::RectangleShape prect = sf::RectangleShape(sf::Vector2f(64.0f, 128.0f));
  208.     prect.setOrigin(32.0f, 64.0f);
  209.     prect.setPosition(pPos.x, pPos.y);
  210.     prect.setFillColor(sf::Color(255,255,255,128));
  211.     window->draw(prect);
  212. }
  213.  
  214. int main()
  215. {
  216.     window = new sf::RenderWindow(sf::VideoMode(640, 640), "test", sf::Style::Default & ~sf::Style::Resize);
  217.     window->setActive();
  218.     g_Clock.restart();
  219.     float speed = 100.0f;
  220.     while (window->isOpen())
  221.     {
  222.         sf::Event event;
  223.         while (window->pollEvent(event))
  224.         {
  225.             switch(event.type)
  226.             {
  227.                 case sf::Event::Closed:
  228.                     {
  229.                         window->close();
  230.                         break;
  231.                     }
  232.                 case sf::Event::KeyReleased:
  233.                     {
  234.                         if(event.key.code == sf::Keyboard::E)
  235.                         {
  236.                             speed += 20.0f;
  237.                         } else
  238.                         if(event.key.code == sf::Keyboard::R)
  239.                         {
  240.                             speed -= 20.0f;
  241.                         }
  242.                     }
  243.                 default: break;
  244.             }
  245.         }
  246.  
  247.         if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
  248.         {
  249.             pVel.y = -speed;
  250.         } else
  251.         {
  252.             pVel.y = speed;
  253.         }
  254.  
  255.         if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
  256.         {
  257.             pVel.x = speed;
  258.         } else
  259.         if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
  260.         {
  261.             pVel.x = -speed;
  262.         } else
  263.         {
  264.             pVel.x = 0.0f;
  265.         }
  266.  
  267.         float currTime = g_Clock.getElapsedTime().asSeconds();
  268.         g_Delta = currTime - g_LastTime;
  269.         g_LastTime = currTime;
  270.  
  271.         window->clear();
  272.         updatePlayer();
  273.         renWorld();
  274.         renPlayer();
  275.         window->display();
  276.         sf::sleep(sf::milliseconds(16));
  277.     }
  278.     delete window;
  279.     window = nullptr;
  280.     return EXIT_SUCCESS;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement