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

[SFML 2.1] uzyskanie płynnego przyśpieszania i hamowania "samochodu"

Ostatnio zmodyfikowano 2014-06-05 21:21
Autor Wiadomość
chitler
Temat założony przez niniejszego użytkownika
[SFML 2.1] uzyskanie płynnego przyśpieszania i hamowania "samochodu"
» 2014-06-05 20:32:01
Witam. Chodzi mi o otrzymanie w miarę realistycznego przyśpieszania, hamowania i cofania w osi Y. muszę przyznać że brakuje mi pomysłu jak to zrobić. Narazie mam coś takiego:

C/C++
#include "SFML/Window.hpp"
#include "SFML/Graphics.hpp"
#include <iostream>
#include <Windows.h>
using namespace std;


class pojazd
{
public:
    sf::RectangleShape car;
    sf::Vector2f actualPos;
    sf::Vector2f upPos;
    int a;
    float mydt;
   
    float v0;
    float v;
   
   
    pojazd()
    {
        sf::Vector2f rozmiary( 100, 170 );
        car.setOrigin( 50, 85 );
        car.setSize( rozmiary );
        car.setFillColor( sf::Color::Red );
        car.setPosition( 600, 440 );
        actualPos = car.getPosition();
        v0 = 0;
       
        a = 0;
        mydt = 0;
       
       
    }
    void update( float dt, bool acc, bool brake, bool left, bool right );
};




void pojazd::update( float dt, bool acc, bool brake, bool left, bool right )
{
    if( a == 15 )
    {
        if( acc == true )
        {
            a = 15;
            mydt += dt;
        }
        if( brake == true )
        {
            a =- 15;
            mydt = 0;
            mydt += dt;
        }
        if( acc == false && brake == false )
        {
            mydt = 0;
            mydt += dt;
            a = 0;
        }
       
    }
   
    if( a ==- 15 )
    {
        if( acc == true )
        {
            a = 15;
            mydt = 0;
            mydt += dt;
        }
        if( brake == true )
        {
            a =- 15;
            mydt += dt;
        }
        if( acc == false && brake == false )
        {
            mydt = 0;
            mydt += dt;
            a = 0;
        }
       
    }
   
    if( a == 0 )
    {
        if( acc == true )
        {
            a = 15;
            mydt = 0;
            mydt += dt;
        }
        if( brake == true )
        {
            a =- 15;
            mydt = 0;
            mydt += dt;
        }
        if( acc == false && brake == false )
        {
            a = 0;
            mydt += dt;
        }
    }
   
   
    //mydt+=dt;
   
   
    //cout<<a<<endl;
    v = v0 + a * mydt;
    //int s= v0*mydt+(a*mydt*mydt)/2;
    cout << mydt << endl;
    v = v / 5;
    upPos.x = 0;
    upPos.y = x;
    //upPos.y = s;
    actualPos += upPos;
    car.setPosition( actualPos );
    v0 = v;
}

int main()
{
    pojazd car;
    sf::Clock clock;
    sf::RenderWindow Window( sf::VideoMode( 1024, 768 ), "acceleration" );
    float dt = 1.f;
    bool acc, brake, left, right;
    while( Window.isOpen() )
    {
        dt = clock.restart().asSeconds();
       
        sf::Event Event;
        while( Window.pollEvent( Event ) )
        {
            acc = false;
            brake = false;
            left = false;
            right = false;
            switch( Event.type )
            {
            case sf::Event::Closed:
                Window.close();
                break;
            case sf::Event::KeyPressed:
                if( Event.key.code == sf::Keyboard::Up )
                {
                    acc = true;
                    brake = false;
                   
                   
                }
                if( Event.key.code == sf::Keyboard::Down )
                {
                    brake = true;
                    acc = false;
                   
                }
                if( Event.key.code == sf::Keyboard::Left )
                {
                    left = true;
                    right = false;
                   
                }
                if( Event.key.code == sf::Keyboard::Right )
                {
                    right = true;
                    left = false;
                   
                }
               
                break;
               
               
                default:
                break;
               
            }
        }
        Sleep( 10 );
        car.update( dt, acc, brake, left, right );
        //cout<<acc<<brake<<left<<right<<endl;
       
       
       
        Window.clear( sf::Color::Blue );
        Window.draw( car.car );
        Window.display();
    }
    return 0;
}

Wiem, pewnie to głupie, zapewne ktoś mi powie jak się to robi. Może to też troche brak wiedzy fizycznej. Jak widać płynne hamowanie nie działa. Pomoże  ktoś?? Pozdrawiam
P-111517
pekfos
» 2014-06-05 20:42:05
To tu cokolwiek z ruchu działa..? To się nawet nie kompiluje.
P-111520
chitler
Temat założony przez niniejszego użytkownika
» 2014-06-05 21:11:05
119. linijka zamiast x ma być v. sorry mój błąd jak edytowałem
P-111524
pekfos
» 2014-06-05 21:21:01
C/C++
a = 0;
if( brake )
     a -= 15;

if( acc )
     a += 15;

v += a * dt;
upPos.y = v * dt;
P-111528
« 1 »
  Strona 1 z 1