[Box2D & SFML 2.0] Poruszanie "postacią"
Ostatnio zmodyfikowano 2014-05-09 18:44
PCS Temat założony przez niniejszego użytkownika |
» 2014-05-07 20:53:41 Dobra, zmieniłem cały kod - wzorowałem się na innych forach, lecz teraz jest problem taki, że mój "box" porusza się nie ze stałą prędkością, tylko co chwila przyspiesza. Zastosowałem to ApplyForce(). A tutaj kod. #include <stdio.h> #include <iostream> #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h>
using namespace std;
int main() { bool doSleep = true; b2Vec2 grav( 0.0f, - 0.9f ); b2World * world = new b2World( grav, doSleep ); sf::RenderWindow * window = new sf::RenderWindow( sf::VideoMode( 800, 600, 32 ), "Test" ); b2BodyDef groundDef; groundDef.position.Set( 10.0f, - 400.0f ); groundDef.type = b2_staticBody; b2Body * groundBody = world->CreateBody( & groundDef ); b2PolygonShape groundShape; groundShape.SetAsBox( 1500.f / 2, 16.f / 2 ); b2FixtureDef FixtureDef; FixtureDef.density = 0.f; FixtureDef.shape = & groundShape; groundBody->CreateFixture( & FixtureDef ); sf::Texture groundTexture; groundTexture.loadFromFile( "ground.png" ); sf::Sprite ground; ground.setTexture( groundTexture ); ground.setOrigin( 400.f, 8.f ); b2BodyDef boxDef; boxDef.position.Set( 200, - 300 ); boxDef.type = b2_dynamicBody; b2PolygonShape boxShape; boxShape.SetAsBox( 32.f / 2, 32.f / 2 ); b2FixtureDef boxFixture; boxFixture.density = 0.0f; boxFixture.shape = & boxShape; boxFixture.friction = 2.0f; b2Body * boxBody = world->CreateBody( & boxDef ); boxBody->CreateFixture( & boxFixture ); sf::Texture boxTexture; boxTexture.loadFromFile( "box.png" ); sf::Sprite box; box.setTexture( boxTexture ); box.setOrigin( 16.f, 16.f ); sf::Event ev; float32 timeStep = 1.0f / 60.0f; int32 velIt = 6; int32 posIt = 2; while( window->isOpen() ) { while( window->pollEvent( ev ) ) { if( ev.type == sf::Event::Closed || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) window->close(); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) boxBody->ApplyForce( b2Vec2( 1.0f, 0.0f ), boxBody->GetWorldCenter() ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) boxBody->ApplyForce( b2Vec2( - 1.0f, 0.0f ), boxBody->GetWorldCenter() ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) boxBody->ApplyForce( b2Vec2( 0.f, 1.0f ), boxBody->GetWorldCenter() ); world->Step( timeStep, velIt, posIt ); b2Vec2 groundPosition = groundBody->GetPosition(); b2Vec2 boxPos = boxBody->GetPosition(); window->clear( sf::Color( 100, 175, 255 ) ); ground.setPosition( groundPosition.x - 10.0f, -( groundPosition.y + 1.0f ) ); window->draw( ground ); box.setPosition( boxPos.x - 0.0f, -( boxPos.y + 0.5f ) ); window->draw( box ); window->display(); } delete world; delete window; return 0; }
Z góry dzięki za jakąkolwiek podpowiedź. |
|
maly |
» 2014-05-08 06:51:10 Dla ruchu w lewo/prawo spróbuj b2Body::SetLinearVelocity dla skoku b2Body::ApplyForce z większą siłą i tylko kiedy stoisz na czymś. |
|
PCS Temat założony przez niniejszego użytkownika |
» 2014-05-09 18:44:58 Dzięki wielkie, pomogło. |
|
1 « 2 » |