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

[Box2D & SFML 2.0] Poruszanie "postacią"

Ostatnio zmodyfikowano 2014-05-09 18:44
Autor Wiadomość
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.
C/C++
#include <stdio.h>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <Box2D/Box2D.h>

using namespace std;

int main()
{
    ////World setup
    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" );
   
    ////Bodies
    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ź.
P-109445
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ś.
P-109470
PCS
Temat założony przez niniejszego użytkownika
» 2014-05-09 18:44:58
Dzięki wielkie, pomogło.
P-109577
1 « 2 »
Poprzednia strona Strona 2 z 2