dynamiczna gra dla dwóch osób

0

Nie chodzi mi tu o grę typu quake ale o takie coś aby podczas grania w OX albo statki po kliknięciu przez gracza w pewne pole u drugiego pokazywał się efekt tego w miarę szybko (powiedzmy 1 sekunda). Problem w tym, że nie wiem jak wysłać do drugiego gracza informację o tym, że dana akcja została wykonana.

Jedyne co przychodzi mi na myśl to zapisanie do bazy danych informacji o tym, że ruch został wykonany a sam skrypt gry u obu graczy sprawdza za pomocą AJAX co sekundę czy taki wpis znajduje się w bazie danych.

Wydaje mi się jednak, że takie rozwiązanie jest nie najlepsze ze względu na to, że każda jedna gra musiała by mieć swój tymczasowy wpis w bazie a co gorsza co sekundę trzeba by się do niej odwoływać i sprawdzać czy drugi gracz wykonał ruch. Czy istnieją jakieś metody wymiany danych pomiędzy dwoma użytkownikami (coś w stylu p2p)? a może da się stworzyć jakąś oddzielną sesje na stronie poza logowaniem i użyć jej dla obu graczy. Chyba, że takie ciągłe odwoływanie się do bazy to normalnie stosowany pomysł?

Z góry dziękuję za wszelką pomoc.

0

http://stackoverflow.com/questions/493720/persistent-connection-using-javascript
Albo we Flashu + sam nie wiem czym po stronie serwera można pisać aplikacje stale "podłączone".
Szczerze to nigdy się tym nie interesowałem, a doświadczenie mam raczej ze standardowego klepania stronek niż webaplikacji.
Może są mądrzejsze metody ;)

0

Jeśli nie interesuję Cię starsze przeglądarki i ma działać tylko na nowych (a i do tego nie wszystkich) to masz WebSockets. Oprócz tego jest wiele bibliotek do JS, które ułatwiają takie coś (ale np. nie wiem czy long-pooling Cię zadowoli) np. Faye czy Juggernaut.

0

Świetny pomysł z tą grą. Technologia wybrana jak najbardziej trafnie. Teraz mamy bardzo ciekawe czasy, technologicznie. JavaScript jest na topie, a z nim bajery z szeroko pojętego HTML-a 5. Czyli po prostu nowych, otwartych standardów sieciowych, z API dostępnym z poziomu JavaScriptu.

Niestety, na prawdziwe P2P nie ma co liczyć. O ruchu gracza trzeba powiadamiać serwer i dopiero serwer może przekazać tę informację do pozostałych graczy. Powiadomienie serwera to prościzna (zwykły Ajax przejdzie), ale jak serwer ma powiadomić klientów...?

To odpytywanie serwera co sekundę, które wymyśliłeś (?), to znana, sprawdzona metoda, która działa w każdej przeglądarce. Zwie się polling (nie pooling!).

Nieco zmodyfikowaną wersją jest long polling. Polega na tym, że serwer nie odpowiada od razu, tylko przetrzymuje żądanie do upływu pewnej ilości czasu lub zajścia jakiegoś zdarzenia (np. ruch gracza). Kod po stronie klienta nie śle nowego żądania aż nie otrzyma odpowiedzi na stare, lub aż nie upłynie pewien ustalony okres czasu. Long polling jest nieco trudniejszy w implementacji, ale bywa (choć nie zawsze!) wydajniejszy/efektowniejszy. Do serwera idzie mniej żądań, więc sieć jest mniej obciążona. To jednak nie jest taka prosta kalkulacja, bo do równania dochodzi jeszcze koszt przetrzymywania żądań, wielowątkowości itd.

Long polling zadziała w każdej przeglądarce.

Nadal nie jest to jednak wygodna czy zaawansowana metoda.

Znacznie lepszy jest interfejs Web Sockets z HTML-a 5. Web sockety pozwalają na dwustronną komunikację z serwerem. Z poziomu JavaScriptu masz obiekt WebSockets i w nim np. zdarzenie onmessage. Prosto. Wygodnie. Więcej informacji: http://www.html5rocks.com/en/tutorials/websockets/basics/

Nieco inną technologią są Server-Sent Events (w skrócie SSE; piszę oryginalne nazwy, żebyś mógł wygooglać). Serwer wysyła wtedy zdarzenia do klienta, a po stronie przeglądarki, w JavaScripcie masz obiekt EventSource, do którego możesz rejestrować funkcje obsługi zdarzeń za pomocą addEventListener (przy czym zdarzeniem message oznacza, że serwer przysłał jakąś wiadomość). Więcej: http://www.html5rocks.com/en/tutorials/eventsource/basics/

Kolejnym sposobem jest jeszcze HTTP streaming, gdzie serwer nigdy nie kończy dokumentu i wysyła go na bieżąco, a my po stronie przeglądarki odczytujemy co i rusz np. ostatnią linijkę, która zawsze zawiera np. aktualne pozycje graczy. Nie jest to jednak zawsze obsługiwane przez przeglądarki.

Narzędzia z HTML-a 5 też nie są, ale zawsze możesz zrobić fallback na polling, albo po prostu olać przestarzałe przeglądarki. W przypadku gier -- można.

1 użytkowników online, w tym zalogowanych: 0, gości: 1