rav_jarosz2 Temat założony przez niniejszego użytkownika |
» 2015-02-23 17:41:47 @DejaVu próbuję tę biblioteczkę rozkminić jakoś od 3 dni, z czego 1 poświęciłem na kompilację a 2 na czytanie |
Z tego artykułu brałem prawie wszystkie rzeczy związane z Boxem, i googlowałem też trochę. Nie mogę znaleźć czegoś, co pomoże mi to zrozumieć. @SeaMonster131 Próbowałem i tego. Jeśli przemnożę te współrzędne razy -1, to wyjdą mi współrzędne ujemne, czyli będę rysował wtedy całkiem wyżej niż ekran. Za to mam już lepsze rozwiązanie. Po prostu odwrócić grawitację w Box2D b2World world( b2Vec2( 0.0f, - 10.0f ) ); zamienić na: b2World world( b2Vec2( 0.0f, 10.0f ) ); Powalczę z tym jeszcze trochę. EDIT: Wkurzyłem się i zacząłem na spokojnie od nowa. Udało się chyba. http://screenshooter.net/101979339/SS_9 A tu kodzik: #include <Allegro.h> #include <Box2D/Box2D.h>
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { allegro_init(); install_keyboard(); install_mouse(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 60 ) ); set_color_depth( 24 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 0, 0, 0 ) ); BITMAP * buffer = create_bitmap( 800, 600 ); clear_to_color( buffer, makecol( 0, 0, 0 ) ); BITMAP * klocek = create_bitmap( 50, 50 ); clear_to_color( klocek, makecol( 255, 0, 0 ) ); BITMAP * ziemia = create_bitmap( 5000, 1000 ); clear_to_color( ziemia, makecol( 0, 255, 0 ) ); b2World world( b2Vec2( 0.0f, 9.8f ) ); b2BodyDef groundDef; groundDef.position.Set( 0.0f, 20.0f ); b2Body * ground = world.CreateBody( & groundDef ); b2PolygonShape groundShape; groundShape.SetAsBox( 100.0f / 2, 20.0f / 2 ); ground->CreateFixture( & groundShape, 1.0f ); b2BodyDef boxDef; boxDef.type = b2_dynamicBody; boxDef.position.Set( 7.5f, 5.0f ); b2Body * box = world.CreateBody( & boxDef ); b2PolygonShape boxShape; boxShape.SetAsBox( 1.0f / 2, 1.0f / 2 ); b2FixtureDef boxFixDef; boxFixDef.shape = & boxShape; boxFixDef.density = 1.0f; boxFixDef.friction = 0.3f; box->CreateFixture( & boxFixDef ); while( !key[ KEY_ESC ] ) { while( speed > 0 ) { speed--; world.Step( 1.0f / 100.0f, 8, 3 ); b2Vec2 pos_klocek = box->GetPosition(); b2Vec2 pos_ground = ground->GetPosition(); blit( ziemia, buffer, 0, 0,( pos_ground.x * 50 ) -( 5000 / 2 ),( pos_ground.y * 50 ) -( 1000 / 2 ), 5000, 1000 ); blit( klocek, buffer, 0, 0,( pos_klocek.x * 50 ) -( 50 / 2 ),( pos_klocek.y * 50 ) -( 50 / 2 ), 50, 50 ); blit( buffer, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( buffer, makecol( 0, 0, 0 ) ); } } destroy_bitmap( buffer ); destroy_bitmap( klocek ); allegro_exit(); return 0; } END_OF_MAIN();
Na razie bez używania funkcji, ale napisanie funkcji będzie chyba łatwe. Dzięki wszystkim za pomoc. Temat chyba do zamknięcia. EDIT2: Jest i funkcja float posBox2D_to_Allegro( float x_y, float w_h ) { return( x_y * 50 ) -( w_h / 2 ); }
blit( ziemia, buffer, 0, 0, posBox2D_to_Allegro( pos_ground.x, 5000 ), posBox2D_to_Allegro( pos_ground.y, 1000 ), 5000, 1000 ); blit( klocek, buffer, 0, 0, posBox2D_to_Allegro( pos_klocek.x, 50 ), posBox2D_to_Allegro( pos_klocek.y, 50 ), 50, 50 );
|