Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[VS\C++] Projekt gry na studiach, 2 podstawowe pytania.

Franek k 24 Apr 2012 21:40 1995 6
  • #1
    Franek k
    Level 15  
    Witam.

    Od razu przejdę do sedna sprawy :) Muszę wykonać na przedmiot z programowania w C++ grę, która stanowić będzie zaliczenie semestru. Gra może być jak najprostsza, coś w stylu mario, co komu przyjdzie do głowy. Ma to być wykonane w WFA. Ja jako że jestem samoukiem jeśli chodzi o programowanie, tak więc mam już z tym styczność od kilku lat. Chcę więc wykonać troszkę bardziej zaawansowaną gierkę :P Ma ona polegać na "pływaniu" statkiem i strzelaniu do jakichś tam celów, bez jakichś efektów specjalnych, niczym Battlefield 3, itp. Niby nic znowu takiego wielkiego ale chciałbym aby ta gra była trybu multiplayer, oczywiście jeżeli mi się uda, jak nie to zostanę przy singlu :P Nie chodzi tu o jakiś szpan czy coś w tym stylu ale już od jakiegoś czasu chciałem zrobić coś takiego, więc postanowiłem spróbować. I nie chodzi tu o jakiś rozbudowany multiplayer ale o możliwość strzelania do siebie pomiędzy 2 graczami, tyle wystarczy. Z zestawieniem połączenia nie będzie problemu już robiłem kilka czatów (mini gg), tak więc z przesyłaniem danych sobie poradzę.

    Mam za to 2 kluczowe pytania:

    1) Nie związane z multiplayer-em. Jako że statek będzie grafiką która będzie się poruszać, tak więc trzeba jakoś ją wprawić w ruch. No i właśnie tu zaczynają się pewne schody dla mnie. Chciałem do tego celu wykorzystać timer. Miało to działać tak że w funkcji wywołującej przez przerwanie timera, miałbym taki kod:

    Code: cpp
    Log in, to see the code




    obrazek się niby porusza ale, interwał timera ma ustawiony na 1 aby obrazek przesuwał się płynnie (nie było pokazu slajdów), jednak obrazek porusza się mimo to zbyt wolno a zmniejszyć interwału się już nie da. Tak więc teraz pytanie kluczowe za pomocą czego wykonać przesuwanie obrazka??

    2) Związane już z multiplayer-em. Jak powinna wyglądać komunikacja między dwoma aplikacjami (zakładam że jedna będzie "serwerem" druga "klientem")... kurcze, nie wiem jak dokładnie zadać to pytanie :P Może napiszę najpierw tak że ja myślałem nad czymś takim, że (chodzi mi głównie o poruszanie statkiem) serwer steruje statkiem obu graczy. a więc cały silnik gry, cała logika będzie wykonywana po stronie serwera, a do klienta będą wysyłane tylko współrzędne aktualnej pozycji obiektów (statków, itp) a więc klient będzie robił za taki wyświetlacz tego co dzieje się na serwrze; oczywiście będzie wysyłał też informację czy drugi gracz wcisną dany kalwisz, aby poruszyć statkiem, ale nie o to chodzi. Chodzi o to że ja do tej pory myślałem żeby wraz z przerwaniem timera (mówimy o aplikacji serwera) wysyłać współrzędne położenia tych obiektów do klienta. No ale przy tym interwale ustawionym na 1 byłoby to 1000 razy na sekundę, nie wiem czy nie za dużo. A tu jeszcze teraz się okazuje że trzeba by wysyłać szybciej bo obiekt poruszą się zbyt wolno przy tym 1000 razy. Tak więc chciałem zapytać czy ja dobrze rozumiem zasadę działania takiego multipalyera?? Czy faktycznie tak to się odbywa, że ileś tysięcy razy na sekundę serwer wysyła dane z współrzędnymi obiektów do klienta??


    Mam nadzieję że wyjaśniłem zrozumiale o co mi chodzi :) Podsumowując to są dwa zasadnicze pytania jak poruszać obrazkiem aby uzyskać efekt ruchu?? I jak wygląda zasada działania multpilayera?? Drugie pytanie bardziej jest skierowane do osób które tworzyły gry przez neta. Ale jeszcze raz zaznaczam jeżeli nie uda mi się zrobić multiplayera to trudno, nic nie szkodzi, ale chciałbym spróbować.

    I nie oczekuję napisania takiej gry za mnie, ale tylko proszę o teoretyczne wyjaśnienie tych kwestii.

    Za jakąkolwiek pomoc będę bardzo wdzięczy. Tak więc czekam z niecierpliwością na posty :)

    Pozdrawiam.
  • #2
    _alfred_
    Level 16  
    Franek k wrote:
    No ale przy tym interwale ustawionym na 1 byłoby to 1000 razy na sekundę, nie wiem czy nie za dużo. A tu jeszcze teraz się okazuje że trzeba by wysyłać szybciej bo obiekt poruszą się zbyt wolno przy tym 1000 razy.

    Czy ja dobrze rozumiem, że 1000 razy na sekundę, czyli 1 piksel co 1ms to jest dla Ciebie za mało na poruszanie statkiem? Przecież to jest 1000 pikseli na 1 sekundę.
  • #3
    Franek k
    Level 15  
    _alfred_ wrote:
    Czy ja dobrze rozumiem, że 1000 razy na sekundę, czyli 1 piksel co 1ms to jest dla Ciebie za mało na poruszanie statkiem? Przecież to jest 1000 pikseli na 1 sekundę.


    Właśnie chodzi o to że przy interwale od 1 - ~100 praktycznie nie widać różnicy w szybkości poruszania się obiektu, sprawdzałem przed chwilą. Zrobiłem jeszcze coś takiego, że umieściłem kontrolkę label która wyświetlała aktualny stan zmiennej a, za każdym wywołaniem funkcji przez timer. Jak się okazało w ciągu sekundy zmienna zwiększała swoją wartość o ~6. Więc w 1 sekundzie obrazek przesuwał się o ~6pikseli. Gdy zakomentowałem ten fragment kodu w taki sposób

    Code: cpp
    Log in, to see the code


    wartość zmiennej zwiększała się w ciągu sekundy o ~60. Prawie 10x szybciej. Wychodzi na to że w WFA nie da się zrobić gry :D jest po prostu problem z... ja to nazwę renderowaniem grafiki. Muszę się jeszcze upewnić w jaki sposób mamy robić te gierki, ale facet mówił że ma to być w WFA, może się pomylił a jak nie to będzie ciekawie. W każdym razie, przeczytałem na necie że do gier wykorzystuje się biblioteki takie jak Allegro 5, SDL, SFML...

    Więc najwyżej wykorzystam którąś z tych.

    Tak więc dziękuję za zainteresowaniem tematem i proszę jeszcze o poruszenie drugiego pytania związanego z tym niby multipayer-em :P oczywiście jeżeli ktoś coś na ten temat wie :)
  • #4
    Czebu
    Level 19  
    Franek k. Pisząc program do gry, musisz uwzględnić programowanie niskopoziomowe. Jeżeli wszystko już zrobiłeś co mogłeś, to znaczy, że trzeba przejść do jeszcze niższego poziomu. Wykorzystując elementy języka C. To jest programowanie w języku C++, z wykorzystaniem elementów języka C. Właściwie, to język C++ pochodzi od języka C. Stąd jest mały krok do języka asembler.
    Co do pytania 2. Nie jestem specjalistą w tej dziedzinie. Ani znawcą tej dziedziny, ale jedno mogę napisać. Dokładnie tak wyobrażam sobie tryb multiplayer. W grach chodzi o to, żeby jak najmniejszym kosztem zrobić bardzo wiele. Przecież ściąganie za każdym razem czegokolwiek nie ma sensu. Prosty przykład. Gramy w grę Counter Strike. Jeżeli nie masz jakiejś planszy, to ona ściąga się na twój komputer prosto z serwera. Następnie rozpoczyna się gra.
  • #5
    arnoldziq
    Moderator of Programming
    @Franek : Podchodzisz do tego ze złej strony.
    Powinieneś zrobić odwrotnie; na serwerze składować tylko niezbędne minimum informacji o grze... Natomiast wszystkie obliczenia robić po stronie klientów i synchronizować klientów poprzez serwer.
    Co do "powolnej" grafiki... Z tego kawałka kodu, który zamieściłeś, wynika że operujesz bezpośrednio na obrazie. To błąd. Poszukaj informacji o technice i zastosowaniu "doube buffer".
  • #6
    Czebu
    Level 19  
    arnoldziq. Czy te obliczenia są czymś w rodzaju obliczeń rozproszonych? Widzę, że pisanie w takich tematach z mojej strony to jest błąd. Ale napisałem czego się wcześniej dowiedziałem. Może warto jakoś bardziej nakreślić temat. Ja nie bardzo rozumiem. Nie wiem, jak Franek. I tutaj chyba będzie najlepiej z mojej strony, jak nie będę pisał.
  • #7
    arnoldziq
    Moderator of Programming
    Czebu wrote:
    arnoldziq. Czy te obliczenia są czymś w rodzaju obliczeń rozproszonych?
    Nie, po prostu trzeba uważać na generowany ruch pomiędzy serwerem a klientami. Część zadań, może być spokojnie wykonana po stronie klienta, i wysłana na serwer do synchronizacji z innymi klientami.
    Czebu wrote:
    Widzę, że pisanie w takich tematach z mojej strony to jest błąd.
    Nie rozumiem, czemu tak uważasz? :/
    Czebu wrote:
    Ale napisałem czego się wcześniej dowiedziałem. Może warto jakoś bardziej nakreślić temat. Ja nie bardzo rozumiem. Nie wiem, jak Franek. I tutaj chyba będzie najlepiej z mojej strony, jak nie będę pisał.
    Czemu miałbyś nie pisać? Po to jest to forum, żeby na nim pisać i w jakiś sposób przekazywać wiedzę...