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ść
Brunon3
» 2015-02-22 18:10:17
To wygląda jakby ziemia w ogóle nie była "fizyczna", ale ja się nie znam na Box2D więc nie będę się wypowiadać. ;)
P-127135
rav_jarosz2
Temat założony przez niniejszego użytkownika
» 2015-02-22 18:17:09
Gdyby ziemia nie była fizyczna to by się raczej klocek nie zatrzymywał w ogóle. (też się nie znam, próbuję tę biblioteczkę rozkminić jakoś od 3 dni, z czego 1 poświęciłem na kompilację a 2 na czytanie). Mi się wydaje, że po prostu rysuję prostokąt symbolizujący tę ziemię w złym miejscu. Tylko jak to naprawić, to już nie mam pojęcia.
P-127139
Brunon3
» 2015-02-22 18:19:47
Okropne zniechęcenie dla początkującego. :( ( Też tak miałem, tylko że z Allegro, instalacja zajęła mi ( z bliżej nieokreślonych przyczyn ) trzy dni. )

Zawsze możesz napisać kolizje i fizykę sam. ;)
P-127140
SeaMonster131
» 2015-02-23 12:24:05
Z tego co pamiętam są 2 rzeczy. Box2D przyjmuje, że oś Y rośnie w górę, a maleje w dół - czyli odwrotnie niż w twojej bibliotece graficznej (nie odejmujesz pozycji Y od 600, tylko musisz pomnożyć ją *(-1)). Oraz druga sprawa, x,y twojego obiektu będzie dla Box2D jego środkiem, a w bibliotece graficznej lewym górnym rogiem.
P-127207
DejaVu
» 2015-02-23 16:11:24
Poczytaj: http://cpp0x.pl/artykuly/?id=70
oraz poczytaj:
Frazy, które należy wpisać w wyszukiwarkę google:
P-127222
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:
C/C++
#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 ) );
   
    //ziemia
    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 );
   
    //klocek
    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
C/C++
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 );
P-127257
1 « 2 »
Poprzednia strona Strona 2 z 2