Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Gra internetowa w php
Forum PHP.pl > Forum > PHP
Stron: 1, 2
eMartio
Szkoda, że w php jesteśmy skazani na sesje, gdyż wszystko, co przechowuje informacje po stronie klienta, nie jest w 100% bezpieczne sad.gif

Przed chwilką zarejestrowałem się w ogame.pl. Widać gołym okiem, że gra wykonana w php (była taka dyskusja we wcześniejszych postach). Jedno, co mnie zaskoczyło, to to, że ID sesji przekazują w linku! Jest to szczyt głupoty, aż wierzyć się nie chce, że autorzy gry zrobili coś takiego. Pomimo, że maskują URL i pewnie używają JS do niedodawania strony do historii, i tak istnieje ryzyko, że gdzieś owy link utknie... Np. w na komputerze w kafejce internetowej. A mając id sesji już wiele nie potrzeba, aby komuś namieszać w grze smile.gif

Właśnie, czy ktoś wie jak zaprojektować optymalną klasę właśnie do uwierzytelniania?
NetJaro
Hmm.. co to jest "keszowanie zapytan" - chodzi tutaj o cache?
squid
Cytat(eMartio @ 2006-01-24 17:12:28)
Szkoda, że w php jesteśmy skazani na sesje, gdyż wszystko, co przechowuje informacje po stronie klienta, nie jest w 100% bezpieczne

nie nie jest w 100% bezpieczne. Jakas czesc aplikacji musi byc po stronie klijeta chocby kod html. Cookie mozna szyfrowac i nawet jak je przechwycisz to nie skorzystasz. Sesja w linku eliminuje koniecznosc trzymania cookie a jesli zakonczysz dzialanie przegladarki nawet znajac link z sesja nie dostaniesz sie do tego na co link wskazuje poniewaz serwer powinien skasowac plik sesji (lub rekord w db), jesli tak sie stanie zadne informacje przecowywane w sesji nie beda juz dostepne i powstanie blad poniwaz sesja o danym id nie istnieje.
Martio_L
Cytat(NetJaro @ 2006-01-24 15:38:51)
Hmm.. co to jest "keszowanie zapytan" - chodzi tutaj o cache?

Tak, chodzi o cache. Są tabele i dane w nich, które nie zmieniają się dość często, a więc po co pobierać je z bazy? Lepiej keszować smile.gif
Diwi
Mam pytanko wiem że parenaście postów wcześniej były już przykłady realizowania akcji które mają być wykonywane a najbliższym czasie. Czy ktoś ma jakiś sprawdzony i naprawde szybki sposób ?

Pozdrawiam
bigZbig
Cytat(eMartio @ 2006-01-24 17:12:28)
Jedno, co mnie zaskoczyło, to to, że ID sesji przekazują w linku! ... i tak istnieje ryzyko, że gdzieś owy link utknie... Np. w na komputerze w kafejce internetowej. A mając id sesji już wiele nie potrzeba, aby komuś namieszać w grze smile.gif

Po pierwsze sesje zwykle mają ograniczoną długość trwania. Wylogowanie zwykle konczy sesje Zatem przejecie identyfikatora sesji po tym jak ona juz wygasnie nie stanowi problemu. Po drugie jesli nawet sesje przechowywane są w $_SESSIONS lub bazie danych to jesli koles w kafejce nie wyloguje sie z gry i zostawi otwarta przegladarke internetowa to i tak mozna mu namieszac.
Ludvik
Sprawa akcji nie jest wcale taka trudna, jak mogło by się wydawać...

Wystarczy jedna tabela z kolejką akcji, w której zapisujemy:
1. Akcja do wykonania - tutaj jest problem z identyfikacją różnych akcji - zwykły licznik to trochę za mało przy dużej ilości akcji.
2. Identyfikator użytkownika, który wykonuje akcję.
3. Moment, w którym akcja powinna być wykonana.

Kiedy potrzebujemy danych użytkownika (w celu odbycia walki, szpiegowania etc.) wybieramy akcje wszystkich użytkowników, których informacje muszą być uaktualnione. Przetwarzamy je po kolei zgodnie z czasem wykonania.

Wcale nie trzeba w kółko przetwarzać całej kolejki. Pozostaje kwestia odśmiecania kolejki. Gracz, który przez miesiąc nie będzie grał nazbiera 1000 akcji, a kiedy będziemy chcieli podglądnąć stan jego konta trzeba obliczyć wszystko po kolei. Dobrym rozwiązaniem byłby jakiś prosty skrypt przetwarzający akcje uruchamiany przez crona na przykład co godzinę.

Drugie podejście...

Mamy już serwer gry (php w tym przypadku odpada). Nie musimy nic zapisywać w bazie, wystarczy na serwerze utworzyć kolejkę z akcjami. Obiekty akcji użytkownika nazwiemy UserAction. Interfejs wygląda mniej więcej tak:
Kod
int getTime(); // Zwraca znacznik czasu wskazujący na moment wykonania akcji.
void call(); // Wywołuje akcję

W momencie, w którym użytkownik żąda wywołania akcji obliczamy czas, w którym ma być wykonana i tworzymy obiekt akcji. Dodajemy akcję na koniec kolejki. Do przetwarzania potrzebujemy:
- Timera (czas aktualizacji to dokładność znacznika czasu, najczęściej 1s)
- Licznika, w którym zapiszemy ile sekund pozostało do wykonania pierwszej akcji w kolejce. Tak będzie szybciej niż pobierając za każdym razem czas z obiektu.
Zapisując to krokowo:
-- Ładowanie akcji --
1. Pobieramy znacznik czasu z pierwszego obiektu w kolejce.
2. Obliczamy różnicę: czas akcji - czas obecny. Zapisujemy wynik w liczniku.
-- Pętla licznika --
3. Sprawdzamy czy licznik nie jest niedodatni (może się tak zdarzyć, kiedy poprzednia akcja będzie wykonywana dłużej lub tyle samo co przerwa pomiędzy nią a następną). Jeżeli jest, wtedy przechodzimy do punktu 5.
4. Odejmujemy 1 od licznika, przechodzimy do punktu 3.
-- Wykonywanie akcji --
5. Wywołujemy akcję.
6. Gdy wykonanie akcji jest zakończone sukcesem, wtedy usuwamy pierwszy element kolejki (wykonaną akcję) i przechodzimy do punktu 1.

Wydaje mi się, że jest to w miarę wydajny sposób na wykonanie sekwencji akcji w czasie rzeczywistym. Timer nie pochłania zbyt dużej mocy obliczeniowej procesora. Jałowe przebiegi pętli licznika to tylko jedna instrukcja odejmowania i jedno porównanie, wykonywane w dosyć dużych odstępach czasu w porównaniu do złożoności obliczeń. Kolejka jest w tym wypadku bardzo wydajną strukturą, gdyż interesują nas tylko odwołania do pierwszego i ostatniego obiektu. Kolejne obiekty wiążemy w łańcuch przy pomocy referencji. Nie ma problemu z alokacją pamięci.

Wybór techniki zależy od wielu czynników... Mam nadzieję, że napisałem to jasno...
Vogel
Cytat(Ludvik @ 2006-01-25 20:46:56)
Mamy już serwer gry (php w tym przypadku odpada).

why? php w CLI i mamy zgrabny serwer.
R-T
chciałbym przypomniec pierwsze pytanie odnosnie kursów i tutoriali, najlepiej online
osin
chcialem zapytac czy jest na tym forum temat o robieniu gier internetowych dla początkujących questionmark.gif
Albo są w internecie moze jakies kursy czy poradniki prosze o szybką odp.
verio
Hmmm...... Skoro już poruszylście ten temat, to może pomożecie mi.
Planuję zrobić podobną stronkę, ale nie wiem jak zrobić takie odliczanie czasu, jakie jest na ogame przy np. budowie budynków. Wiem, że pozostały czas należy policzyć przez php, ale nie mogę znaleźć odpowiedniego skryptu w javascript. Może wy znacie? Proszę o pomoc.
neversoft
Zainteresował mnie ten temat. Mam pytanie co do np. "mapy wiosek" - taka jak znajduje się tutaj: http://www.plemiona.pl/intro.php?page=2&ref=intro

W jaki sposób to jest robiony. W celu zachowania płynności w przewijaniu mapy można zastosować ajaxa. Tylko jak zapisywać współrzędne nowego obiektu na mapie a poźniej je wyświetlić? Można by to trzymac w bazie ale czy to skuteczny sposób?
dethim
ja też mam zamiar napisać taką gre...bedzie to połączenie php + mysql + java script biggrin.gif
.radex
ale żeś odkrył Amerykę, dethim


--------
post nie wnoszący nic do dyskusji.
warning na Twoje konto
~Cienki1980

R4D3K
Co do kursów i nauki najlepszą nauką jest praktyka smile.gif A co zrobić gdy ciągle krążymy w kółko nie mogąc sobie poradzić problemem ? Korzystamy z praktyki i doświadczenia innych ==> ściągamy kody źródłowe. Jak chcesz się dowiedzieć w jakiś sposób jest to zrobione w ogame ściągnij sobie Ugamelle silnik gry ogame.
slepiec
witam wszystkich. Jestem slepiec, nieco doświadczony programista, student fizyki na UTP w Bydgoszczy.

R4D3K dzięki z info o silniki, sie sprawdzi.
Już dwa lata temu chciałem się zabrać za grę w php, wtedy był pierwszy boom na ogame. Jednak ciągle babrałem sie z bazą danych. Kilka razy dochodziłem do wersji pozwalających na budowanie budynków, a potem dochodziłem do wniosku że moje bazy były źle zaprojektowane. Teraz wracam do pomysłu gry napychając swoją głowę następną dawką pomysłów.

wiec może ruszając ten temat na nowo, zaczniemy od bazy. Po to tylko na początku wydaje się proste.
Choćby jak trzymać w bazie dane, że po wybudowaniu tego i tego budynku możesz wznieść jakiś inny.

co do Plemion ...wygląda jak Travian.
Luke_Star
Travian wygląda lepiej winksmiley.jpg Ja w swojej grze załatwiłem ten sposób w dwojaki sposób:a) Cron o ustalonych godzinach zeby skrypt dopisal wszystkie budynkiB) gdy gracz wchodzi na strone wykonywane sa standardowe checki czy cos juz sie nie skonczylo, ile powinien kasy dodac etc....Proste, w miare szybkie, ale moze ktos lepiej to rozwiazal.Dodam jeszcze tak na boku ze TEN WĄTEK i tak jest bogaty w informacje winksmiley.jpg. Szczerze powiedziawszy jezeli po przeanalizowaniu tych tresci wciąz sie nie wie jak to zrobic, to chyba lepiej podszlifowac umiejetnosci i zdobyc doswiadczenie niz faszerowac forum prawie takimi samymi problemami. Pewne charakterystyczne problemy ok, ale zeby od razu robić "projektowanie za raczke z Forum.php.pl". Przy robieniu swojej gry (wciaz jej nie skonczylem, natlok innych zajec) najistotniejsze chyba byly moje wlasne przemyslenia i doswiadczenia projektowe.
slepiec
Luck : a po co ci Cron ? jak user się loguje (czy też odświeża stronę) przeliczasz czy już budynek się wybudował, jak tak to przeliczasz ile powinieneś doliczyć surowców za czas od wybudowania do teraz. Podobnie z walką : wszystko można wyliczyć dopiero gdy jest to potrzebne; dopóki któryś z graczy nie sprawdzi wyników - tych wyników nie ma. Możesz sobie wyliczyć gdzie się spotkają wrogie okręty i kiedy (jeśli ci to potrzebne) i jeśli żaden z graczy nie wycofa armii to sprawdzasz wyniki walk między nimi - nie musisz ich śledzić co chwilę.Luck : a po co ci Cron ? jak user się loguje (czy też odświeża stronę) przeliczasz czy już budynek się wybudował, jak tak to przeliczasz ile powinieneś doliczyć surowców za czas od wybudowania do teraz. Podobnie z walką : wszystko można wyliczyć dopiero gdy jest to potrzebne; dopóki któryś z graczy nie sprawdzi wyników - tych wyników nie ma. Możesz sobie wyliczyć gdzie się spotkają wrogie okręty i kiedy (jeśli ci to potrzebne) i jeśli żaden z graczy nie wycofa armii to sprawdzasz wyniki walk między nimi - nie musisz ich śledzić co chwilę.
Luke_Star
slepiec tylko ze cron jest uzywany wtedy dy trzeba wykonac statystyki dla gry winksmiley.jpg bo co gdy jakis gosciu si enie loguje przez 2 tydnie a ma mnostwo punktow mniej? ja Crona smiem uzywac max 4 razy dziennie co 6h, zapewnia dynamike i srednie obciazenie dla bazy, a pozwala czesto zaoszczedzic wiele miejsca np na danych tymczasowych.
kula
Co to akcji w czasie w grach typu ogame:

WG mnie wszystko odbywa się przez wyzwalanie obliczeń tylko poprzez odświerzanie stron.
Ktoś tu napisał: "Jak spada drzewo w lesie i nikogo nie ma w okolicy co czy słychać hałas?"
zgadzam się z nim w 100%.

Wszystkie obliczenia to banał:

Przyrost surowców:

dane:
-nazwa
-ostatni czas przeliczenia
-parametr przyrostu
-ilosc

POST->
1. ilosc += (Now - ostatni czas przeliczenia) * parametr przyrostu
2. ostatni czas przeliczenia = Now



Bitwa

dane:
-cel
-nasza flota
-czas bitwy
-raport
-czas_odlotu_celu (jak obronca zabiera flote zostaje slad)

POST
1. przelicz surowce na atakowanej planecie
2. przelicz przyrost jednostek na atakowanej planecie
3. jeśli brak raportu i czas_bitwy<NOW oraz czas_odlotu_celu >= czas_ataku to oblicz_bitwe


Pozdrawiam.
.radex
odkopywanie starych tematów jest nielubianą praktyką, ale mniej więcej trafiłeś w sedno działania... Z tym, że w nowszych grach jest to dużo bardziej skomplikowane...
omegan
witam

skoro jest tu mowa o grach w php to przyznam sie ze tez kiedys myslalem o stworzeniu takiej gry, tylko mam takie jedno pytanie nad ktorym zawsze sie zastanawialem, moze mi odpowiecie, a wiec jak to jest zrobione w tych grach php ze np dwoch uzytkownikow walcza ze soba czy cos tam rewalizuja ze soba i na jakiej podstawie jest wyciagany zwyciezca tego pojedynku ? chodzi mi o php jak to jest zrobione w php ze jeden z nich wygrywa, na co jest brane pod uwage i na jakiej zasadzie jest wyciagany zwyciezca ?

z gory dziekuje za odpowiedz, pozdrawiam
colinQ
to zależy co masz w tej grze...

Jeśli masz np. bronie, sile i wytrzymałość to to jest brane pod uwagę...

wiesz, rozwiązania są różne...

Wszystko opiera sie na obliczeniach...

Wyciąga się dane z bazy, oblicza się czy wygra (po przez porównanie broni, siły i wytrzymałości) i zazwyczaj oblicza sie ile energii i życia mu to zabierze, wstawia sie zegarek w JS smile.gif
Rufus009
Nagle wszyscy chcą napisać własną grę online blinksmiley.gif ... Aby ją napisać trzeba logicznie myśleć. Ale jak nie wie się nawet w jakich językach chce się napisać grę, to nie radzę się zabierać za jej pisanie. Sam jestem w trakcie pisania takiej gry. Może kiedyś pokażę na forum.

Pozdrawiam guitar.gif ...
colinQ
Ja też tongue.gif Już kilka procent mam tongue.gif;

Tematyka: II Wojna Światowa;

Języki: PHP, MySQL, xHTML, CSS, JavaScript, (może z Ajaxa skorzystam);

Na forum gdzieś jest nawet projekt biggrin.gif;
Rosiv
Witam chciałbym odświeżyć trochę ten wątek. Proponuję stworzyć grupkę programistów którzy zajęli by się projektem stworzenia gry internetowej. Wiem sporo o mechanizmach w grach typu Ogame jednak w pojedynkę niczego wielkiego nie zdziałam z racji braku czasu jak i czasem pomysłów. W grupce zawsze można coś przedyskutować i wybrać najlepsze rozwiązanie. Poza tym można zrobić podział obowiązków by każdy zajmował się osobnymi elementami w grze. 

W internecie choćby na tym forum jest taki ogrom informacji, że dla chcącego nic trudnego smile.gif 

Myślę że na początek przydali by się:

1. Osoba odpowiedzialna za kształt bazy danych i jej optymalne działanie

2. Osoba sprawnie pisząca zapytania do bazy w PHP (przydała by się znajomość uniemożliwienia SQL Injection)

3. Javascript i Ajax

4. Osoba od Designu strony - mile widziany talent do robienia grafiki

Założyli byśmy forum i tam dyskutowali, ewentualnie kanał na IRCu. Oferuję hosting na grę z dowolną liczbą bazy danych.

Chętnych proszę o pw, najlepiej z numerem gg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.