Rafi Temat założony przez niniejszego użytkownika |
Intergracja Box2D i SFML 2.1 » 2013-11-02 14:52:21 Witam! Chciałem połączyć ww. biblioteki. O takie coś mi wyszło: MAIN: #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h> #include <iostream> #include <vector> #include <Box.h>
using namespace std;
int main() { cout << METERS_PER_PIXEL << endl << PIXELS_PER_METER << endl; vector < Box *> pudla; float32 timeStep = 1.0f / 60.0f; int32 iterations = 10; b2World world( b2Vec2( 0, - 9.8f ), true ); { b2BodyDef myBodyDef; myBodyDef.type = b2_staticBody; b2EdgeShape edge; edge.Set( b2Vec2( - 100, - 40 ), b2Vec2( 100, - 40 ) ); b2Body * edgebody = world.CreateBody( & myBodyDef ); edgebody->CreateFixture( & edge, 0 ); } sf::RenderWindow Window( sf::VideoMode( 800, 480 ), "SFML + Box2D" ); while( Window.isOpen() ) { sf::Event Event; while( Window.pollEvent( Event ) ) { if( Event.type == sf::Event::Closed ) Window.close(); if( Event.type == sf::Event::MouseButtonPressed && Event.mouseButton.button == sf::Mouse::Right ) pudla.push_back( new Box( & Window, & world ) ); } world.Step( timeStep, 8, 3 ); Window.clear(); for( int i = 0; i < pudla.size(); i++ ) { pudla[ i ]->Update(); Window.draw( * pudla[ i ] ); } Window.display(); } }
BOX.H: #ifndef BOX_H #define BOX_H #include <iostream> #include <SFML/Graphics.hpp> #include <Box2D/Box2D.h>
#define RATIO 30.0f #define PIXELS_PER_METER RATIO
#define UNRATIO (1.0F/RATIO) #define METERS_PER_PIXEL UNRATIO
#define RADTODEG (b2_pi / 180.0)
using namespace std;
class Box : public sf::Drawable { public: Box( sf::RenderWindow * wnd, b2World * m_world ); ~Box(); virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const; void Update(); private: b2Body * body; sf::RectangleShape rectangleShape; };
#endif
BOX.CPP #include "Box.h"
Box::Box( sf::RenderWindow * wnd, b2World * m_world ) { b2BodyDef myBodyDef; myBodyDef.position.Set( - 10, - 10 ); myBodyDef.type = b2_dynamicBody; body = m_world->CreateBody( & myBodyDef ); b2PolygonShape boxShape; boxShape.SetAsBox( 2 * UNRATIO, 2 * UNRATIO ); b2FixtureDef myFixtureDef; myFixtureDef.shape = & boxShape; myFixtureDef.density = 1.0f; myFixtureDef.restitution = 0.8f; body->CreateFixture( & myFixtureDef ); body->ResetMassData(); sf::Vector2f sizes( 2 * RATIO, 2 * RATIO ); rectangleShape = sf::RectangleShape( sizes ); rectangleShape.setOrigin( rectangleShape.getGlobalBounds().width / 2, rectangleShape.getGlobalBounds().height / 2 ); rectangleShape.setPosition( 50, 50 ); rectangleShape.setFillColor( sf::Color::Red ); } void Box::draw( sf::RenderTarget & target, sf::RenderStates states ) const { target.draw( rectangleShape, states ); } void Box::Update() { float rot = body->GetAngle(); b2Vec2 pos = body->GetPosition(); rectangleShape.setRotation(( 180 * rot / 3.14 ) ); rectangleShape.setPosition( - pos.x * 10, - pos.y * 10 ); }
Box::~Box() { }
No i nie dziala to zbyt dobrze. Wydaje mi się że walnąłem się gdzieś przy przeliczaniu pozycji ale nie jestem pewny. Jakieś propozycje? Z góry dzięki :) PS. Jak działają makro RATIO? Przepisałem je z jakiegoś przykładu. Wg. niego 1 metr w Box2D to ok.64 pixeli w SFML, a definicji jest 30.0f? |
|
Gabes |
» 2013-11-02 16:29:26 myBodyDef.position.Set( - 10, - 10 );
*****************************
const int SCREEN_W = 800; const int SCREEN_H = 600; const int PIX_METER = 50; const int CIRCLE = 30; const int FPS = 60;
myBodyDef.position.Set(( float )( SCREEN_W / 2 ) / PIX_METER,( float )( SCREEN_H / 2 ) / PIX_METER );
b2Vec2 pos = dynamicBox->GetPosition(); circle.setPosition( pos.x * PIX_METER, pos.y * PIX_METER ); |
|
Rafi Temat założony przez niniejszego użytkownika |
» 2013-11-02 17:08:56 Nadal nie działa poprawnie. Gdy zrobię tak jak mi powiedziałeś, tzn. circle.setPosition( pos.x * PIX_METER, pos.y * PIX_METER ); zamiast mojej wersji, kwadrat leci do góry, choć zgodnie z ustawioną grawitacją powinnien opadać... |
|
Gabes |
» 2013-11-02 17:11:52 Masz ujemną grawitacje, pozycja każdego obiektu to jego środek.
|
|
Rafi Temat założony przez niniejszego użytkownika |
» 2013-11-03 10:06:47 Po ustawieniu w testbedzie Box2d takiej samej grawitacji jak w moim świecie kulka opada, więc jakim cudem tutaj, gdy jest grawitacja ujemna, leci do góry? |
|
DejaVu |
» 2013-11-03 12:40:23 Bo zapewne testbed używa innej biblioteki graficznej, która ma odwróconą oś Y. |
|
Rafi Temat założony przez niniejszego użytkownika |
» 2013-11-03 18:04:53 No chyba że tak :D a i dlaczego po spadnięciu kwadratu prawie zawsze on się on obraca? Skoro powinien płasko opaść. |
|
Gabes |
» 2013-11-03 18:19:23 każdy obiekt ma jakieś domyślne parametry ale możesz je zmienić. b2BodyDef myCircleDef; myCircleDef.type = b2_dynamicBody;
myCircleDef.position.Set(( float )( SCREEN_W / 2 ) / PIX_METER - 4,( float )( SCREEN_H / 2 ) / PIX_METER + 2 ); b2Body * dynamicCircle = world.CreateBody( & myCircleDef ); b2CircleShape circleShape; circleShape.m_p.Set( 0, 0 ); circleShape.m_radius = 0.2; b2FixtureDef myFixtureDef; myFixtureDef.shape = & circleShape; myFixtureDef.density = 1.0f; myFixtureDef.friction = 1.0f; myFixtureDef.restitution = 0.6f; dynamicCircle->CreateFixture( & myFixtureDef ); dynamicCircle->SetAngularVelocity( 0.0f ); b2Vec2 circle_v( 10.0f, - 10.0f ); dynamicCircle->SetLinearVelocity( circle_v );
|
|
« 1 » 2 |