- #include <SFML/System.hpp>
- #include <SFML/Graphics.hpp>
- #include <sstream>
- using namespace sf;
- int main()
- {
- const int width = 640;
- const int height= 480;
- // Create window
- sf::Vector2f screenDimensions(800, 600);
- sf::RenderWindow window;
- window.create (sf::VideoMode(screenDimensions.x, screenDimensions.y), "SFML game");
- // Limit frame-rate
- window.setFramerateLimit(60);
- // Keep track of the frametime
- sf::Clock frametime;
- Font font;
- if (!font.loadFromFile("HelveticaNeue-UltraLight.otf"))
- return EXIT_FAILURE;
- // Big floor
- sf::RectangleShape floor(sf::Vector2f(1000.f, 50.f));
- floor.setPosition(0.f, 400.f);
- floor.setFillColor(sf::Color(10, 180, 30));
- //Big floor 2
- sf::RectangleShape floor2(sf::Vector2f(500.f, 50.f));
- floor2.setPosition(1000.f, 700.f);
- floor2.setFillColor(sf::Color(10, 200, 30));
- //Big Floor 3
- sf::RectangleShape floor3(sf::Vector2f(500.f, 50.f));
- floor3.setPosition(1000.f, 900.f);
- floor3.setFillColor(sf::Color(10, 200, 30));
- //platform1
- sf::RectangleShape platform(sf::Vector2f(90.f, 50.f));
- platform.setPosition(1140.f, 700.f);
- platform.setFillColor(sf::Color::Red);
- //platform2
- sf::RectangleShape platform2(sf::Vector2f(200.f, 50.f));
- platform2.setPosition(1600.f, 700.f);
- platform2.setFillColor(sf::Color::Yellow);
- //platform3
- sf::RectangleShape platform3(sf::Vector2f(200.f, 50.f));
- platform3.setPosition(1800.f, 700.f);
- platform3.setFillColor(sf::Color::Yellow);
- //platform4
- sf::RectangleShape floor4(sf::Vector2f(1000.f, 50.f));
- floor4.setPosition(0.f, 400.f);
- floor4.setFillColor(sf::Color(10, 180, 30));
- //platform5
- sf::RectangleShape floor5(sf::Vector2f(200.f, 50.f));
- floor5.setPosition(2200.f, 700.f);
- floor5.setFillColor(sf::Color::Green);
- //Circle
- sf::CircleShape shape(50);
- shape.setFillColor(sf::Color(100, 250, 50));
- // Movable player
- sf::RectangleShape player(sf::Vector2f(40.f, 40.f));
- player.setOrigin(20.f, 20.f);
- player.setPosition(400.f, 40.f);
- player.setFillColor(sf::Color(10, 30, 180));
- // Player for level 2
- sf::RectangleShape player1(sf::Vector2f(40.f, 40.f));
- player1.setOrigin(20.f, 20.f);
- player1.setPosition(400.f, 40.f);
- player1.setFillColor(sf::Color(10, 30, 180));
- // Player speed
- sf::Vector2f speed(3.f, 3.f);
- // Platform speed
- sf::Vector2f platspeed(3.f, 3.f);
- // Gravity value
- const float gravity = 980.f;
- // Check if we're touching any floor/box
- bool touching = false;
- //view
- sf::View view;
- view.reset(sf::FloatRect(0, 0, screenDimensions.x, screenDimensions.y));
- view.setViewport(sf::FloatRect(0, 0, 1.0f, 1.0f));
- sf::Vector2f position(screenDimensions.x / 2, screenDimensions.y / 2);
- //view1
- sf::View view1;
- view1.reset(sf::FloatRect(0, 0, screenDimensions.x, screenDimensions.y));
- view1.setViewport(sf::FloatRect(0, 0, 1.0f, 1.0f));
- //Intro
- Text title("TEST PLATFORMER",font,50);
- title.setPosition(width/2-title.getGlobalBounds().width/2,100);
- title.setColor(Color::Blue);
- Text start("PRESS ENTER TO CONTIUE",font,30);
- start.setPosition(width/2-start.getGlobalBounds().width/2,400);
- start.setColor(Color::Red);
- //Welcome to level 2
- Text LEVEL2("WELCOME TO LEVEL 2",font,50);
- LEVEL2.setPosition(width/2-title.getGlobalBounds().width/2,100);
- LEVEL2.setColor(Color::Blue);
- //Level state
- enum state {STARTSCREEN, Level1, Level2};
- int GameState=STARTSCREEN;
- while(window.isOpen())
- {
- window.clear();
- switch(GameState)
- {
- case STARTSCREEN:
- window.draw(title);
- window.draw(start);
- break;
- case Level1:
- window.setView(view);
- window.draw(player);
- window.draw(floor);
- window.draw(floor2);
- window.draw(floor3);
- window.draw(platform);
- window.draw(platform2);
- window.draw(platform3);
- break;
- case Level2:
- window.setView(view1);
- window.draw(player);
- window.draw(floor4);
- window.draw(floor5);
- window.draw(LEVEL2);
- break;
- }
- window.display();
- // Get delta time for frame-rate depended movement
- float dt = frametime.restart().asSeconds();
- // Event handling
- sf::Event event;
- while(window.pollEvent(event))
- {
- if ( (event.type == Event::Closed) ||
- ((event.type == Event::KeyPressed) && (event.key.code==Keyboard::Escape)) )
- window.close();
- else
- if ((event.type == Event::KeyPressed) && (GameState == STARTSCREEN))
- GameState=Level1;
- }
- if (GameState!=Level1)
- continue;
- // Slow down horizontal speed
- if(speed.x > 6.f)
- speed.x -= 3.f;
- else if(speed.x < -6.f)
- speed.x += 3.f;
- else
- speed.x = 0.f;
- // Adjust vertical speed
- if(touching)
- speed.y = gravity;
- else if(speed.y < gravity)
- speed.y += 10.f;
- else if(speed.y > gravity)
- speed.y = gravity;
- // Horizontal movement
- if(sf::Keyboard::isKeyPressed(sf::Keyboard::A) && sf::Keyboard::isKeyPressed(sf::Keyboard::D))
- speed.x = 0.f;
- else if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
- speed.x = -120.f;
- else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
- speed.x = 120.f;
- else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
- GameState!=Level1;
- // Jumping
- if(sf::Keyboard::isKeyPressed(sf::Keyboard::W) && touching)
- speed.y = -300.f;
- // Move the player
- player.setPosition(player.getPosition().x + speed.x * dt, player.getPosition().y + speed.y * dt);
- //Moving the last platform
- // Check collision & position adjustment
- if(floor.getGlobalBounds().intersects(player.getGlobalBounds())) // Floor
- {
- player.setPosition(player.getPosition().x, floor.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if(floor2.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, floor2.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if(platform.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setFillColor(sf::Color::Red);
- player.setPosition(player.getPosition().x, platform.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if (platform2.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, platform2.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if (platform3.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, platform3.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if (floor4.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, floor4.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if (floor5.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, floor5.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else if (floor3.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, floor3.getPosition().y-player.getOrigin().y);
- touching = true;
- GameState=Level2;
- }
- else if (floor4.getGlobalBounds().intersects(player.getGlobalBounds()))
- {
- player.setPosition(player.getPosition().x, floor4.getPosition().y-player.getOrigin().y);
- touching = true;
- }
- else // We're not colliding
- touching = false;
- position.x = player.getPosition().x + 10 - (screenDimensions.x / 2);
- position.y = player.getPosition().y + 10 - (screenDimensions.y / 2);
- if(position.x < 0)
- position.x = 0;
- if(position.y < 0)
- position.y = 0;
- view.reset(sf::FloatRect(position.x, position.y, screenDimensions.x, screenDimensions.y));
- }
- }