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ę.
|
#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 ) ); 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.teraz = RuchStop; ludek.przed = ludek.teraz; BITMAP * ludekbmp = NULL; BITMAP * bufor = NULL; ludekbmp = load_bmp( "ludek.bmp", default_palette ); bufor = create_bitmap( 640, 480 ); while( true ) { 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 ); 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; } destroy_bitmap( ludekbmp ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
kubawal |
» 2012-07-16 08:08:18 Popatrz sobie na klasę SObiekt, a później na ten fragment ludek.teraz = RuchStop; ludek.przed = ludek.teraz;
Coś tu się nie zgadza! |
|
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 struct SObiekt { SFizyka start; SFizyka aktualna; }; na struct SObiekt { SFizyka start; SFizyka aktualna; SFizyka ruch; }; ludek.ruch.teraz = RuchStop; 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ć?! #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 ) ); 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 ) { 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 ); 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; } destroy_bitmap( ludekbmp ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
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. |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2012-07-16 17:16:02 a jaka biblioteka najlepiej współpracuje z box2d? |
|
Drraven |
» 2012-07-16 17:23:24 Z tego co się orientuje:
-Allegro
-SFML
-SDL
-OpenGL (raczej też powinno) |
|
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. |
|
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 |
|
« 1 » 2 |