Advertisement
bartekltg

Sztywne kulki sfml

Jun 10th, 2015
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.58 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <string>
  7. #include <set>
  8.  
  9.  
  10.  int W=800;
  11.  int H=600;
  12.  
  13. float predkosc=100;
  14. const int kulek=100;
  15. const double promien=30;
  16.  
  17. using namespace std;
  18.  
  19.  
  20. void sleep (float ms)
  21. {
  22.     sf::Clock clock; // starts the clock
  23.  
  24.     sf::Time t = clock.getElapsedTime();
  25.  
  26.     while( (clock.getElapsedTime()-t).asMilliseconds()<ms ){}
  27.  
  28. }
  29.  
  30. float mod(float a,float m)
  31. {
  32.    
  33.     while (a>m)a-=m;
  34.     while (a<0)a+=m;
  35.     return a;
  36. }
  37.  
  38. template<class T>
  39. T dot(sf::Vector2<T> a,sf::Vector2<T> b)
  40. {
  41.     return a.x*b.x+a.y*b.y;
  42. }
  43.  
  44. template<class T>
  45. T dot(sf::Vector2<T> a)
  46. {
  47.     return dot(a,a);
  48. }
  49.  
  50.  
  51. template <class T>
  52. T kw(const T a)
  53. {
  54.     return a*a;
  55. }
  56.  
  57. bool kolor_predkosciowy;
  58.  
  59.  
  60. class kulka
  61. {
  62. public:
  63.     sf::CircleShape shape;
  64.     sf::Vector2f pozycja;
  65.     sf::Vector2f predkosc;
  66.    
  67.    
  68.  
  69.     float r;
  70.     kulka()
  71.     {
  72.    
  73.         r=promien;
  74.         pozycja.x=rand()%(int)(W-r);
  75.         pozycja.y=rand()%(int)(H-r);
  76.         predkosc.x=((rand()%1000)-500)/500.0;
  77.         predkosc.y=((rand()%1000)-500)/500.0;
  78.         shape=sf::CircleShape(r);
  79.         shape.setFillColor(sf::Color::Blue);
  80.         shape.setPosition(pozycja.x,pozycja.y);
  81.     }
  82.  
  83.     void evolucja(float dt)
  84.     {
  85.         //dt=std::min(dt,(float)1);
  86.         pozycja+=predkosc*dt;
  87.         if (pozycja.y<0) predkosc.y=abs(predkosc.y);
  88.         if (pozycja.x<0) predkosc.x=abs(predkosc.x);
  89.         if (pozycja.y>H-2*r) predkosc.y=-abs(predkosc.y);
  90.         if (pozycja.x>W-2*r) predkosc.x=-abs(predkosc.x);
  91.                
  92.         if (kolor_predkosciowy)
  93.         {
  94.             double V= sqrt(dot(predkosc))/2.0+0.1;
  95.             if (V<1)
  96.             shape.setFillColor( sf::Color(255*V,250*V,100*(1-V) ));
  97.             else shape.setFillColor( sf::Color(255,255,250 ));
  98.         }
  99.  
  100.         shape.setPosition(pozycja.x,pozycja.y);
  101.     }
  102.  
  103.     bool kolizja(kulka &druga)
  104.     {
  105.         bool zaszla=false;
  106.         if (dot(pozycja-druga.pozycja)<kw(r+druga.r))
  107.         {
  108.             zaszla=true;       
  109.  
  110.             sf::Vector2< float > normalna = pozycja-druga.pozycja;
  111.             normalna = normalna / sqrt(dot(normalna));
  112.            
  113.             float v_zbl = dot(normalna,predkosc) - dot(normalna,druga.predkosc);
  114.             sf::Vector2f dv =  normalna* v_zbl;
  115.             if (v_zbl<0)
  116.             {
  117.                 predkosc -= dv;
  118.                 druga.predkosc += dv;
  119.             }
  120.  
  121.         }
  122.  
  123.         return zaszla;
  124.     }
  125. };
  126.  
  127.  
  128.  
  129.  
  130. int main()
  131. {
  132.     sf::ContextSettings settings;
  133.     settings.antialiasingLevel = 8;
  134.  
  135.     sf::RenderWindow window(sf::VideoMode(W, H), "SFML works!", sf::Style::Default, settings);
  136.     srand(0);
  137.     sf::CircleShape shape(50.f);
  138.     shape.setFillColor(sf::Color::Green);
  139.  
  140.     vector<kulka> kule(kulek);
  141.  
  142.     sf::Clock clock; // starts the clock
  143.  
  144.     sf::Time t = clock.getElapsedTime();
  145.     sf::Time tt;
  146.  
  147.     sf::Font font;
  148.    
  149.  
  150.     if (!font.loadFromFile("arial.ttf"))
  151.     {
  152.        window.close();
  153.     }
  154.  
  155.  
  156.     int N_pomiarow = 200;
  157.  
  158.     vector<sf::Vertex> vertices(N_pomiarow);
  159.     vector<sf::Vertex> usrednione(N_pomiarow);
  160.    
  161.     vector <long long int> zliczenia(N_pomiarow,0);
  162.     double licznik=0;
  163.     for (int ii=0;ii<N_pomiarow;ii++)
  164.     {
  165.         vertices[ii].position.x=ii*2;
  166.         vertices[ii].position.y=H-1;
  167.         usrednione[ii].position.x=ii*2;
  168.         usrednione[ii].position.y=H-1;
  169.         vertices[ii].color=sf::Color(50,50,50);
  170.     }
  171.  
  172.     while (window.isOpen())
  173.     {
  174.         sf::Event event;
  175.         while (window.pollEvent(event))
  176.         {
  177.             if (event.type == sf::Event::Closed)
  178.                 window.close();
  179.             else
  180.             if (event.type == sf::Event::Resized)
  181.             {
  182.                
  183.                 //window.setSize(   sf::Vector2u(event.size.width,event.size.height)  );
  184.                 W=event.size.width;
  185.                 H=event.size.height;
  186.                 window.setView(sf::View(sf::FloatRect(0.f, 0.f, event.size.width,event.size.height)));
  187.             }else
  188.             if (event.type == sf::Event::KeyPressed)
  189.             {
  190.                 if (event.key.code==sf::Keyboard::Right)
  191.                 {
  192.                     predkosc=1.2*predkosc;
  193.                 }else
  194.                 if (event.key.code==sf::Keyboard::Left)
  195.                 {
  196.                     predkosc=predkosc/1.2;
  197.                 }else
  198.                 if (event.key.code==sf::Keyboard::Escape)
  199.                 {
  200.                     window.close();
  201.                 }
  202.                 if (event.key.code==sf::Keyboard::Return)
  203.                 {
  204.                     kolor_predkosciowy=true;
  205.                 }
  206.                
  207.             }
  208.            
  209.  
  210.    
  211.         }
  212.  
  213.         window.clear();
  214.  
  215.  
  216.         //if ((clock.getElapsedTime()-t).asSeconds()>0.02)
  217.         {
  218.  
  219.             sort(kule.begin(),kule.end(),[](kulka&a,kulka&b){return (a.pozycja.x<b.pozycja.x);});
  220.  
  221.             /*struct comp
  222.             {
  223.                 bool operator ()(kulka*a,kulka*b)
  224.                 {
  225.                     return make_pair(a->pozycja.y,a->pozycja.x) < make_pair(b->pozycja.y,b->pozycja.x);
  226.                 }
  227.             };*/
  228.  
  229.  
  230.  
  231.             for (auto it=kule.begin();it!=kule.end();++it)
  232.             {
  233.                     it->evolucja((clock.getElapsedTime()-t).asSeconds()*predkosc);
  234.  
  235.                     for (auto itt=it+1; (itt!=kule.end()) && abs(itt->pozycja.x - it->pozycja.x)<=itt->r+it->r;++itt)
  236.                     {
  237.                         it->kolizja(*itt);
  238.                     }
  239.                     //sleep(300);
  240.             }
  241.             t=clock.getElapsedTime();
  242.         }
  243.  
  244.  
  245.  
  246.         for (auto it=kule.begin();it!=kule.end();++it)
  247.         {
  248.             window.draw(it->shape);
  249.         }
  250.        
  251.  
  252.        
  253.        
  254.         for (auto it=kule.begin();it!=kule.end();++it)
  255.         {
  256.             int przedzial =sqrt(dot(it->predkosc))*50;
  257.             przedzial = min(przedzial,N_pomiarow);
  258.             zliczenia[przedzial]++;
  259.         }
  260.  
  261.  
  262.         for (int ii=0;ii<N_pomiarow;ii++)
  263.         {
  264.             usrednione[ii].position.y= H-20000.0*zliczenia[ii]/licznik/kule.size();
  265.         }
  266.         licznik+=1;
  267.  
  268.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
  269.         {
  270.             kolor_predkosciowy=false;
  271.             for_each(kule.begin(),kule.end(), [=](kulka&k)
  272.                 {
  273.                     if (k.pozycja.x>W/2)
  274.                     {
  275.                         if (k.pozycja.y>H/2)
  276.                         {
  277.                             k.shape.setFillColor(sf::Color::Blue);
  278.                         }else
  279.                         {
  280.                             k.shape.setFillColor(sf::Color::Red);
  281.                         };
  282.                     }else
  283.                     {
  284.                         if (k.pozycja.y>H/2)
  285.                         {
  286.                             k.shape.setFillColor(sf::Color::Magenta);
  287.                         }else
  288.                         {
  289.                             k.shape.setFillColor(sf::Color::Green);
  290.                         };
  291.                     }
  292.  
  293.                 });
  294.  
  295.         }
  296.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::B))
  297.         {
  298.             for_each(kule.begin(),kule.end(), [](kulka&k)
  299.                 {
  300.                         k.shape.setFillColor(sf::Color::Blue);
  301.                 });
  302.             kolor_predkosciowy=false;
  303.         }
  304.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Y))
  305.         {
  306.             for_each(kule.begin(),kule.end(), [](kulka&k)
  307.                 {
  308.                         k.shape.setFillColor(sf::Color::Yellow);
  309.                 });
  310.             kolor_predkosciowy=false;
  311.         }
  312.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::G))
  313.         {
  314.             for_each(kule.begin(),kule.end(), [](kulka&k)
  315.                 {
  316.                         k.shape.setFillColor(sf::Color::Green);
  317.                 });
  318.             kolor_predkosciowy=false;
  319.         }
  320.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::R))
  321.         {
  322.             for_each(kule.begin(),kule.end(), [](kulka&k)
  323.                 {
  324.                         k.shape.setFillColor(sf::Color::Red);
  325.                 });
  326.             kolor_predkosciowy=false;
  327.         }
  328.  
  329.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Delete))
  330.         {
  331.             for (int ii=0;ii<N_pomiarow;ii++)
  332.             {
  333.                 zliczenia[ii]=0;
  334.                 licznik=0;
  335.             }
  336.         }
  337.  
  338.         int pomiar=0;;
  339.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
  340.         {
  341.             pomiar+=1;
  342.         }
  343.        
  344.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
  345.         {
  346.             pomiar+=2;
  347.         }
  348.  
  349.     //  window.draw(&vertices[0],vertices.size(),sf::LinesStrip);
  350.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::RControl) || sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))
  351.         {
  352.             window.draw(&usrednione[0],vertices.size(),sf::LinesStrip);
  353.         }
  354.         //tekst.setColor(sf::Color::White);
  355.  
  356.         wstring s = std::to_wstring(  (long double)(1./(clock.getElapsedTime()-tt).asSeconds() ));
  357.         s=  wstring(L" pr�dko�� ")+to_wstring((long double) predkosc)+ L" pomiar guzik�w " + to_wstring((long double)pomiar ) +wstring(L"  fps ")+s;
  358.         tt=clock.getElapsedTime();
  359.         sf::Text tekst;
  360.         tekst.setFont(font);
  361.         tekst.setCharacterSize(18);
  362.         tekst.setString(s.c_str());
  363.         sf::LinesStrip ;
  364.  
  365.  
  366.         tekst.setPosition(1,1);
  367.         window.draw(tekst);
  368.         window.display();
  369.         //sleep(1000);
  370.  
  371.  
  372.  
  373.     }
  374.     window.close();
  375.     return 0;
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement