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

[Allegro] Prawdziwa fizyka w grze! problem!

Ostatnio zmodyfikowano 2012-07-16 17:38
Autor Wiadomość
ridic14
Temat założony przez niniejszego użytkownika
[Allegro] Prawdziwa fizyka w grze! problem!
» 2012-07-15 21:23:38
Ogólnie temat ma charakter zapytania do DejaVu

Przeglądając tematy o kolizjach znalazłem ciekawy opis jak zrobić fizykę w grze http://cpp0x.pl/forum/temat/?id=126Grawitacja w grze - opis ogólny
Chciałbym to wykorzystać w grze (prawdziwa grawitacja to na pewno fajny bajer)
wymienione było że będą potrzebne wzory:
przyspieszenie: a = (v - v0 ) / t
prędkość:
i nie wiem jak to poskładać:
i ogólnie dwóch kroków nie rozumiem

5. W następnym kroku wyznaczyć wzory (wcześniej o jednym wspomniałem) dla pozycja, predkosc i przyspieszenie i do ludek.aktualna, zapisywać nowo wyliczone współrzędne. Do wylicznia współrzędnych wykorzystać deltaT i pola ze struktury ludek.start (bez pola czasu).

6. W przedostatnim kroku dodałbym warunek sprawdzania, czy coś się znajduje pod obiektem i jeśli tak, to albo nie wykonywał grawitacji, albo ustawiał przyśpieszenie = 0 (dla osi y), gdy pod obiektem istnieje obiekt (czyli jest kolizja). Jeśli pod ludzikiem nie ma niczego, to ustawiać grawitację.
C/C++
//struktury dla ludka
#include <allegro.h>
struct SPunkt
{
    double x;
    double y;
};
enum ERuch
{
    RuchStop = 0,
    RuchLewo = 0,
    RuchPrawo = 0,
    RuchSkok = 0,
};
struct SFizyka
{
    SPunkt pozycja;
    SPunkt predkosc;
    SPunkt przyspieszenie;
    double czas;
    ERuch przed;
    ERuch teraz;
};

struct SObiekt
{
    SFizyka start;
    SFizyka aktualna;
};



int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    ////////////////////////////////////INICJACJA
   
    SObiekt ludek;
    ludek.start.pozycja.x = 100;
    ludek.start.pozycja.y = 200;
    ludek.start.predkosc.x = 0;
    ludek.start.predkosc.y = 0;
    ludek.start.przyspieszenie.x = 0;
    ludek.start.przyspieszenie.y = 9.81;
    ludek.start.czas = 0;
    ludek.aktualna = ludek.start;
    ///Niżej coś nie tak
    ludek.teraz = RuchStop; //tu coś nie gra
    ludek.przed = ludek.teraz;
   
    BITMAP * ludekbmp = NULL;
    BITMAP * bufor = NULL;
    ludekbmp = load_bmp( "ludek.bmp", default_palette );
    bufor = create_bitmap( 640, 480 );
   
   
   
   
   
    while( true )
    {
        //obsluga klawiszy;
        if( key[ KEY_LEFT ] )
        {
            ludek.aktualna.predkosc.x = - 5;
            ludek.teraz = RuchLewo;
        }
       
        if( key[ KEY_RIGHT ] )
        {
            ludek.aktualna.predkosc.x = 5;
            ludek.teraz = RuchPrawo;
        }
       
        if( key[ KEY_UP ] )
        {
            ludek.teraz = RuchSkok;
            ludek.aktualna.V = - 50;
        }
       
        else
        {
            ludek.aktualna.predkosc.x = 0;
            ludek.teraz = RuchStop;
        }
       
        masked_blit( ludekbmp, bufor, 0, 0, ludek.aktualna.pozycja.x, ludek.aktualna.pozycja.y, ludekbmp->w, ludekbmp->h );
        blit( bufor, screen, 0, 0, 0, 0, screen->w, screen->h );
       
        //zwiększenie czasu
        //Sleep( 20 );//not found
        if( ludek.teraz != ludek.przed )
        {
            ludek.przed = ludek.teraz;
            ludek.start = ludek.aktualna;
        }
        ludek.aktualna.czas += 0.02;
        double deltaT = ludek.aktualna.czas - ludek.start.czas;
        //poniżej modyfikacja pozycji zgodnie z prawami fizyki (kinematyka)
       
    }
   
   
   
   
   
    destroy_bitmap( ludekbmp );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-60125
kubawal
» 2012-07-16 08:08:18
Popatrz sobie na klasę SObiekt, a później na ten fragment
C/C++
///Niżej coś nie tak
ludek.teraz = RuchStop; //tu coś nie gra
ludek.przed = ludek.teraz;

Coś tu się nie zgadza!   
P-60132
ridic14
Temat założony przez niniejszego użytkownika
» 2012-07-16 15:40:20
Właśnie dlatego dałem komentarz liczyłem że autor powie co miał na myśli. Ale można to tak zmienić
z
C/C++
struct SObiekt
{
    SFizyka start;
    SFizyka aktualna;
};
na

C/C++
struct SObiekt
{
    SFizyka start;
    SFizyka aktualna;
    SFizyka ruch;
};
ludek.ruch.teraz = RuchStop; //tu coś nie gra
ludek.ruch.przed = ludek.teraz;

Ale i tak wiele błędów pozostaje:

ludek.aktualna.V = - 50;
V has no member wiem że muszę to dodać do SFizyka ale ...

Nowy kod co prawda się uruchamia ale od razu wyskakuje błąd z tej racji że nie wiem gdzie te dwa WW wzory zastosować?!
C/C++
//struktury dla ludka
#include <allegro.h>
struct SPunkt
{
    double x;
    double y;
};
enum ERuch
{
    RuchStop = 0,
    RuchLewo = 0,
    RuchPrawo = 0,
    RuchSkok = 0,
};
struct SFizyka
{
    SPunkt pozycja;
    SPunkt predkosc;
    SPunkt przyspieszenie;
    double czas;
    double V;
    ERuch przed;
    ERuch teraz;
};

struct SObiekt
{
    SFizyka start;
    SFizyka aktualna;
    SFizyka ruch;
};



int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
    clear_to_color( screen, makecol( 128, 128, 128 ) );
   
    ////////////////////////////////////INICJACJA
   
    SObiekt ludek;
    ludek.start.pozycja.x = 100;
    ludek.start.pozycja.y = 200;
    ludek.start.predkosc.x = 0;
    ludek.start.predkosc.y = 0;
    ludek.start.przyspieszenie.x = 0;
    ludek.start.przyspieszenie.y = 9.81;
    ludek.start.czas = 0;
    ludek.aktualna = ludek.start;
    ludek.ruch.teraz = RuchStop;
    ludek.ruch.przed = ludek.ruch.teraz;
   
    BITMAP * ludekbmp = NULL;
    BITMAP * bufor = NULL;
    ludekbmp = load_bmp( "ludek.bmp", default_palette );
    bufor = create_bitmap( 640, 480 );
   
   
   
   
   
    while( true )
    {
        //obsluga klawiszy;
        if( key[ KEY_LEFT ] )
        {
            ludek.aktualna.predkosc.x = - 5;
            ludek.ruch.teraz = RuchLewo;
        }
       
        if( key[ KEY_RIGHT ] )
        {
            ludek.aktualna.predkosc.x = 5;
            ludek.ruch.teraz = RuchPrawo;
        }
       
        if( key[ KEY_UP ] )
        {
            ludek.ruch.teraz = RuchSkok;
            ludek.aktualna.V = - 50;
        }
       
        else
        {
            ludek.aktualna.predkosc.x = 0;
            ludek.ruch.teraz = RuchStop;
        }
       
        masked_blit( ludekbmp, bufor, 0, 0, ludek.aktualna.pozycja.x, ludek.aktualna.pozycja.y, ludekbmp->w, ludekbmp->h );
        blit( bufor, screen, 0, 0, 0, 0, screen->w, screen->h );
       
        //zwiêkszenie czasu
        //Sleep( 20 );//not found
        if( ludek.ruch.teraz != ludek.ruch.przed )
        {
            ludek.ruch.przed = ludek.ruch.teraz;
            ludek.start = ludek.aktualna;
        }
        ludek.aktualna.czas += 0.02;
        double deltaT = ludek.aktualna.czas - ludek.start.czas;
        //poni¿ej modyfikacja pozycji zgodnie z prawami fizyki (kinematyka)
       
    }
   
   
   
   
   
    destroy_bitmap( ludekbmp );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
 
P-60184
DejaVu
» 2012-07-16 16:53:25
Poczytaj lepiej o bibliotece box2d - jak chcesz pisać gry to wydaje mi się, że lepiej zacząć od składania gotowych klocków w całość, a nie pisać fizykę (i kolizje) od zera.
P-60190
ridic14
Temat założony przez niniejszego użytkownika
» 2012-07-16 17:16:02
a jaka biblioteka najlepiej współpracuje z box2d?
P-60191
Drraven
» 2012-07-16 17:23:24
Z tego co się orientuje:
-Allegro
-SFML
-SDL
-OpenGL (raczej też powinno)
P-60192
diego997
» 2012-07-16 17:31:05
@ridic14 jak się weźmiesz za Box2D to dawaj znać o postępach :D Wiele razy próbowałem do tego podejść ale bez skutku.
P-60195
ridic14
Temat założony przez niniejszego użytkownika
» 2012-07-16 17:31:37
instalacja:
box2d>>build>> i nie ma tu dla code blocks pliku libbox2d.a gdzie mogę takowy znaleźć
jak już to zainstaluje i ogarnę to może jakiś mały tutek powstanie
P-60196
« 1 » 2
  Strona 1 z 2 Następna strona