Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.50 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <iostream>
  3. #include <vector>
  4. #include "Player.h"
  5. #include "Goomba.h"
  6. #include "blocks.h"
  7.  
  8. // add goomba animations
  9.  
  10. int WINDOW_WIDTH = 1024;
  11. int WINDOW_HEIGHT = 768;
  12.  
  13. using Enemy = baseSpriteClass;
  14. using Powerups = baseSpriteClass;
  15.  
  16. // macros for memory efficiency
  17. #define platLeft platforms[i]->getPosition().x
  18. #define platRight platforms[i]->getPosition().x + platforms[i]->getLocalBounds().width
  19. #define platTop platforms[i]->getPosition().y
  20. #define platBottom platforms[i]->getPosition().y + platforms[i]->getLocalBounds().height
  21.  
  22. // return true if it should fall
  23. bool applyGravity(Enemy& e, std::vector<sf::Sprite*> platforms, bool ligma = false)
  24. {
  25.     bool apply = true;
  26.     int spriteLeft = e.getPosX();
  27.     int spriteRight = e.getPosX() + e.getWidth();
  28.     int spriteTop = e.getPosY();
  29.     int spriteBottom = e.getPosY() + e.getHeight();
  30.  
  31.     for (int i = 0; i < platforms.size(); i++)
  32.     {
  33.         if (spriteRight > platLeft && spriteLeft < platRight)
  34.         {
  35.             if (spriteBottom >= platTop - 10 && spriteBottom <= platTop + 10)
  36.             {
  37.                 apply = false;
  38.                 e.getPosY() = platTop - e.getWidth() - 8; // -5 is an offset for the top of the block
  39.             }
  40.         }
  41.     }
  42.  
  43.     return apply;
  44. }
  45.  
  46. bool enemyChangeDirection(Enemy& e, std::vector<sf::Sprite*> platforms, int& velX)
  47. {
  48.     bool change = false;
  49.     int spriteLeft = e.getPosX();
  50.     int spriteRight = e.getPosX() + e.getWidth();
  51.     int spriteTop = e.getPosY();
  52.     int spriteBottom = e.getPosY() + e.getHeight();
  53.  
  54.     for (int i = 0; i < platforms.size(); i++)
  55.     {
  56.         // using the macros from the previous function here as well
  57.         if ((spriteLeft >= platRight - 2 && spriteLeft <= platRight + 2)
  58.             || (spriteRight >= platLeft - 2 && spriteRight <= platLeft + 2))
  59.             if (spriteBottom >= platBottom)
  60.                 change = true;
  61.     }
  62.  
  63.     if (change)
  64.         velX = -velX;
  65.     return change;
  66. }
  67.  
  68. // basic bounding box collision between the player and a sprite
  69. bool playerEnemyCollision(Player& p, Enemy& e)
  70. {
  71.     int spriteLeft = e.getPosX();
  72.     int spriteRight = e.getPosX() + e.getWidth();
  73.     int spriteTop = e.getPosY();
  74.     int spriteBottom = e.getPosY() + e.getHeight();
  75.  
  76.     bool colliding = true;
  77.     if (p.left > spriteRight)
  78.         colliding = false;
  79.     if (p.right < spriteLeft)
  80.         colliding = false;
  81.     if (p.top > spriteBottom)
  82.         colliding = false;
  83.     if (p.bottom < spriteTop)
  84.         colliding = false;
  85.     return colliding;
  86. }
  87.  
  88. // detects if the player has stomped the head of an enemy
  89. bool hitEnemy(Player& p, Enemy& e)
  90. {
  91.     int spriteLeft = e.getPosX();
  92.     int spriteRight = e.getPosX() + e.getWidth();
  93.     int spriteTop = e.getPosY();
  94.     int spriteBottom = e.getPosY() + e.getHeight();
  95.  
  96.     // if the player's x is within the sprite's
  97.     if (p.right >= spriteLeft && p.left <= spriteRight)
  98.     {
  99.         if (p.bottom >= spriteTop - 5 && p.bottom <= spriteTop + 10)
  100.             return true;
  101.     }
  102.     return false;
  103. }
  104.  
  105. void levelReset(Player& p, std::vector<Enemy*> g)
  106. {
  107.     p.hp = 1;
  108.     p.setPosX(p.originalX);
  109.     p.setPosY(p.originalY);
  110.     for (int i = 0; i < g.size(); i++)
  111.     {
  112.         g[i]->setPosX(g[i]->originalX);
  113.         g[i]->setPosY(g[i]->originalY);
  114.         g[i]->velX = g[i]->originalVelX;
  115.     }
  116. }
  117.  
  118. //add all blocks to platforms vector
  119. int main()
  120. {
  121.     sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Mario Clone");
  122.     window.setFramerateLimit(60);
  123.  
  124.     Player player;
  125.     sf::View view(sf::FloatRect(0.f, 0.f, WINDOW_WIDTH, WINDOW_HEIGHT));
  126.  
  127.     // the vectors for the enemies and shit have to be pointers to the instances
  128.     std::vector<Enemy*> enemies;
  129.     Goomba* testGoomba = new Goomba(1000, 460);
  130.     enemies.push_back(testGoomba);
  131.  
  132.     std::vector<Powerups*> onScreenPowerUps;
  133.  
  134.     std::vector<Block*> blocks;
  135.     Block* testPowerBlock = new Block(300, 600, true);
  136.     blocks.push_back((testPowerBlock));
  137.  
  138.     std::vector<sf::Sprite*> platforms;
  139.     for (int i = 0; i < 50; i++)
  140.     {
  141.         Block* testPlatform2 = new Block(i * 48, 700, false);
  142.         platforms.push_back(testPlatform2->getSpriteAddr());
  143.     }
  144.     // platforms.push_back(&testPlatform2);
  145.    //  platforms.push_back(&testPlatform3);
  146.  
  147.     int leftLevelBorder = 0;
  148.     int rightLevelBorder = 2000;
  149.  
  150.     while (window.isOpen())
  151.     {
  152.         if (player.getPosX() <= WINDOW_WIDTH / 2)
  153.             view.setCenter(sf::Vector2f(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2));
  154.         else
  155.             // center the camera's view to the player's position, if he isn't too far to the right/left
  156.             view.setCenter(sf::Vector2f(player.getPosX(), WINDOW_HEIGHT / 2));
  157.  
  158.         window.setView(view);
  159.  
  160.         sf::Event event;
  161.         while (window.pollEvent(event))
  162.         {
  163.             if (event.type == sf::Event::Closed)
  164.                 window.close();
  165.             if (event.type == sf::Event::KeyPressed)
  166.                 if (event.key.code == sf::Keyboard::Space)
  167.                 {
  168.                     if (!player.isAirborne)
  169.                     {
  170.                         player.jump(false);
  171.                         player.justJumped = true;
  172.                     }
  173.                 }
  174.         }
  175.  
  176.         // change this to black to test for colour key success
  177.         window.clear(sf::Color::White);
  178.  
  179.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
  180.             player.velX = -5;
  181.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
  182.             player.velX = 5;
  183.         if (!sf::Keyboard::isKeyPressed(sf::Keyboard::A) &&
  184.             !sf::Keyboard::isKeyPressed(sf::Keyboard::D))
  185.             player.velX = 0;
  186.  
  187.         for (int i = 0; i < enemies.size(); i++)
  188.         {
  189.             enemies[i]->move();
  190.             enemyChangeDirection(*enemies[i], platforms, enemies[i]->velX);
  191.  
  192.             static int gravityDelay = 0;
  193.             if (applyGravity(*enemies[i], platforms))
  194.             {
  195.                 // this changes the frequency at which the gravity is applied
  196.                 if (gravityDelay % 8 == 0)
  197.                 {
  198.                     enemies[i]->velY += 1;
  199.                     gravityDelay = 1;
  200.                 }
  201.                 gravityDelay++;
  202.             }
  203.             else
  204.                 enemies[i]->velY = 0;
  205.  
  206.             if (hitEnemy(player, *enemies[i]))
  207.             {
  208.                 delete enemies[i];
  209.                 enemies.erase(enemies.begin() + i);
  210.                 player.jump(true);
  211.                 // continue statemente here, otherwise it would try to render a dangling pointer
  212.                 continue;
  213.             }
  214.             else
  215.             {
  216.                 if (playerEnemyCollision(player, *enemies[i]))
  217.                 {
  218.                     time_t tempTimer;
  219.                     time(&tempTimer);
  220.                     player.takeDamage(tempTimer);
  221.                 }
  222.             }
  223.             window.draw(enemies[i]->getRect());
  224.  
  225.         }
  226.  
  227.         if (player.hp <= 0)
  228.         {
  229.             levelReset(player, enemies);
  230.         }
  231.  
  232.         player.move();
  233.         player.isAirborne = true;
  234.         // iterate through all the platforms and detect collision. last arg is number of plats.
  235.         int newPlayerX = player.getPosX();
  236.         for (int i = 0; i < platforms.size(); i++)
  237.         {
  238.             player.platformCollision(*platforms[i], &newPlayerX, nullptr);
  239.             window.draw(*platforms[i]);
  240.         }
  241.         bool hitBot = false;
  242.         for (int i = 0; i < blocks.size(); i++)
  243.         {
  244.             player.platformCollision(blocks[i]->getSprite(), &newPlayerX, &hitBot);
  245.             window.draw(blocks[i]->getSprite());
  246.             if (hitBot && blocks[i]->isPowerupBlock && !blocks[i]->hasReleased)
  247.             {
  248.                 // make this work with all blocks by removing  powerBlock
  249.                 // and just making a member variable determine if it is a
  250.                 // block with something in it.
  251.                 blocks[i]->hasReleased = true;
  252.                 onScreenPowerUps.push_back(testPowerBlock->releasePowerUp(*testPowerBlock));
  253.             }
  254.         }
  255.  
  256.         for (int i = 0; i < onScreenPowerUps.size(); i++)
  257.         {
  258.             window.draw(onScreenPowerUps[i]->getRect());
  259.             onScreenPowerUps[i]->update();
  260.             static int updateGravity = 0;
  261.             updateGravity++;
  262.             if (onScreenPowerUps[i]->update())
  263.             {
  264.                 if (onScreenPowerUps[i]->velY < 0)
  265.                     onScreenPowerUps[i]->velY = 0;
  266.                 if (applyGravity(*onScreenPowerUps[i], platforms, true))
  267.                     onScreenPowerUps[i]->velY += updateGravity / 10;
  268.             }
  269.             if (updateGravity > 10)
  270.                 updateGravity = 0;
  271.         }
  272.  
  273.         player.getRect().setPosition(newPlayerX, player.getPosY());
  274.  
  275.         window.draw(player.getRect());
  276.  
  277.         window.display();
  278.     }
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement