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

[Box2D & SFML 2.0] Grawitacja

Ostatnio zmodyfikowano 2014-03-19 12:58
Autor Wiadomość
PCS
Temat założony przez niniejszego użytkownika
[Box2D & SFML 2.0] Grawitacja
» 2014-03-16 23:00:26
Czołem, kolejny temat i kolejny problem, otóż tym razem wyświetlam sobie sprite'a jak i "podłogę" na którą ma spaść mój sprite, no i tutaj mam kłopot. Z niezrozumiałych mi przyczyn moje "pudło" nie leci zgodnie z grawitacją w dół, oto kod:
C/C++
#include <SFML\Graphics.hpp>
#include <Box2D\Box2D.h>

/** We need this to easily convert between pixel and real-world coordinates*/
static const float SCALE = 30.f;

/** Create the base for the boxes to land */
void CreateGround( b2World & world, float X, float Y );

/** Create the boxes */
void CreateBox( b2World & world );

int main()
{
    /** Prepare the window */
    sf::RenderWindow window( sf::VideoMode( 800, 600, 32 ), "Test" );
    window.setFramerateLimit( 60 );
   
    /** Prepare the world */
    b2Vec2 gravity( 5.9f, 9.8f );
    bool doSleep = true;
    b2World world( gravity, doSleep );
    CreateGround( world, 400.f, 600.f );
   
    /** Prepare textures */
    sf::Texture groundTexture;
    groundTexture.loadFromFile( "ground.png" );
    sf::Texture boxTexture;
    boxTexture.loadFromFile( "box.png" );
   
    while( window.isOpen() )
    {
       
        CreateBox( world );
       
        world.Step( 1 / 60.f, 8, 3 );
       
        window.clear( sf::Color::White );
        {
           
            sf::Sprite Sprite;
            Sprite.setTexture( boxTexture );
            Sprite.setOrigin( 16.f, 16.f );
            Sprite.setPosition( 40, 40 );
            window.draw( Sprite );
           
           
            sf::Sprite GroundSprite;
            GroundSprite.setTexture( groundTexture );
            GroundSprite.setOrigin( 400.f, 8.f );
            GroundSprite.setPosition( 200, 200 );
            window.draw( GroundSprite );
           
        }
        window.display();
    }
   
    return 0;
}

void CreateBox( b2World & world )
{
    b2BodyDef BodyDef;
    BodyDef.position = b2Vec2( 40, 40 );
    BodyDef.type = b2_dynamicBody;
    b2Body * Body = world.CreateBody( & BodyDef );
   
    b2PolygonShape Shape;
    Shape.SetAsBox(( 32.f / 2 ) / SCALE,( 32.f / 2 ) / SCALE );
    b2FixtureDef FixtureDef;
    FixtureDef.density = 1.f;
    FixtureDef.friction = 0.7f;
    FixtureDef.shape = & Shape;
    Body->CreateFixture( & FixtureDef );
}

void CreateGround( b2World & world, float X, float Y )
{
    b2BodyDef BodyDef;
    BodyDef.position = b2Vec2( X / SCALE, Y / SCALE );
    BodyDef.type = b2_staticBody;
    b2Body * Body = world.CreateBody( & BodyDef );
   
    b2PolygonShape Shape;
    Shape.SetAsBox(( 800.f / 2 ) / SCALE,( 16.f / 2 ) / SCALE );
    b2FixtureDef FixtureDef;
    FixtureDef.density = 0.f;
    FixtureDef.shape = & Shape;
    Body->CreateFixture( & FixtureDef );
}
P-106605
maly
» 2014-03-18 14:00:02
Z niezrozumiałych mi przyczyn moje "pudło" nie leci zgodnie z grawitacją w dół
b2Vec2 gravity( 5.9f, 9.8f );
P-106690
oputyk
» 2014-03-18 15:50:56
Zmień na
- 9.8f
.
P-106702
PCS
Temat założony przez niniejszego użytkownika
» 2014-03-19 08:24:41
Nie wiem czemu, ale aplikacja mi się wiesza.
P-106757
maly
» 2014-03-19 08:36:15
Brak w głównej pętli obsługi event-ów.
C/C++
sf::Event event;
while( window.pollEvent( event ) ) { }

W głównej petli
CreateBox( world );
 tworzy cały czas dodatkowe box-y.
P-106759
PCS
Temat założony przez niniejszego użytkownika
» 2014-03-19 12:30:09
Okay, działa. Aplikacja się nie wiesza, ale nawet dodanie minusa przy argumencie w grawitacji nic mi nie dała. Pudło jak stało w powietrzu tak stoi.
P-106769
PCS
Temat założony przez niniejszego użytkownika
» 2014-03-19 12:58:19
Okay, dzięki. Poradziłem sobie już z tym. Brakowało
C/C++
Sprite.setPosition( BodyIterator->GetPosition().x, BodyIterator->GetPosition().y )
P-106771
« 1 »
  Strona 1 z 1