DejaVu |
» 2014-01-24 17:18:08 @kubawal - ja wyznaję zasadę: "długi kod, to zły kod". Skoro musisz przebijać się przez 200 linii kodu, aby zrealizować prostą kolizję dwóch obiektów (co jest punktem wyjściowym dla biblioteki Box2D) to znaczy, że:
1. albo przykład jest fatalny, bo taka operacja powinna być prosta;
2) albo biblioteka jest źle zaprojektowana.
Skoro da się napisać przykład, który ma 30 linijek kodu, który zaprezentuje działanie najprostszego scenariusza użycia biblioteki, to takie przykłady powinny się właśnie znajdować na początku manuala. Tymczasem we wspomnianym manualu masz opisane poszczególne elementy i jeden wielki program demonstrujący działanie różnych elementów fizyki. |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-01-24 18:16:16 Mam pewien pomysł. Czy Box2d podczas przyłączania fixtur'y do ciała alokuje kopię kształtu? Czy topSh nie powinno być w pamięci wolnej? b2EdgeShape topSh;
top->objB2->CreateFixture( & topSh, 1.0f );
|
|
pekfos |
» 2014-01-24 18:20:56 Box2D does not keep a reference to the shape. It clones the data into a new b2Shape object. |
Manual ;) |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-01-24 18:25:57 No to już nie wiem, co może być nie tak... Sprawdziłem pozycje podczas aktualizacji obiektów, i pasują... Objs updated -> name: top edge size: 500 2 pos: 100 100(SF), 350 101(B2) edge 2 vertex (local): 500 0 center (local): 250 1 name: left edge size: 2 400 pos: 100 100(SF), 101 300(B2) edge 2 vertex (local): 2 400 center (local): 1 200 name: right edge size: 2 400 pos: 600 100(SF), 601 300(B2) edge 2 vertex (local): 2 400 center (local): 1 200 name: ground size: 800 2 pos: 0 750(SF), 400 751(B2) edge 2 vertex (local): 800 0 center (local): 400 1 name: ball size: 19.8904 20 pos: 200 1.078(SF), 209.945 11 edge 2 vertex (local): 0 0 center (local): 9.94522 10 Objs updated -> name: top edge size: 500 2 pos: 100 100(SF), 350 101(B2) edge 2 vertex (local): 500 0 center (local): 250 1 name: left edge size: 2 400 pos: 100 100(SF), 101 300(B2) edge 2 vertex (local): 2 400 center (local): 1 200 name: right edge size: 2 400 pos: 600 100(SF), 601 300(B2) edge 2 vertex (local): 2 400 center (local): 1 200 name: ground size: 800 2 pos: 0 750(SF), 400 751(B2) edge 2 vertex (local): 800 0 center (local): 400 1 name: ball size: 19.8904 20 pos: 200 1.2936(SF), 209.945 1 edge 2 vertex (local): 0 0 center (local): 9.94522 10
|
|
maly |
» 2014-01-24 19:07:44 Zaraz spróbuję jeszcze zrobić debugowe wyświetlanie pozycji |
b2Draw |
|
DejaVu |
» 2014-01-24 23:19:05 No właśnie... ta cała integracja rysowania Box2D z biblioteką SFML jest niestety toporna... więc jeżeli wyliczenia w konsoli się zgadzają to po prostu masz problemy z renderowaniem obiektów na właściwych pozycjach :) |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-01-25 12:52:50 Twierdzisz, żeby spróbować rozszerzyć b2DebugDraw jako silnik SFML? Można spróbować... masz problemy z renderowaniem obiektów na właściwych pozycjach :) |
Tylko, że pozycje na ekranie zgadzają się z pozycjami wypisanymi w konsoli... |
|
kubawal Temat założony przez niniejszego użytkownika |
» 2014-01-26 11:46:29 Spróbowałem zrobić ten debug draw, i wszystko jest nie na swoich miejscach :) Chociaż piłka też przelatuje przez krawędź, która przypadkiem znalazła się jej na drodze :/ Oto kod: class SFMLEngine : public b2Draw { RenderWindow & win; public: SFMLEngine( RenderWindow & w ); virtual void DrawPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color ); virtual void DrawSolidPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color ); virtual void DrawCircle( const b2Vec2 & center, float32 radius, const b2Color & color ); virtual void DrawSolidCircle( const b2Vec2 & center, float32 radius, const b2Vec2 & axis, const b2Color & color ); virtual void DrawSegment( const b2Vec2 & p1, const b2Vec2 & p2, const b2Color & color ); virtual void DrawTransform( const b2Transform & xf ) { } }; SFMLEngine::SFMLEngine( RenderWindow & w ) : win( w ) { }
void SFMLEngine::DrawPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color ) { ConvexShape c( vertexCount ); for( int i = 0; i < vertexCount; i++ ) { c.setPoint( i, B2toSF( vertices[ i ] ) ); } c.setOutlineColor( Color::White ); c.setFillColor( Color::Transparent ); win.draw( c ); }
void SFMLEngine::DrawSolidPolygon( const b2Vec2 * vertices, int32 vertexCount, const b2Color & color ) { ConvexShape c( vertexCount ); for( int i = 0; i < vertexCount; i++ ) { c.setPoint( i, B2toSF( vertices[ i ] ) ); } c.setOutlineColor( Color::White ); c.setFillColor( Color::Red ); win.draw( c ); }
void SFMLEngine::DrawCircle( const b2Vec2 & center, float32 radius, const b2Color & color ) { Vector2f pos = B2toSF( b2Vec2( center.x - radius, center.y - radius ) ); CircleShape c( B2toSF( radius ) ); c.setOutlineColor( Color::White ); c.setFillColor( Color::Transparent ); win.draw( c ); }
void SFMLEngine::DrawSolidCircle( const b2Vec2 & center, float32 radius, const b2Vec2 & axis, const b2Color & color ) { Vector2f pos = B2toSF( b2Vec2( center.x - radius, center.y - radius ) ); CircleShape c( B2toSF( radius ) ); c.setPosition( pos ); c.setOutlineColor( Color::White ); c.setFillColor( Color::Red ); win.draw( c ); }
void SFMLEngine::DrawSegment( const b2Vec2 & p1, const b2Vec2 & p2, const b2Color & color ) { VertexArray v( sf::Lines, 2 ); v[ 0 ].position = B2toSF( p1 ); v[ 0 ].color = Color::White; v[ 1 ].position = B2toSF( p2 ); v[ 1 ].color = Color::White; win.draw( v ); }
I tak wygląda wyświetlanie z użyciem kodu z pierwszego postu: Jak widać, wszystko jest na dobrych miejscach. A tak mój świat widzi Bod2d: Jak widać, albo źle zaimplementowałem SFMLEngine (mało prawdopodobne, ale nie jestem pewien co do DrawCircle() i DrawSolidCircle()), albo źle tworzę obiekty Box2d (bardziej prawdopodobne). Zauważcie, że tutaj piłka też przelatuje przez krawędź(może jednak w DrawSolidCircle() jest jakiś błąd?) |
|
1 « 2 » 3 4 |