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

Dobre praktyki i zasady i rozwiązywanie problemów przy tworzeniu gier 2D

Ostatnio zmodyfikowano 2017-05-03 11:27
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Dobre praktyki i zasady i rozwiązywanie problemów przy tworzeniu gier 2D
» 2017-04-26 00:35:31
Witam. Jako, że mam więcej czasu postanowiłem spróbować napisać prostą platformówkę. Przypomniałem sobie jednak, że kompletnie nie wiem jak się do tego zabrać :c
Podam przykład:

Mamy funkcję skok. Jak wiemy, wykonuje się ona w kilkuset klatkach a nie jednej. Zatem za każdym razem, przed jej wywołaniem musimy sprawdzić, czy gracz nie koliduje z jakimś obiektem (ziemią, platformą, itd.)

Jak przechować informację, że kolidujemy/nie kolidujemy i wywołać funkcję skok? Miałem coś na wzór tego pomysłu (tylko schematycznie):
C/C++
bool czy_skok = false;
sf::Sprite gracz;
vector < sf::Sprite *> obiekty; // tu przechowujemy wskazniki do obiektow z ktorymi mozna kolidowac

//petla glowna

for( int i = 0; i < obiekty.size(); i++ )
{
    if( gracz.getPosition.x < obiekty[ i ].getPosition.x && gracz.getPosition.x >( obiekty[ i ].getPosition.x + obiekty[ i ].getLocalBounds.lenght ) ) // oraz y, czy jesteśmy "na" platformie/ziemi
    {
        czy_skok = false;
        break;
    }
    czy_skok = true;
}

if( czy_skok == true )
     skok(...);

if( strzalka_w_gore ) //jesli gracz wcisnie strzalke w gore to...
     skok(...);


Mam wątpliwości co do tego kodu. Są następujące problemy:
a) kilka faz skoku:

-odbija sie od ziemi
-jest w powietrzu
-spada

zauważmy, że kiedy stoi na ziemi (przed odbiciem sie od ziemi) też z ziemią koliduje. Z drugiej strony musi kiedyś spaść, wiec jeśli spadając będzie z czymś kolidował to ma przestać spadać. Wynika z tego, że stojąc (kolidując) nie bedzie mógł podskoczyć (co wynika z pętli)
Rozwiązałem to tak, ze NAJPIERW JEST SPRAWDZANE CZY KLIKNELISMY STRZALKE W GORE - jeśli klikniemy strzałkę w górę, to skoczymy (jesteśmy ponad ziemią, z niczym nie kolidujemy), a dopiero potem sprawdzane czy z czymś kolidujemy.

b) skok a spadanie
Mario idzie sobie po ziemi, po czym wskoczyl na platformę. Nie skacząc zszedł z niej (kolokwialnie - spadł). Tak więc w tym miejscu skoku nie będzie, tylko samo spadanie (choć mój kod wykryje to jako skok - z niczym nie kolidujemy)

c) gdzie trzymać zmienną mówiącą, z jaką prędkością podczas tego skoku się poruszamy. Oczywiście skok na wykresie powinien mieć postać sinusoidy.

d) nie można podskoczyć w powietrzu

e) możemy uderzyć o coś głową, mamy wtedy przestać lecieć w góre i zacząć spadać

Do sedna; czy jest jakiś kurs, strona - cokolwiek co pokazuje jak tworzyć gry i rozwiązywać tego typu problemy?
Bo chyba zasada działania jest taka sama? Widziałem, że często stosowane jest coś takiego jak update ale nie wiem, jak to działa.
Musi być coś, jakiś sposób pisania, dzięki któremu kod gry jest sensownie ułożony
Nie wyobrażam sobie, jak można dziś tworzyć tak skomplikowane gry, jak najnowsze produkcję, kiedy przy skoku w grze 2D jest tyle problemów.


P-160499
pekfos
» 2017-04-26 07:35:38
gdzie trzymać zmienną mówiącą, z jaką prędkością podczas tego skoku się poruszamy
No właśnie, gdzie? Na pewno nie w sf::Sprite. Czyżbyś potrzebował swojej klasy "obiektow z ktorymi mozna kolidowac"?

Oczywiście skok na wykresie powinien mieć postać sinusoidy.
Czyli jeśli nie wylądujesz na niczym, to masz automatycznie wzbić się ponownie w powietrze i potem znowu opadać? Jest na to lepszy termin z fizyki. I są na to wzory fizyczne. Czemu w ogóle zapominasz, że jest fizyka?
P-160503
Rashmistrz
» 2017-04-26 09:22:19
zauważmy, że kiedy stoi na ziemi też z ziemią koliduje.
To walnij sobie OnGround = true i sprawdzaj czy
koliduje od góry z podłożem. To też jest jakiś sposób.
P-160505
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-05-01 14:55:08
wziąłem sie w końcu za to, napisałem już funkcje skoku i spadania, ale miałbym jeszcze pytanie;
W platformówkach, np. mario mamy dużo obiektów na sporym obszarze:

1.
 jak zrobić poruszanie się postaci? Chodzi mi o to, że idziemy w prawo i pojawiają się kolejne obiekty. Da się zrobić jakieś "przesuwanie kamery"? Że nawet po wyjściu postaci za obramowanie okienka, np 1600x900 postać dalej będzie na środku ekranu?


2 .
jest też problem - a jakże - z kolizją. Nie wiem, czy takie rozwiązanie nie będzie za wolne:
badam, które obiekty są "widoczne" dla gracza, czyli w obrębie okna. To dla nich będzie badana kolizja. Niestety, tu zaczyna się problem:
Jeśli gracz będzie i skakał i biegł w prawo (czyli skakał na ukos) to może być problem dla wykrycia, czy najpierw uderzył głową, czy "wbiegł" w przeszkodę. Pomyślałem, że zrobie to tak:

W jednej klatce postać musi podskoczyć i przesunąć się w prawo:
C/C++
gracz.skocz();
gracz.wPrawo();

gracz.sprawdzKolizje();

Jednak jak pisałem, nie wiemy czy gracz najpierw wszedł, czy wskoczył w obiekt. Tu jest rozwiązanie:
C/C++
gracz.skocz();

gracz.sprawdzKolizje();

gracz.wprawo();

gracz.sprawdzKolizje();

Oczywiście wszystko w jednej klatce. Dzięki temu mamy złudzenie poruszania się na ukos, gdy poruszamy sie: prawa, gora, prawa, gora...

3.
Nie wiem tylko, czy dwukrotne sprawdzanie kolizji w tej samej klatce nie będzie zbyt zasobożerne. Wiem, wiem, w dzisiejszych czasach powstają gry "troszkę;)" bardziej obciążające procesor od mojej platformówki, ale mam na punkcie optymalizacji małą obsesję.

PS. oczywiście z której strony nastąpiła kolizja będzie sprawdzane przez składowe klasy, takie jak predkosc_y, predkosc_x.
P-160639
DejaVu
» 2017-05-02 21:34:21
Najpierw naucz się pisać czysty i prosty kod. Optymalizacje nie są ważne w momencie, gdy nie wiesz jak napisać prostą grę.
P-160670
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-05-02 22:06:27
Czyli po prostu mam pisać i uczyc sie przez praktyke?
P-160671
DejaVu
» 2017-05-03 00:13:03
Co do optymalizacji, na którą Ty masz ochotę to napisałem kilka zdań w temacie:
http://cpp0x.pl/forum/temat/​?id=25173

Możesz jeszcze trochę pogrzebać w historii:
Frazy, które należy wpisać w wyszukiwarkę google:

Np to:
http://cpp0x.pl/forum/temat/​?id=11110
P-160675
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-05-03 00:24:57
Ok, rozumiem. Nie będę na razie w takim razie zajmował się optymalizacją. Po prostu nie wiedziałem, czy nie będą tego kiedyś ode mnie wymagać na ewentualnych studiach, a czym skorupka za młodu nasiąknie... Ale pewnie masz racje, za wcześnie

W takim razie zostaje jeszcze jedno, z innej beczki, powiązane z pytaniem nr 1

Czy da się zrobić przesuwaną kamerę? To znaczy, chciałbym zrobić coś typu mario, a jak wiemy w mario (i kurcze każdej innej platformówce 2d!) idziemy w prawo a kamera przesuwa się za wąsaczem. No, jeśli to kamera się przesuwa, a nie teren razem z przeciwnikami, a jedynym poruszaniem sie hydraulika to skoki i animacja ruchu. Jak to jest? Da sie zrobić jakieś poruszanie kamery?
P-160676
« 1 » 2
  Strona 1 z 2 Następna strona