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

[sfml + box2d] Dziwny błąd mimo że tak jest w manualu

Ostatnio zmodyfikowano 2012-12-30 13:34
Autor Wiadomość
DejaVu
» 2012-12-28 18:48:55
Box2D - aplikacja konsolowa:
C/C++
#include <Box2D/Box2D.h>
#include <cstdio>

int main()
{
    b2Vec2 gravity( 0.0f, - 10.0f );
    bool doSleep = true;
    b2World world( gravity, doSleep );
   
    b2BodyDef groundDef;
    groundDef.position.Set( 0.0f, - 10.0f );
    b2Body * groundBody = world.CreateBody( & groundDef );
    b2PolygonShape groundBox;
    groundBox.SetAsBox( 50.0f, 10.0f );
    groundBody->CreateFixture( & groundBox, 0.0f );
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set( 0.0f, 4.0f );
    b2Body * body = world.CreateBody( & bodyDef );
   
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox( 1.0f, 1.0f );
    b2FixtureDef fixtureDef;
    fixtureDef.shape = & dynamicBox;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture( & fixtureDef );
   
    float32 timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;
    for( int32 i = 0; i < 60; ++i )
    {
        world.Step( timeStep, velocityIterations, positionIterations );
        b2Vec2 position = body->GetPosition();
        float32 angle = body->GetAngle();
        printf( "%4.2f, %4.2f, %4.2f\n", position.x, position.y, angle );
    } //for
    return 0;
}
P-72215
DejaVu
» 2012-12-28 18:49:56
Box2D 2.2.0, aplikacja okienkowa SFML 2.0:
C/C++
#include <Box2D/Box2D.h>
#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>

#include <SFML/Graphics.hpp>
#include <sstream>
#include <vector>
#include <iostream>

class VertexArrayEx
    : public sf::VertexArray
    , public sf::Transformable
{
public:
    explicit VertexArrayEx( sf::PrimitiveType type, unsigned int vertexCount = 0 )
        : VertexArray( type, vertexCount )
        , Transformable()
    {
    }
   
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
    {
        states.transform *= getTransform();
        states.texture = NULL;
        VertexArray::draw( target, states );
    }
};

void drawObject( sf::RenderWindow & window, b2Body * pBody )
{
    if( !pBody )
         return;
   
    b2Vec2 position = pBody->GetPosition();
    float32 angle = pBody->GetAngle();
   
   
    b2AABB aabb;
    aabb.lowerBound = b2Vec2( FLT_MAX, FLT_MAX );
    aabb.upperBound = b2Vec2( - FLT_MAX, - FLT_MAX );
   
    for( b2Fixture * pFixture = pBody->GetFixtureList(); pFixture; pFixture = pFixture->GetNext() )
    {
        aabb.Combine( aabb, pFixture->GetAABB( 0 ) );
        b2Shape * pShape = pFixture->GetShape();
        if( !pShape )
             continue;
       
        if( pShape->GetType() == b2Shape::e_polygon )
        {
            b2PolygonShape * pShapeEx = reinterpret_cast < b2PolygonShape *>( pShape );
            ::glColor3f( 1.0f, 1.0f, 1.0f );
           
            VertexArrayEx vArray( sf::LinesLoop );
            vArray.setPosition( position.x, position.y );
            vArray.setRotation( pBody->GetAngle() * 180 / 3.14156 );
            for( int i = 0; i < pShapeEx->GetVertexCount(); ++i )
                 vArray.append( sf::Vertex( sf::Vector2f( pShapeEx->GetVertex( i ).x, pShapeEx->GetVertex( i ).y ) ) );
           
            window.draw( vArray );
           
        } //if
    } //for
   
    //INFO: bounding box
    sf::RectangleShape shape;
    shape.setPosition( position.x, position.y );
    shape.setFillColor( sf::Color::Transparent );
    shape.setOutlineColor( sf::Color( 255, 0, 0 ) );
    shape.setOutlineThickness( 1 );
    //shape.setRotation(pBody->GetAngle() * 180 / 3.14156);
    shape.setSize( sf::Vector2f( aabb.upperBound.x - aabb.lowerBound.x, aabb.upperBound.y - aabb.lowerBound.y ) );
    shape.setOrigin( aabb.upperBound.x - aabb.GetCenter().x, aabb.upperBound.y - aabb.GetCenter().y );
    //window.draw(shape);
}

int main()
{
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "SFML window" );
   
   
    b2Vec2 gravity( 0.0f, 10.0f );
    bool doSleep = true;
    b2World world( gravity, doSleep );
   
    b2BodyDef groundDef;
    groundDef.position.Set( 200 + 100.0f - 15, 250.0f );
    b2Body * groundBody = world.CreateBody( & groundDef );
    b2PolygonShape groundBox;
    groundBox.SetAsBox( 50.0f * 7, 10.0f );
    groundBody->CreateFixture( & groundBox, 0.0f );
   
   
   
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set( 200 + 50.0f, 4.0f );
    //bodyDef.linearDamping = 0.03f;//INFO: opór powietrza
    //bodyDef.angularDamping = bodyDef.linearDamping;//INFO: opór obrotu
    bodyDef.angle = - 5 * 3.14156 / 180.0;
    b2Body * body = world.CreateBody( & bodyDef );
   
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox( 10.0f, 10.0f );
    b2FixtureDef fixtureDef;
    fixtureDef.shape = & dynamicBox;
    fixtureDef.density = 1.0f; //gęstość (trzeba wywołać dodatkowo ResetMassData(), aby automatycznie przeliczyć masę obiektu)
    fixtureDef.friction = 0.3f; //tarcie (tylko przy kontakcie)
    fixtureDef.restitution = 0.8f; //odbijanie
    body->CreateFixture( & fixtureDef );
   
   
    float32 timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;
   
   
   
   
   
   
    sf::Clock clock;
    sf::Int32 lastTime = 0;
    while( window.isOpen() )
    {
        if( clock.getElapsedTime().asMilliseconds() - lastTime > 1 )
        {
            lastTime = clock.getElapsedTime().asMilliseconds();
            world.Step( timeStep, velocityIterations, positionIterations );
        } //if
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 window.close();
           
        } //while
        window.clear();
        drawObject( window, groundBody );
        drawObject( window, body );
        window.display();
    } //while
}
P-72216
DejaVu
» 2012-12-28 18:50:48
Dodam, że sporo gruzu jest w powyższych kodach źródłowych bo eksperymenty prowadziłem jak się uczyłem tej biblioteki, no ale powinieneś umieć wywalić z powyższych kodów źródłowych rzeczy zbędne.

/edit:
Tak mi się przypomniało... klasa VertexArrayEx nie skompiluje Ci się, ponieważ autor SFML-a nie chce metod wirtualnych uczynić 'protected', bowiem 'nie widzi w tym uzasadnienia'. Innymi słowy: musisz przepisać klasę VertexArrayEx tak, aby nie dziedziczyła z sf::VertexArray, tylko posiadała ją jako jedno z pól klasy (no i przy okazji musisz wystawić n-metod do zarządzania klasą. Druga opcja to samodzielna kompilacja bibliotek i zamienienie zapisu 'private' na 'protected'.

/edit2:
Trzecia opcja: męczyć autora SFML-a, że jego postawa dot. tworzenia metod prywatnych z tych, które są dziedziczone z interfejsu jest chorym pomysłem. Ja już kilka maili w tej sprawie napisałem i szczerze mówiąc nie chce mi się zgłaszać kolejnych poprawek do biblioteki SFML skoro z każdego uzasadnionego feature-a robi problemy i trzeba wdawać się w długie dyskusje 'a po co' (w skrócie: mam własnego brancha SFML-a ;p).

/edit3:
Dodam, że nawet zgłaszane błędy związane z kompilacją biblioteki w trybie Unicode oraz gotowe rozwiązania, które linijki poprawić również spotkały się ze stwierdzeniami krytycznymi, że: 'biblioteka nie jest przeznaczona do pracy w trybie unikodowym'. Nie ważne, że trzeba było dopisać jedną literkę w jednym pliku (którą mu podałem), aby ten problem rozwiązać i zaczął dywagować 'czy jest mi to tak na prawdę potrzebne'.
P-72217
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-28 19:24:51
Powiem Ci szczerze, że wcześniej pisałem coś właśnie takiego jak dałeś mi z konsolową wersją ale nie działało mi przez to, że miałem wersję 2.2.1 a teraz jak wgrałem 2.2.0 to działa mi ten Twój kod i podejrzewam, że to co wcześniej pisałem zanim na forum napisałem to też by działało. No cóż na podstawie tego napiszę sobie wszystko. Mógł byś mi jeszcze tylko napisać do czego jest to b2AABB? Serio niech Ci Bozia w dzieciach wynagrodzi tą pomoc dla ludzi :P
P-72223
DejaVu
» 2012-12-28 20:23:47
Poczytaj tutorial...
P-72230
ridic14
» 2012-12-30 12:31:22
W tych nowszych wersjach raczej nie przyjmuje drugiego argumentu klasy b2World jest tylko jeden argument czyli grawitacja w b2Vec2
Właśnie ja mam 2.2.1 i trochę ten manual nieaktualny, ale jakoś daję radę:)
czyli można zrobić tak(w 2.2.1):
Edit:
b2World world( b2Vec2( 0.0f, 9.8f ) );
@:vvv: Dzięki, już można :)
P-72359
Mrovqa
» 2012-12-30 13:34:37
1. Zgubiłeś nawias (czyli nie można :P)
2. Sprawdź sobie w oficjalnym repo :) (wątpię, by coś takiego wywalili)
P-72368
1 « 2 »
Poprzednia strona Strona 2 z 2