[SFML 2.1] uzyskanie płynnego przyśpieszania i hamowania "samochodu"
Ostatnio zmodyfikowano 2014-06-05 21:21
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: #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; } } v = v0 + a * mydt; cout << mydt << endl; v = v / 5; upPos.x = 0; upPos.y = x; 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 ); 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 |
|
pekfos |
» 2014-06-05 20:42:05 To tu cokolwiek z ruchu działa..? To się nawet nie kompiluje. |
|
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 |
|
pekfos |
» 2014-06-05 21:21:01 a = 0; if( brake ) a -= 15;
if( acc ) a += 15;
v += a * dt; upPos.y = v * dt; |
|
« 1 » |