Advertisement
Guest User

COOL STUF

a guest
Aug 18th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace sf;
  6. //32px==1m
  7. constexpr float p2m = 32.f;
  8. using v2 = Vector2f;
  9. v2 gravity = {0,10};
  10.  
  11. struct Entity
  12. {
  13.     RectangleShape body;
  14.     float speed;
  15.     bool jump = true;
  16.     v2 velo = {0,0};
  17.     v2 accel = {0,0};
  18.     v2 movement = {0,0};
  19.     float friction = -0.99;
  20.     bool is_colliding(v2 pos);
  21.     void move(v2 by);
  22.  
  23. };
  24.  
  25. std::vector<Entity> entities;
  26.  
  27. void Entity::move(v2 by)
  28. {
  29.     accel += by;
  30. }
  31.  
  32. bool Entity::is_colliding(v2 pos)
  33. {
  34.     //v2 old = body.getPosition();
  35.     FloatRect hbox = body.getGlobalBounds();
  36.     //floatrect only have leftup corner
  37.     hbox.left = pos.x - hbox.width/2.f;
  38.     hbox.top = pos.y - hbox.height/2.f;
  39.     //body.setPosition(pos);
  40.     for(unsigned int i = 0; i < entities.size(); i++)
  41.     {
  42.         if(hbox.intersects(entities[i].body.getGlobalBounds()))
  43.         {
  44.             //std::cout << "a";
  45.             //falling = false;
  46.             //body.setPosition(old);
  47.             return true;
  48.         }
  49.     }
  50.     //body.setPosition(old);
  51.     return false;
  52. }
  53.  
  54. void update(Entity &player,float delta)
  55. {
  56.     if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
  57.     {
  58.         player.move({-player.speed,0.f});
  59.     }
  60.     if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
  61.     {
  62.         player.move({player.speed,0.f});
  63.     }
  64.  
  65.     if(sf::Keyboard::isKeyPressed(sf::Keyboard::W) && player.jump == true)
  66.     {
  67.         player.move({0.f,-400.f});
  68.         player.jump = false;
  69.     }
  70.  
  71.     player.accel += gravity;
  72.  
  73.     if(player.jump == true)
  74.     {
  75.         player.accel += player.friction * (player.velo/p2m);
  76.         //1
  77.     }
  78.  
  79.     player.velo += delta * player.accel * p2m;
  80.  
  81.     v2 old_pos = player.body.getPosition();
  82.     //std::cout << "OLD: " << old_pos.x << ":" << old_pos.y << std::endl;
  83.     v2 new_pos = old_pos + player.velo * delta;
  84.     //std::cout << "NEW: " << new_pos.x << ":" << new_pos.y << std::endl;
  85.  
  86.     if(!player.is_colliding({new_pos.x,old_pos.y}))
  87.     {
  88.         player.body.setPosition({new_pos.x,player.body.getPosition().y});
  89.     }
  90.     else
  91.     {
  92.         player.velo.x = 0.f;
  93.     }
  94.  
  95.     if(!player.is_colliding({old_pos.x,new_pos.y}))
  96.     {
  97.         player.body.setPosition({player.body.getPosition().x,new_pos.y});
  98.         player.jump = false;
  99.     }
  100.     else
  101.     {
  102.         player.jump = true;
  103.         player.velo.y = 0.f;
  104.     }
  105.  
  106.     player.accel = {0,0};
  107. }
  108.  
  109. int main()
  110. {
  111.  
  112.     float width = 512;
  113.     float height = 288;
  114.     sf::RenderWindow window(sf::VideoMode(width,height), "SFML works!");
  115.     window.setFramerateLimit(60);
  116.     Entity ground;
  117.     ground.body.setSize(sf::Vector2f(320.f,64.f));
  118.     ground.body.setOrigin(sf::Vector2f(ground.body.getSize().x*0.5,ground.body.getSize().y*0.5));
  119.     ground.body.setPosition(sf::Vector2f(0.5*width,height));
  120.     entities.push_back(ground);
  121.     Entity player;
  122.     player.speed = 68.f;
  123.    // player.falling = false;
  124.     player.body.setSize(sf::Vector2f(32.f,32.f));
  125.     player.body.setOrigin(sf::Vector2f(player.body.getSize().x*0.5,player.body.getSize().y*0.5));
  126.     player.body.setPosition(sf::Vector2f(width*0.5,height-ground.body.getSize().y));
  127.  
  128.     sf::Clock clock;
  129.     while (window.isOpen())
  130.     {
  131.         sf::Event event;
  132.         sf::Time time = clock.restart();
  133.         while (window.pollEvent(event))
  134.         {
  135.             if (event.type == sf::Event::Closed)
  136.                 window.close();
  137.         }
  138.  
  139.         float loopTime = time.asSeconds();
  140.         //std::cout << loopTime << std::endl;
  141.         update(player,loopTime);
  142.         window.clear();
  143.         window.draw(ground.body);
  144.         window.draw(player.body);
  145.         window.display();
  146.     }
  147.  
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement