Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SFML/Graphics.hpp>
- #include <iostream>
- #include <vector>
- using namespace sf;
- //32px==1m
- constexpr float p2m = 32.f;
- using v2 = Vector2f;
- v2 gravity = {0,10};
- struct Entity
- {
- RectangleShape body;
- float speed;
- bool jump = true;
- v2 velo = {0,0};
- v2 accel = {0,0};
- v2 movement = {0,0};
- float friction = -0.99;
- bool is_colliding(v2 pos);
- void move(v2 by);
- };
- std::vector<Entity> entities;
- void Entity::move(v2 by)
- {
- accel += by;
- }
- bool Entity::is_colliding(v2 pos)
- {
- //v2 old = body.getPosition();
- FloatRect hbox = body.getGlobalBounds();
- //floatrect only have leftup corner
- hbox.left = pos.x - hbox.width/2.f;
- hbox.top = pos.y - hbox.height/2.f;
- //body.setPosition(pos);
- for(unsigned int i = 0; i < entities.size(); i++)
- {
- if(hbox.intersects(entities[i].body.getGlobalBounds()))
- {
- //std::cout << "a";
- //falling = false;
- //body.setPosition(old);
- return true;
- }
- }
- //body.setPosition(old);
- return false;
- }
- void update(Entity &player,float delta)
- {
- if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
- {
- player.move({-player.speed,0.f});
- }
- if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
- {
- player.move({player.speed,0.f});
- }
- if(sf::Keyboard::isKeyPressed(sf::Keyboard::W) && player.jump == true)
- {
- player.move({0.f,-400.f});
- player.jump = false;
- }
- player.accel += gravity;
- if(player.jump == true)
- {
- player.accel += player.friction * (player.velo/p2m);
- //1
- }
- player.velo += delta * player.accel * p2m;
- v2 old_pos = player.body.getPosition();
- //std::cout << "OLD: " << old_pos.x << ":" << old_pos.y << std::endl;
- v2 new_pos = old_pos + player.velo * delta;
- //std::cout << "NEW: " << new_pos.x << ":" << new_pos.y << std::endl;
- if(!player.is_colliding({new_pos.x,old_pos.y}))
- {
- player.body.setPosition({new_pos.x,player.body.getPosition().y});
- }
- else
- {
- player.velo.x = 0.f;
- }
- if(!player.is_colliding({old_pos.x,new_pos.y}))
- {
- player.body.setPosition({player.body.getPosition().x,new_pos.y});
- player.jump = false;
- }
- else
- {
- player.jump = true;
- player.velo.y = 0.f;
- }
- player.accel = {0,0};
- }
- int main()
- {
- float width = 512;
- float height = 288;
- sf::RenderWindow window(sf::VideoMode(width,height), "SFML works!");
- window.setFramerateLimit(60);
- Entity ground;
- ground.body.setSize(sf::Vector2f(320.f,64.f));
- ground.body.setOrigin(sf::Vector2f(ground.body.getSize().x*0.5,ground.body.getSize().y*0.5));
- ground.body.setPosition(sf::Vector2f(0.5*width,height));
- entities.push_back(ground);
- Entity player;
- player.speed = 68.f;
- // player.falling = false;
- player.body.setSize(sf::Vector2f(32.f,32.f));
- player.body.setOrigin(sf::Vector2f(player.body.getSize().x*0.5,player.body.getSize().y*0.5));
- player.body.setPosition(sf::Vector2f(width*0.5,height-ground.body.getSize().y));
- sf::Clock clock;
- while (window.isOpen())
- {
- sf::Event event;
- sf::Time time = clock.restart();
- while (window.pollEvent(event))
- {
- if (event.type == sf::Event::Closed)
- window.close();
- }
- float loopTime = time.asSeconds();
- //std::cout << loopTime << std::endl;
- update(player,loopTime);
- window.clear();
- window.draw(ground.body);
- window.draw(player.body);
- window.display();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement