Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][SFML] Skok postaci w bok

Ostatnio zmodyfikowano 2014-11-08 13:38
Autor Wiadomość
arczi14
Temat założony przez niniejszego użytkownika
[C++][SFML] Skok postaci w bok
» 2014-11-08 13:32:52
Witam,
Bawię się fizyką w świecie 2D. Więc postanowiłem odtworzyć skok odpowiadający skoku z świata rzeczywistego tzn z przyśpieszeniem grawitacyjnym itp. (na razie bez oporu powietrza).
Udało mi się napisać skok w górę. Niestety skoku w bok(tzn żeby poruszał się parabolicznie po osi X) nie mam pojęcia w jaki sposób mógłbym to napisać.
Mam wykorzystać rzut poziomy albo coś takiego czy w jaki sposób można to rozwiązać ?
Przy okazji podaje kod na skok w góre do oceny, a może się komuś przyda :) O ile kod jest w ogóle dobry. :p
C/C++
#include <SFML/Graphics.hpp>

using namespace std;

//Arkadiusz Haduch
// a = f/m

class Data {
   
public:
    float jumpF = 40; // Force in Newton (kg*m/s^2)
    float gravityAcceleration = 9.8; // (t/s^2)
   
};

class PhysicalCharacteristics {
   
public:
    float mass = 5; // Mass in kg
   
    float speedValue = 0;
    float speedAngel = 0;
   
    float accelerationValue = 0;
    float accelerationAngel = 0;
   
};

class Player
    : public PhysicalCharacteristics
{
   
public:
   
    sf::RectangleShape playerSprite;
   
    Player() {
       
        playerSprite.setSize( sf::Vector2f( 50, 50 ) );
        playerSprite.setFillColor( sf::Color::Red );
        playerSprite.setPosition( 512 - 25, 550 );
       
       
    }
   
    void jump( float deltaTime )
    {
       
        Data date;
       
        speedValue -= date.gravityAcceleration * deltaTime;
        playerSprite.move( 0, - speedValue );
       
    }
};

class Ball {
   
};

int main()
{
   
    Player gracz;
    sf::Clock delta;
    float deltaTime;
    bool whileJump = false;
    Data dat;
   
    sf::RenderWindow WindowApp( sf::VideoMode( 1024, 600 ), "Symulacja odbicia pilki" );
    WindowApp.setVerticalSyncEnabled( true );
   
    while( WindowApp.isOpen() )
    {
        deltaTime = delta.restart().asSeconds();
        sf::Event event;
        while( WindowApp.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 WindowApp.close();
           
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space ) {
               
                gracz.speedValue = dat.jumpF / gracz.mass;
                whileJump = true;
            }
        }
       
        if( whileJump ) {
            gracz.jump( deltaTime );
            if( gracz.playerSprite.getPosition().y > 550 ) {
                gracz.playerSprite.setPosition( gracz.playerSprite.getPosition().x, 550 );
                whileJump = false;
                gracz.accelerationValue = 0;
            }
           
        }
       
        WindowApp.clear();
        WindowApp.draw( gracz.playerSprite );
        WindowApp.display();
    }
   
    return EXIT_SUCCESS;
}
P-120164
arczi14
Temat założony przez niniejszego użytkownika
» 2014-11-08 13:38:15
Przepraszam za za niepotrzebny spam.
Dodałem po prostu:
C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
{
    gracz.playerSprite.move( 100 * deltaTime, 0 );
}

if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
{
    gracz.playerSprite.move( - 100 * deltaTime, 0 );
}

I działa.
P-120165
« 1 »
  Strona 1 z 1