Advertisement
Guest User

SFML Question

a guest
Nov 13th, 2015
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.66 KB | None | 0 0
  1. #include <SFML\Graphics.hpp>
  2. #include <sstream>
  3. #include <string>
  4. #include <list>
  5. using namespace std;
  6.  
  7. sf::Sprite        pPaddleL;
  8. sf::Sprite        pPaddleR;
  9. sf::Sprite        pBall;
  10. sf::Sprite        pParticle;
  11. sf::Texture       pPaddle;
  12. sf::Texture       pBallText;
  13. sf::Clock         pClock;
  14. sf::Clock         pMessage;
  15. sf::Font          pFont;
  16. sf::Text          pPText;
  17. sf::Text          pGame;
  18. sf::Text          pMess;
  19. sf::Text          pPETS;
  20. sf::Text          pPaused;
  21. stringstream      pSs;
  22.  
  23. sf::Keyboard::Key   HOTKEY_EXIT;
  24. sf::Keyboard::Key   HOTKEY_UP;
  25. sf::Keyboard::Key   HOTKEY_DOWN;
  26. sf::Keyboard::Key   HOTKEY_START;
  27. sf::Keyboard::Key   HOTKEY_PAUSE;
  28. sf::Mouse::Button   HOTKEY_START_ALT;
  29.  
  30. void setHotkeys();
  31. void render(sf::RenderWindow *pRenderWindow);
  32. void loadTextures(sf::RenderWindow *pRenderWindow);
  33. void update(sf::RenderWindow *pRenderWindow);
  34. void userControl();
  35. void getFrameTime();
  36. void botControl();
  37. void controlCenter(sf::RenderWindow *pRenderWindow);
  38. void ballControl(sf::RenderWindow *pRenderWindow);
  39. void collisions();
  40. void paddleLHit();
  41. void paddleRHit();
  42. void gameLost(sf::RenderWindow *pRenderWindow);
  43. void textManagement();
  44. void spawnParticles(int amount);
  45. void displayRoundEndingMessage(bool won);
  46. void updateHighscore();
  47. void respawnBall(sf::RenderWindow *pRenderWindow);
  48. void restorePaddles();
  49. void pressEnterToStart(sf::RenderWindow *pRenderWindow);
  50. void paused(sf::RenderWindow *pRenderWindow);
  51.  
  52. float            frametime;
  53. int speed        = 500;
  54. int defaultSpeed = speed;
  55. bool x           = true;
  56. bool y           = true;
  57. int tilt         = 7;
  58. int points       = 0;
  59. bool pauseGame   = false;
  60. int highscore = 0;
  61. bool isRespawning = false;
  62. bool isOn         = false;
  63. bool canClickP    = true;
  64.  
  65. struct Spielstand
  66. {
  67.     int spieler;
  68.     int bot;
  69. };
  70.  
  71. Spielstand neuesSpiel;
  72.  
  73. class Particle
  74. {
  75. public:
  76.     Particle(int x, int y, float scale, int lifetime);
  77.     void render(sf::RenderWindow *rw);
  78.     void update(float frametime);
  79.     bool isAlive;
  80. private:
  81.     sf::Sprite pParticle;
  82.     sf::Clock  pClock;
  83.     bool upOrDown;
  84.     int movementDown;
  85.     int movementSide;
  86.     int leftOrRight;
  87.     int speed;
  88.     int lifetime;
  89. };
  90.  
  91. class PartMan
  92. {
  93. public:
  94.     PartMan();
  95.     void insert(Particle *particle);
  96.     void render(sf::RenderWindow *rw);
  97.     void update(float frametime);
  98.  
  99.     list<Particle*> mList;
  100.     list<Particle*> *getList() {return &mList;};
  101.  
  102. private:
  103. };
  104.  
  105. Particle::Particle(int x, int y, float scale, int lft)
  106. {
  107.     pParticle.setTexture(pBallText);
  108.     pParticle.setPosition(x, y);
  109.     if(rand()%2+1 == 1)
  110.     {
  111.         speed = (rand()%2+1)*1;
  112.     }
  113.     else
  114.     {
  115.         speed = (rand()%2+1)*-1;
  116.     }
  117.     movementDown = (rand()%150+75)*speed;
  118.     movementSide = ((rand()%190+10)-100)*speed;
  119.     pParticle.setScale(scale, scale);
  120.     lifetime = lft;
  121.  
  122.     return;
  123. }
  124.  
  125. void Particle::update(float frametime)
  126. {
  127.     pParticle.move(((movementSide*frametime)*2)*2, ((movementDown*frametime)*1)*2);
  128.  
  129.     if(pClock.getElapsedTime().asMilliseconds() >= lifetime)
  130.     {
  131.         isAlive = false;
  132.     }
  133.     return;
  134. }
  135.  
  136. PartMan::PartMan()
  137. {
  138.     return;
  139. }
  140.  
  141. void Particle::render(sf::RenderWindow *rw)
  142. {
  143.     rw->draw(pParticle);
  144.     return;
  145. }
  146.  
  147. void PartMan::insert(Particle *particle)
  148. {
  149.     mList.push_back(particle);
  150.     return;
  151. }
  152.  
  153. void PartMan::render(sf::RenderWindow *rw)
  154. {
  155.     for(auto it : mList)
  156.     {
  157.         it->render(rw);
  158.     }
  159.     return;
  160. }
  161.  
  162. void PartMan::update(float frametime)
  163. {
  164.     for(auto it : mList)
  165.     {
  166.         it->update(frametime);
  167.     }
  168.  
  169.     for(auto it = mList.cbegin(); it != mList.cend();)
  170.     {
  171.         if((*it)->isAlive == false)
  172.         {
  173.             it = mList.erase(it);
  174.         }
  175.         else
  176.         {
  177.             it++;
  178.         }
  179.     }
  180.  
  181.     return;
  182. }
  183.  
  184. PartMan pm;
  185.  
  186. void pressEnterToStart(sf::RenderWindow *pRenderWindow)
  187. {
  188.     while(!sf::Keyboard::isKeyPressed(HOTKEY_START))
  189.     {
  190.         pRenderWindow->clear();
  191.  
  192.         pRenderWindow->draw(pPETS);
  193.  
  194.         pRenderWindow->display();
  195.  
  196.         if(sf::Keyboard::isKeyPressed(HOTKEY_EXIT))
  197.         {
  198.             pRenderWindow->close();
  199.             exit(0);
  200.         }
  201.     }
  202.     return;
  203. }
  204.  
  205. void setHotkeys()
  206. {
  207.     HOTKEY_EXIT      = sf::Keyboard::Key::Escape;
  208.     HOTKEY_UP        = sf::Keyboard::Key::Up;
  209.     HOTKEY_DOWN      = sf::Keyboard::Key::Down;
  210.     HOTKEY_START     = sf::Keyboard::Key::Return;
  211.     HOTKEY_START_ALT = sf::Mouse::Button::Left;
  212.     HOTKEY_PAUSE     = sf::Keyboard::Key::P;
  213.  
  214.     return;
  215. }
  216.  
  217. void loadTextures(sf::RenderWindow *pRenderWindow)
  218. {
  219.     pPaddle.loadFromFile("paddle.png");
  220.     pBallText.loadFromFile("ball.png");
  221.     pPaddleL.setTexture(pPaddle);
  222.     pPaddleR.setTexture(pPaddle);
  223.     pBall.setTexture(pBallText);
  224.  
  225.     pPaddleL.setOrigin(0,pPaddle.getSize().y/2);
  226.     pPaddleR.setOrigin(pPaddle.getSize().x,pPaddle.getSize().y/2);
  227.     pBall.setOrigin(pBallText.getSize().x/2,pBallText.getSize().y/2);
  228.  
  229.     pBall.setPosition(pRenderWindow->getSize().x/2,pRenderWindow->getSize().y/2);
  230.     pPaddleL.setPosition(0, 300);
  231.     pPaddleR.setPosition(800, 300);
  232.  
  233.     pFont.loadFromFile("AllerDisplay.ttf");
  234.     pPText.setFont(pFont);
  235.     pPText.setPosition(350, 5);
  236.     pGame.setFont(pFont);
  237.     pGame.setPosition(375, 30);
  238.     pMess.setFont(pFont);
  239.     pMess.setScale(3, 3);
  240.     pMess.setPosition(25, 150);
  241.     pPETS.setFont(pFont);
  242.     pPETS.setScale(3.5, 3.5);
  243.     pPETS.setString(" Bitte drücke\n      [ENTER]\num zu starten!");
  244.     pPETS.setPosition(60, 100);
  245.     pPaused.setFont(pFont);
  246.     pPaused.setString("       Spiel Pausiert!\n        \"P\" drücken\n um weiter zu spielen!");
  247.     pPaused.setScale(2, 2);
  248.     pPaused.setPosition(100, 100);
  249.  
  250.     return;
  251. }
  252.  
  253. int main(char t_char[], int args)
  254. {
  255.     sf::RenderWindow  pRenderWindow;
  256.     setHotkeys();
  257.     loadTextures(&pRenderWindow);
  258.     pRenderWindow.create(sf::VideoMode(800, 600, 32), "Pong", sf::Style::Titlebar);
  259.     pRenderWindow.setFramerateLimit(60);
  260.  
  261.     pressEnterToStart(&pRenderWindow);
  262.     pClock.restart();
  263.  
  264.     while(!sf::Keyboard::isKeyPressed(HOTKEY_EXIT))
  265.     {
  266.         getFrameTime();
  267.         if(pauseGame == true)
  268.         {
  269.             frametime = 0;
  270.         }
  271.         update(&pRenderWindow);
  272.         render(&pRenderWindow);
  273.     }
  274.    
  275.     return 0;
  276. }
  277.  
  278. void restorePaddles()
  279. {
  280.     pPaddleL.setPosition(0, 300);
  281.     pPaddleR.setPosition(800, 300);
  282.  
  283.     return;
  284. }
  285.  
  286. void update(sf::RenderWindow *pRenderWindow)
  287. {
  288.     pm.update(frametime);
  289.     controlCenter(pRenderWindow);
  290.     textManagement();
  291.     updateHighscore();
  292.     respawnBall(pRenderWindow);
  293.  
  294.     if(sf::Keyboard::isKeyPressed(HOTKEY_PAUSE) && canClickP == true)
  295.     {
  296.         paused(pRenderWindow);
  297.         canClickP = false;;
  298.     }
  299.     if(!sf::Keyboard::isKeyPressed(HOTKEY_PAUSE))
  300.     {
  301.         canClickP = true;
  302.     }
  303.  
  304.     return;
  305. }
  306.  
  307. void paused(sf::RenderWindow *pRenderWindow)
  308. {
  309.     pRenderWindow->draw(pPaused);
  310.     pRenderWindow->display();
  311.  
  312.     while(sf::Keyboard::isKeyPressed(HOTKEY_PAUSE))
  313.     {
  314.  
  315.     }
  316.  
  317.     while(!sf::Keyboard::isKeyPressed(HOTKEY_PAUSE))
  318.     {
  319.         if(sf::Keyboard::isKeyPressed(HOTKEY_EXIT))
  320.         {
  321.             pRenderWindow->close();
  322.             exit(0);
  323.         }
  324.     }
  325.  
  326.     pClock.restart();
  327.     frametime = 0;
  328.  
  329.     return;
  330. }
  331.  
  332. void updateHighscore()
  333. {
  334.     if(points >= highscore)
  335.     {
  336.         highscore = points;
  337.     }
  338.  
  339.     return;
  340. }
  341.  
  342. void textManagement()
  343. {
  344.     pSs.str("");
  345.     pSs<<points<<" Beste: "<<highscore;
  346.     pPText.setString(pSs.str());
  347.  
  348.     pSs.str("");
  349.     pSs<<neuesSpiel.spieler<<" : "<<neuesSpiel.bot;
  350.     pGame.setString(pSs.str());
  351.  
  352.     return;
  353. }
  354.  
  355. void controlCenter(sf::RenderWindow *pRenderWindow)
  356. {
  357.     userControl();
  358.     botControl();
  359.     ballControl(pRenderWindow);
  360.     collisions();
  361.  
  362.     return;
  363. }
  364.  
  365. void userControl()
  366. {
  367.     if(isRespawning == false)
  368.     {
  369.         if(pPaddleL.getPosition().y <= 600-(pPaddle.getSize().y/2))
  370.         {
  371.             if(sf::Keyboard::isKeyPressed(HOTKEY_DOWN))
  372.             {
  373.                 pPaddleL.move(0, +speed*frametime);
  374.             }
  375.         }
  376.  
  377.         if(pPaddleL.getPosition().y >= 0+(pPaddle.getSize().y/2))
  378.         {
  379.             if(sf::Keyboard::isKeyPressed(HOTKEY_UP))
  380.             {
  381.                 pPaddleL.move(0, -speed*frametime);
  382.             }
  383.         }
  384.     }
  385.  
  386.     return;
  387. }
  388.  
  389. void botControl()
  390. {
  391.     if(isRespawning == false)
  392.     {
  393.         if(pBall.getPosition().y <= 600-(pPaddle.getSize().y/2))
  394.         {
  395.             if(pBall.getPosition().y >= 0+(pPaddle.getSize().y/2))
  396.             {
  397.                 pPaddleR.setPosition(pPaddleR.getPosition().x, pBall.getPosition().y);
  398.             }
  399.         }
  400.     }
  401.  
  402.     return;
  403. }
  404.  
  405. void displayRoundEndingMessage(bool won)
  406. {
  407.     pauseGame = true;
  408.     if(won == false)
  409.     {
  410.         pMess.setString("Du hast verloren!");
  411.     }
  412.     if(won == true)
  413.     {
  414.         pMess.setString("Du hast gewonnen!");
  415.     }
  416.     pMessage.restart();
  417.  
  418.     return;
  419. }
  420.  
  421. void ballControl(sf::RenderWindow *pRenderWindow)
  422. {
  423.     if(isRespawning == false)
  424.     {
  425.         if(x == true)
  426.         {
  427.             if(y == true)
  428.             {
  429.                 pBall.move((speed*frametime)*1, ((speed/tilt)*frametime)*1);
  430.             }
  431.  
  432.             if(y == false)
  433.             {
  434.                 pBall.move((speed*frametime)*1, ((speed/tilt)*frametime)*-1);
  435.             }
  436.         }
  437.         if(x == false)
  438.         {
  439.             if(y == true)
  440.             {
  441.                 pBall.move((speed*frametime)*-1, ((speed/tilt)*frametime)*1);
  442.             }
  443.  
  444.             if(y == false)
  445.             {
  446.                 pBall.move((speed*frametime)*-1, ((speed/tilt)*frametime)*-1);
  447.             }
  448.         }
  449.  
  450.        
  451.         if(pBall.getPosition().x <= 000)
  452.         {
  453.             gameLost(pRenderWindow);
  454.             neuesSpiel.bot++;
  455.             displayRoundEndingMessage(false);
  456.         }
  457.         if(pBall.getPosition().x >= 800)
  458.         {
  459.             gameLost(pRenderWindow);
  460.             neuesSpiel.spieler++;
  461.             displayRoundEndingMessage(true);
  462.         }
  463.         if(pBall.getPosition().y >= 600)
  464.         {
  465.             y=!y;
  466.             spawnParticles(200);
  467.         }
  468.         if(pBall.getPosition().y <= 000)
  469.         {
  470.             y=!y;
  471.             if(isRespawning == false)
  472.             {
  473.                 spawnParticles(200);
  474.                 }
  475.         }
  476.     }
  477.  
  478.     return;
  479. }
  480.  
  481. void gameLost(sf::RenderWindow *pRenderWindow)
  482. {
  483.     restorePaddles();
  484.     speed = defaultSpeed;
  485.     pBall.setPosition(pRenderWindow->getSize().x/2, -50);
  486.     isRespawning = true;
  487.     points = 0;
  488.     x=!x;
  489.  
  490.     return;
  491. }
  492.  
  493. void respawnBall(sf::RenderWindow *pRenderWindow)
  494. {
  495.     if(isRespawning == true)
  496.     {
  497.         if(pBall.getPosition().y <= pRenderWindow->getSize().y/2)
  498.         {
  499.             pBall.move(0, 300*frametime);
  500.         }
  501.         else
  502.         {
  503.             isRespawning = false;
  504.         }
  505.     }
  506.  
  507.     return;
  508. }
  509.  
  510. void spawnParticles(int amount)
  511. {
  512.     int c = 0;
  513.     while(c <= amount)
  514.     {
  515.         Particle *part = new Particle(pBall.getPosition().x, pBall.getPosition().y, 0.75, rand()%1000+500);
  516.         pm.insert(part);
  517.         c++;
  518.     }
  519.     return;
  520. }
  521.  
  522. void collisions()
  523. {
  524.     if(pBall.getGlobalBounds().intersects(pPaddleL.getGlobalBounds()))
  525.     {
  526.         paddleLHit();
  527.     }
  528.     if(pBall.getGlobalBounds().intersects(pPaddleR.getGlobalBounds()))
  529.     {
  530.         paddleRHit();
  531.     }
  532.  
  533.     return;
  534. }
  535.  
  536. void paddleLHit()
  537. {
  538.     spawnParticles(200);
  539.     speed = speed + 25;
  540.     points++;
  541.     x=!x;
  542.     return;
  543. }
  544.  
  545. void paddleRHit()
  546. {
  547.     spawnParticles(200);
  548.     speed = speed + 25;
  549.     x=!x;
  550.     return;
  551. }
  552.  
  553. void render(sf::RenderWindow *pRenderWindow)
  554. {
  555.     pRenderWindow->clear();
  556.  
  557.     pm.render(pRenderWindow);
  558.     pRenderWindow->draw(pPaddleL);
  559.     pRenderWindow->draw(pPaddleR);
  560.     pRenderWindow->draw(pBall);
  561.     pRenderWindow->draw(pPText);
  562.     pRenderWindow->draw(pGame);
  563.     if(pMessage.getElapsedTime().asMilliseconds() <= 500)
  564.     {
  565.         pRenderWindow->draw(pMess);
  566.     }
  567.     else
  568.     {
  569.         pauseGame = false;
  570.     }
  571.  
  572.     pRenderWindow->display();
  573.  
  574.     return;
  575. }
  576.  
  577. void getFrameTime()
  578. {
  579.     frametime = pClock.getElapsedTime().asSeconds();
  580.     pClock.restart();
  581.  
  582.     return;
  583. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement