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

[Box2D, Allegro] Problem z konwersją jednostek, rysowaniem

Ostatnio zmodyfikowano 2015-02-23 17:41
Autor Wiadomość
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:
C/C++
#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 ) );
   
    //BITMAP *ziemia = create_bitmap(5000, 1000);
    //clear_to_color( ziemia, makecol( 0, 255, 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();
            //b2Vec2 pos_ground = ground->GetPosition();
           
            blit( kwadrat, buffer, 0, 0,
            posxBox2D_to_Allegro( pos_box.x, 100 ),
            posyBox2D_to_Allegro( pos_box.y, 100 ),
            100, 100 );
            //blit (ziemia, buffer, 0, 0,
            //                       posxBox2D_to_Allegro(pos_ground.x, 100),
            //                       posyBox2D_to_Allegro(pos_ground.y, 100),
            //                       5000, 1000);
           
            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.
P-127095
pekfos
» 2015-02-22 15:02:37
jeśli chcę wyświetlić obiekt ground to lipa z tego wychodzi
A dokładniej?
P-127096
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.
P-127097
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.
P-127100
pekfos
» 2015-02-22 16:03:58
C/C++
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ę.
P-127102
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
P-127107
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ę?
P-127110
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ć.

P-127120
« 1 » 2
  Strona 1 z 2 Następna strona