Advertisement
Redee

Передвижение на среднюю величину (поведение странное ))))

Mar 31st, 2015
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.23 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <iostream>
  3. using namespace std;
  4. #include "SFML/Graphics.hpp"
  5. using namespace sf;
  6.  
  7.  
  8. // Перемещение на среднюю величину 2ух кадров
  9. //
  10. class ClockTme
  11. {
  12.     LARGE_INTEGER ticksBase, freq;
  13.  
  14.  
  15.     public:
  16.         Int64 getTicks()
  17.         {
  18.             QueryPerformanceCounter(&ticksBase);
  19.             return ticksBase.QuadPart;
  20.         }
  21.  
  22.         Int64 getFrequency()
  23.         {
  24.             return freq.QuadPart;
  25.         }
  26.        
  27.         ClockTme()
  28.         {
  29.             QueryPerformanceFrequency(&freq);
  30.         }
  31. };
  32.  
  33.  
  34. class FrameTme
  35. {
  36.     Int64 ticks, ticksPrev, frequency, elapsedTicks, elTmeMicrosec;
  37.     ClockTme cl;
  38.  
  39.     void setElapsedTicks()
  40.     {
  41.         if(ticks > ticksPrev)
  42.             elapsedTicks = ticks - ticksPrev;
  43.         // произошло обнуление
  44.         // произойдет примерно через 50 лет
  45.         else if(ticks < ticksPrev)
  46.             elapsedTicks = _I64_MAX - ticksPrev + ticks;
  47.     }
  48.  
  49.     void setElTmeMicrosec()
  50.     {
  51.         elTmeMicrosec = elapsedTicks * 1000000 / frequency;
  52.     }
  53.  
  54.  
  55.     public:
  56.         void updateTme()
  57.         {
  58.             ticksPrev = ticks;
  59.             ticks = cl.getTicks();
  60.             setElapsedTicks();
  61.             setElTmeMicrosec();
  62.         }
  63.  
  64.         // вызывать после обновление времени updateTme()
  65.         Int64 getElapsedTicks()
  66.         {
  67.             return elapsedTicks;
  68.         }
  69.  
  70.         // вызывать после обновление времени updateTme()
  71.         Int64 getElTmeMicrosec()
  72.         {
  73.             return elTmeMicrosec;
  74.         }
  75.  
  76.         void restartTme()
  77.         {
  78.             ticks = cl.getTicks();
  79.         }
  80.  
  81.         FrameTme()
  82.         {
  83.             frequency = cl.getFrequency();
  84.             ticks = cl.getTicks();
  85.         }
  86. };
  87.  
  88.  
  89. struct State
  90. {
  91.     float x, y;
  92. };
  93.  
  94.  
  95. class midStateSprite
  96. {
  97.    
  98.     State prevState;
  99.     State currState;
  100.  
  101.     float midX, midY, velX, velY;
  102.  
  103.     public:
  104.         Texture tx;
  105.         Sprite sp;
  106.  
  107.     midStateSprite(char* txFile, float velocityX, float velocityY)
  108.     {
  109.         tx.loadFromFile(txFile);
  110.         sp.setTexture(tx);
  111.         currState.x = sp.getPosition().x;
  112.         currState.y = sp.getPosition().y;
  113.         prevState = currState;
  114.  
  115.         velX = velocityX;
  116.         velY = velocityY;
  117.     }
  118.  
  119.     void setTexture(char* txFile)
  120.     {
  121.         tx.loadFromFile(txFile);
  122.         sp.setTexture(tx);
  123.     }
  124.  
  125.     void updateStatesAndMove(Int64 &elTmeMicros)
  126.     {
  127.         prevState = currState;
  128.         currState.x += velX * elTmeMicros;
  129.         currState.y += velY * elTmeMicros;
  130.         midX = (prevState.x + currState.x) / 2;
  131.         midY = (prevState.y + currState.y) / 2;
  132.         sp.setPosition(midX, midY);
  133.     }
  134. };
  135.  
  136.  
  137. void main()
  138. {
  139.     int wWid = 600, wHei = 500;
  140.     RenderWindow wIn(VideoMode(wWid, wHei), "My12345", Style::Default);
  141.  
  142.     FrameTme frTm;
  143.     Int64 elTmeMicros;
  144.  
  145.     midStateSprite mStSp("tree.png", 0.0001f, 0);
  146.  
  147.     frTm.restartTme();
  148.     Event ev;
  149.     while (wIn.isOpen())
  150.     {
  151.         while (wIn.pollEvent(ev))
  152.         {
  153.             // Close window : exit
  154.             if (ev.type == Event::Closed)
  155.                 wIn.close();
  156.             if (ev.type == Event::KeyPressed)
  157.             {
  158.                 if (ev.key.code == Keyboard::Escape)
  159.                     wIn.close();
  160.                 else if (ev.key.control && ev.key.code == Keyboard::C)
  161.                     wIn.close();
  162.             }
  163.         }
  164.  
  165.         wIn.clear();
  166.  
  167.         frTm.updateTme();
  168.         elTmeMicros = frTm.getElTmeMicrosec();
  169.         if(elTmeMicros > 25000)
  170.             elTmeMicros = 25000;
  171.        
  172.         mStSp.updateStatesAndMove(elTmeMicros);
  173.        
  174.         wIn.draw(mStSp.sp);
  175.         wIn.display();
  176.        
  177.         // убираю нагрузку с процессора
  178.         sleep(microseconds(1000));
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement