rav_jarosz2 Temat założony przez niniejszego użytkownika |
[Box2D, Allegro] Problem z konwersją jednostek, rysowaniem » 2015-02-22 14:58:30 Witam. Zacząłem się niedawno uczyć biblioteki Box2D. Modyfikowałem kod z artykułów i Mam problem z przerysowaniem tego na allegro. Może zamieszczę kod: #include <Allegro.h> #include <Box2D/Box2D.h>
double posxBox2D_to_Allegro( double x, double w ) { return( x * 50 ) - w / 2; }
double posyBox2D_to_Allegro( double y, double h ) { return 600 -( y * 50 ) -( h / 2 ); }
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 * kwadrat = create_bitmap( 100, 100 ); clear_to_color( kwadrat, makecol( 255, 0, 0 ) ); b2World world( b2Vec2( 0.0f, - 10.0f ) ); b2BodyDef groundDef; groundDef.position.Set( 0.0f, - 9.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( 8.0f, 10.0f ); b2Body * box = world.CreateBody( & boxDef ); b2PolygonShape boxShape; boxShape.SetAsBox( 2.0f / 2, 2.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.0f, 3.0f ); b2Vec2 pos_box = box->GetPosition(); blit( kwadrat, buffer, 0, 0, posxBox2D_to_Allegro( pos_box.x, 100 ), posyBox2D_to_Allegro( pos_box.y, 100 ), 100, 100 ); blit( buffer, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( buffer, makecol( 0, 0, 0 ) ); } } destroy_bitmap( buffer ); allegro_exit(); return 0; } END_OF_MAIN();
Napisałem funkcję która konwertuje wartości z Box-a na Allegrowskie. Ale jeśli chcę wyświetlić obiekt ground to lipa z tego wychodzi i nie mam pomysłu co z tym zrobić. Proszę o pomoc. |
|
pekfos |
» 2015-02-22 15:02:37 jeśli chcę wyświetlić obiekt ground to lipa z tego wychodzi |
A dokładniej? |
|
Brunon3 |
» 2015-02-22 15:15:05 Z tego co widzę, to jest to Allegro 4.2, a jest to często dość ważna informacja. ;)
Tak jak napisał @up, opisz problem dokładniej. |
|
rav_jarosz2 Temat założony przez niniejszego użytkownika |
» 2015-02-22 16:00:31 Ok. Wyświetlam czerwony kwadrat który ma spadać. Teraz wyświetlam prostokąt. Czerwony klocek spada, potem zatrzymuje się, ale wisi w powietrzu. Odstęp pomiędzy klockiem a ziemią wynosi jakieś 400 pikseli. Jakby w złym miejscu jest rysowana ziemia, albo klocek (albo jedno i drugie).
EDIT: Pewnie spaprałem coś z funkcją przeliczającą jednostki Box-a na piksele. Było z tym trochę do kombinowania, bo bez niczego klocek "spadał w górę" bo w allegro, aby coś spadało należy dodawać zmienną y, a Box spadanie interpretuje jako odejmowanie tej zmiennej. I nie wiem czy te funkcje przeliczające napisałem prawidłowo. |
|
pekfos |
» 2015-02-22 16:03:58 double posyBox2D_to_Allegro( double y, double h ) { return 600 -( y * 50 ) -( h / 2 ); } |
Odwracasz oś Y w przeliczaniu współrzędnych, więc pewnie wyświetlasz w złą stronę. |
|
rav_jarosz2 Temat założony przez niniejszego użytkownika |
» 2015-02-22 16:12:43 Chwila, niezrozumiale wytłumaczyłem mój problem. Te 600- ... Miało mi odwrócić rysowanie grawitacji. I odwraca. Klocek spada w dół. Problem jest w tym, że ziemia nie wyświetla się na ekranie (jest poniżej ekranu). groundDef.position.Set( 0.0f, - 10.0f ); Klocek zatrzymuje się tu: http://screenshooter.net/101979339/SS_6 zmieniłem na groundDef.position.Set( 0.0f, 0.2f ); I teraz ziemia wyświetla się u dołu ekranu (0, 550 około) Ale teraz klocek zatrzymuje się w tym miejscu: http://screenshooter.net/101979339/SS_5 |
|
pekfos |
» 2015-02-22 16:19:01 Skąd wiesz, że masz mnożyć współrzędne przez 50? w allegro, aby coś spadało należy dodawać zmienną y, a Box spadanie interpretuje jako odejmowanie tej zmiennej. |
A gdyby grawitacja działała w górę? |
|
rav_jarosz2 Temat założony przez niniejszego użytkownika |
» 2015-02-22 16:44:56 http://pawel1503.cba.pl/index.php/660/integracja-sfmla-i-box2d-czyli-kilka-wskazowek-dla-poczatkujacych/ Z tąd brałem informacje o przeliczaniu jednostek Dałem teraz return( y * 50 ) -( h / 2 ) czyli tak jakby grawitacja działała w górę Bez rysowania ziemii dla groundDef.position.Set( 0.0f, - 10.0f ); http://screenshooter.net/101979339/SS_7 (klocek opada do góry i zatrzymuje się na krawędzi) Bez rysowania ziemii dla groundDef.position.Set( 0.0f, 0.2f ); http://screenshooter.net/101979339/SS_8 (klocek jest ciągle w tym samym miejscu) I teraz jak narysuję ziemię, to się cyrki dzieją: dla groundDef.position.Set( 0.0f, - 10.0f ); http://screenshooter.net/101979339/SS_10 (klocek opada do góry i zatrzymuje się na krawędzi) dla groundDef.position.Set( 0.0f, 0.2f ); http://screenshooter.net/101979339/SS_11 (klocek jest ciągle w tym samym miejscu) Już nie mam pojęcia co z tym zrobić. |
|
« 1 » 2 |