varden

Untitled

Dec 6th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.41 KB | None | 0 0
  1. /*
  2. ==================================================================================
  3. cGame.cpp
  4. ==================================================================================
  5. */
  6. #include "cGame.h"
  7.  
  8. cGame* cGame::pInstance = NULL;
  9. static cTextureMgr* theTextureMgr = cTextureMgr::getInstance();
  10. static cFontMgr* theFontMgr = cFontMgr::getInstance();
  11. static cSoundMgr* theSoundMgr = cSoundMgr::getInstance();
  12.  
  13.  
  14. /*
  15. =================================================================================
  16. Constructor
  17. =================================================================================
  18. */
  19. cGame::cGame()
  20. {
  21.  
  22. }
  23. /*
  24. =================================================================================
  25. Singleton Design Pattern
  26. =================================================================================
  27. */
  28. cGame* cGame::getInstance()
  29. {
  30.     if (pInstance == NULL)
  31.     {
  32.         pInstance = new cGame();
  33.     }
  34.     return cGame::pInstance;
  35. }
  36.  
  37.  
  38. void cGame::initialise(SDL_Window* theSDLWND, SDL_Renderer* theRenderer)
  39. {
  40.     // Get width and height of render context
  41.     SDL_GetRendererOutputSize(theRenderer, &renderWidth, &renderHeight);
  42.     this->m_lastTime = high_resolution_clock::now();
  43.     // Clear the buffer with a black background
  44.     SDL_SetRenderDrawColor(theRenderer, 0, 0, 0, 255);
  45.     SDL_RenderPresent(theRenderer);
  46.    
  47.     theTextureMgr->setRenderer(theRenderer);
  48.     theFontMgr->initFontLib();
  49.     theSoundMgr->initMixer();
  50.  
  51.     // Store the textures
  52.     textureName = { "asteroid1", "asteroid2", "asteroid3", "asteroid4", "bullet","theRocket","theBackground"};
  53.     texturesToUse = { "Images\\asteroid1.png", "Images\\asteroid2.png", "Images\\asteroid3.png", "Images\\asteroid4.png", "Images\\bullet.png", "Images\\rocketSprite.png", "Images\\starscape1024x768.png"};
  54.     for (int tCount = 0; tCount < textureName.size(); tCount++)
  55.     {  
  56.         theTextureMgr->addTexture(textureName[tCount], texturesToUse[tCount]);
  57.     }
  58.     // Create textures for Game Dialogue (text)
  59.     fontList = { "digital", "spaceAge" };
  60.     fontsToUse = { "Fonts/digital-7.ttf", "Fonts/space age.ttf" };
  61.     for (int fonts = 0; fonts < fontList.size(); fonts++)
  62.     {
  63.         theFontMgr->addFont(fontList[fonts], fontsToUse[fonts], 36);
  64.     }
  65.     gameTextList = { "Asteroids"};
  66.    
  67.     theTextureMgr->addTexture("Title", theFontMgr->getFont("spaceAge")->createTextTexture(theRenderer, gameTextList[0], SOLID, { 0, 255, 0, 255 }, { 0, 0, 0, 0 }));
  68.  
  69.     // Load game sounds
  70.     soundList = { "theme", "shot", "explosion" };
  71.     soundTypes = { MUSIC, SFX, SFX };
  72.     soundsToUse = { "Audio/who10Edit.wav", "Audio/shot007.wav", "Audio/explosion2.wav" };
  73.     for (int sounds = 0; sounds < soundList.size(); sounds++)
  74.     {
  75.         theSoundMgr->add(soundList[sounds], soundsToUse[sounds], soundTypes[sounds]);
  76.     }
  77.  
  78.     theSoundMgr->getSnd("theme")->play(-1);
  79.  
  80.     spriteBkgd.setSpritePos({ 0, 0 });
  81.     spriteBkgd.setTexture(theTextureMgr->getTexture("theBackground"));
  82.     spriteBkgd.setSpriteDimensions(theTextureMgr->getTexture("theBackground")->getTWidth(), theTextureMgr->getTexture("theBackground")->getTHeight());
  83.  
  84.     theRocket.setSpritePos({ 500, 350 });
  85.     theRocket.setTexture(theTextureMgr->getTexture("theRocket"));
  86.     theRocket.setSpriteDimensions(theTextureMgr->getTexture("theRocket")->getTWidth(), theTextureMgr->getTexture("theRocket")->getTHeight());
  87.     theRocket.setRocketVelocity({ 0, 0 });
  88.  
  89.     // Create vector array of textures
  90.  
  91.     for (int astro = 0; astro < 5; astro++)
  92.     {
  93.         theAsteroids.push_back(new cAsteroid);
  94.         theAsteroids[astro]->setSpritePos({ 100 * (rand() % 5 + 1), 50 * (rand() % 5 + 1) });
  95.         theAsteroids[astro]->setSpriteTranslation({ (rand() % 8 + 1), (rand() % 8 + 1) });
  96.         int randAsteroid = rand() % 4;
  97.         theAsteroids[astro]->setTexture(theTextureMgr->getTexture(textureName[randAsteroid]));
  98.         theAsteroids[astro]->setSpriteDimensions(theTextureMgr->getTexture(textureName[randAsteroid])->getTWidth(), theTextureMgr->getTexture(textureName[randAsteroid])->getTHeight());
  99.         theAsteroids[astro]->setAsteroidVelocity({ 3.0f, 3.0f });
  100.         theAsteroids[astro]->setActive(true);
  101.     }
  102.  
  103. }
  104.  
  105. void cGame::run(SDL_Window* theSDLWND, SDL_Renderer* theRenderer)
  106. {
  107.     bool loop = true;
  108.  
  109.     while (loop)
  110.     {
  111.         //We get the time that passed since the last frame
  112.         double elapsedTime = this->getElapsedSeconds();
  113.  
  114.         loop = this->getInput(loop);
  115.         this->update(elapsedTime);
  116.         this->render(theSDLWND, theRenderer);
  117.     }
  118. }
  119.  
  120. void cGame::render(SDL_Window* theSDLWND, SDL_Renderer* theRenderer)
  121. {
  122.     SDL_RenderClear(theRenderer);
  123.     spriteBkgd.render(theRenderer, NULL, NULL, spriteBkgd.getSpriteScale());
  124.     // Render each asteroid in the vector array
  125.     for (int draw = 0; draw < theAsteroids.size(); draw++)
  126.     {
  127.         theAsteroids[draw]->render(theRenderer, &theAsteroids[draw]->getSpriteDimensions(), &theAsteroids[draw]->getSpritePos(), theAsteroids[draw]->getSpriteRotAngle(), &theAsteroids[draw]->getSpriteCentre(), theAsteroids[draw]->getSpriteScale());
  128.     }
  129.     // Render each bullet in the vector array
  130.     for (int draw = 0; draw < theBullets.size(); draw++)
  131.     {
  132.         theBullets[draw]->render(theRenderer, &theBullets[draw]->getSpriteDimensions(), &theBullets[draw]->getSpritePos(), theBullets[draw]->getSpriteRotAngle(), &theBullets[draw]->getSpriteCentre(), theBullets[draw]->getSpriteScale());
  133.     }
  134.     // Render the Title
  135.     cTexture* tempTextTexture = theTextureMgr->getTexture("Title");
  136.     SDL_Rect pos = { 10, 10, tempTextTexture->getTextureRect().w, tempTextTexture->getTextureRect().h };
  137.     FPoint scale = { 1, 1 };
  138.     tempTextTexture->renderTexture(theRenderer, tempTextTexture->getTexture(), &tempTextTexture->getTextureRect(), &pos, scale);
  139.     // render the rocket
  140.     theRocket.render(theRenderer, &theRocket.getSpriteDimensions(), &theRocket.getSpritePos(), theRocket.getSpriteRotAngle(), &theRocket.getSpriteCentre(), theRocket.getSpriteScale());
  141.     SDL_RenderPresent(theRenderer);
  142. }
  143.  
  144. void cGame::render(SDL_Window* theSDLWND, SDL_Renderer* theRenderer, double rotAngle, SDL_Point* spriteCentre)
  145. {
  146.  
  147.     SDL_RenderPresent(theRenderer);
  148. }
  149.  
  150. void cGame::update()
  151. {
  152.  
  153. }
  154.  
  155. void cGame::update(double deltaTime)
  156. {
  157.     // Update the visibility and position of each asteriod
  158.     vector<cAsteroid*>::iterator asteroidIterator = theAsteroids.begin();
  159.     while (asteroidIterator != theAsteroids.end())
  160.     {
  161.         if ((*asteroidIterator)->isActive() == false)
  162.         {
  163.             asteroidIterator = theAsteroids.erase(asteroidIterator);
  164.         }
  165.         else
  166.         {
  167.             (*asteroidIterator)->update(deltaTime);
  168.             ++asteroidIterator;
  169.         }
  170.     }
  171.     // Update the visibility and position of each bullet
  172.     vector<cBullet*>::iterator bulletIterartor = theBullets.begin();
  173.     while (bulletIterartor != theBullets.end())
  174.     {
  175.         if ((*bulletIterartor)->isActive() == false)
  176.         {
  177.             bulletIterartor = theBullets.erase(bulletIterartor);
  178.         }
  179.         else
  180.         {
  181.             (*bulletIterartor)->update(deltaTime);
  182.             ++bulletIterartor;
  183.         }
  184.     }
  185.     /*
  186.     ==============================================================
  187.     | Check for collisions
  188.     ==============================================================
  189.     */
  190.     for (vector<cBullet*>::iterator bulletIterartor = theBullets.begin(); bulletIterartor != theBullets.end(); ++bulletIterartor)
  191.     {
  192.         //(*bulletIterartor)->update(deltaTime);
  193.         for (vector<cAsteroid*>::iterator asteroidIterator = theAsteroids.begin(); asteroidIterator != theAsteroids.end(); ++asteroidIterator)
  194.         {
  195.             if ((*asteroidIterator)->collidedWith(&(*asteroidIterator)->getBoundingRect(), &(*bulletIterartor)->getBoundingRect()))
  196.             {
  197.                 // if a collision set the bullet and asteroid to false
  198.                 (*asteroidIterator)->setActive(false);
  199.                 (*bulletIterartor)->setActive(false);
  200.                 theSoundMgr->getSnd("explosion")->play(0);
  201.             }
  202.         }
  203.     }
  204.  
  205.  
  206.     // Update the Rockets position
  207.     theRocket.update(deltaTime);
  208. }
  209.  
  210. bool cGame::getInput(bool theLoop)
  211. {
  212.     SDL_Event event;
  213.  
  214.     while (SDL_PollEvent(&event))
  215.     {
  216.         if (event.type == SDL_QUIT)
  217.         {
  218.             theLoop = false;
  219.         }
  220.  
  221.         switch (event.type)
  222.         {
  223.             case SDL_MOUSEBUTTONDOWN:
  224.                 switch (event.button.button)
  225.                 {
  226.                 case SDL_BUTTON_LEFT:
  227.                 {
  228.                 }
  229.                 break;
  230.                 case SDL_BUTTON_RIGHT:
  231.                     break;
  232.                 default:
  233.                     break;
  234.                 }
  235.                 break;
  236.             case SDL_MOUSEBUTTONUP:
  237.                 switch (event.button.button)
  238.                 {
  239.                 case SDL_BUTTON_LEFT:
  240.                 {
  241.                 }
  242.                 break;
  243.                 case SDL_BUTTON_RIGHT:
  244.                     break;
  245.                 default:
  246.                     break;
  247.                 }
  248.                 break;
  249.             case SDL_MOUSEMOTION:
  250.             break;
  251.             case SDL_KEYDOWN:
  252.                 switch (event.key.keysym.sym)
  253.                 {
  254.                 case SDLK_ESCAPE:
  255.                     theLoop = false;
  256.                     break;
  257.                 case SDLK_DOWN:
  258.                 {
  259.                     if (theRocket.getSpritePos().x < (renderWidth - theRocket.getSpritePos().w))
  260.                     {
  261.                         theRocket.setSpriteTranslation({ -5, -5 });
  262.                     }
  263.                 }
  264.                 break;
  265.  
  266.                 case SDLK_UP:
  267.                 {
  268.                     if (theRocket.getSpritePos().x > 0)
  269.                     {
  270.                         theRocket.setSpriteTranslation({ 5, 5 });
  271.                     }
  272.                 }
  273.                 break;
  274.                 case SDLK_RIGHT:
  275.                 {
  276.                     theRocket.setSpriteRotAngle(theRocket.getSpriteRotAngle() + 5);
  277.                 }
  278.                 break;
  279.  
  280.                 case SDLK_LEFT:
  281.                 {
  282.                     theRocket.setSpriteRotAngle(theRocket.getSpriteRotAngle() - 5);
  283.                 }
  284.                 break;
  285.                 case SDLK_SPACE:
  286.                 {
  287.                     theBullets.push_back(new cBullet);
  288.                     int numBullets = theBullets.size() - 1;
  289.                     theBullets[numBullets]->setSpritePos({ theRocket.getBoundingRect().x + theRocket.getSpriteCentre().x, theRocket.getBoundingRect().y + theRocket.getSpriteCentre().y });
  290.                     theBullets[numBullets]->setSpriteTranslation({ 2.0f, 2.0f });
  291.                     theBullets[numBullets]->setTexture(theTextureMgr->getTexture("bullet"));
  292.                     theBullets[numBullets]->setSpriteDimensions(theTextureMgr->getTexture("bullet")->getTWidth(), theTextureMgr->getTexture("bullet")->getTHeight());
  293.                     theBullets[numBullets]->setBulletVelocity({ 2.0f, 2.0f });
  294.                     theBullets[numBullets]->setSpriteRotAngle(theRocket.getSpriteRotAngle());
  295.                     theBullets[numBullets]->setActive(true);
  296.                     cout << "Bullet added to Vector at position - x: " << theRocket.getBoundingRect().x << " y: " << theRocket.getBoundingRect().y << endl;
  297.                 }
  298.                 theSoundMgr->getSnd("shot")->play(0);
  299.                 break;
  300.                 default:
  301.                     break;
  302.                 }
  303.  
  304.             default:
  305.                 break;
  306.         }
  307.  
  308.     }
  309.     return theLoop;
  310. }
  311.  
  312. double cGame::getElapsedSeconds()
  313. {
  314.     this->m_CurrentTime = high_resolution_clock::now();
  315.     this->deltaTime = (this->m_CurrentTime - this->m_lastTime);
  316.     this->m_lastTime = this->m_CurrentTime;
  317.     return deltaTime.count();
  318. }
  319.  
  320. void cGame::cleanUp(SDL_Window* theSDLWND)
  321. {
  322.     // Delete our OpengL context
  323.     SDL_GL_DeleteContext(theSDLWND);
  324.  
  325.     // Destroy the window
  326.     SDL_DestroyWindow(theSDLWND);
  327.  
  328.     // Quit IMG system
  329.     IMG_Quit();
  330.  
  331.     // Shutdown SDL 2
  332.     SDL_Quit();
  333. }
Add Comment
Please, Sign In to add comment