Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obliczenia w grze czasu rzeczywistego
Forum PHP.pl > Forum > PHP
Yorki
Witam, pisze grę w php i zastanawiam się jak rozwiazać problem obliczeń..

Pewnie każdy z was grał lub widział gry takie jak ogame, plemiona, travian itd. Ja pisze podobna grę w której będą występować surowce, surowce te będą obliczane na podstawie aktualnego poziomu rozbudowania budynków. Wiem, że muszę uwzględnić wszystkie zdarzenie w grze, np. odjęcie surowców przy budowie, napadzie etc.

Ale zastanawiam się w jaki sposób je najlepiej obliczać. Myślałem nad tym, aby zapisywać w bazie datę ostatniego update'u tychże surowców co wynika z faktu, że miałyby być aktualizowane gdy następuje jakaś akcja ze strony gracza, bądź wymuszona przez inne zdarzenia (ataki, zmiana poziomu budynków). Jednak pierwszą rzeczą o której pomyślałem to: "Co jeśli gracz będzie odświeżał stronę w bardzo małych (ms) odstępach czasu?". Na liczbach całkowitych nie będę w stanie określić czy dodać mu już ten jeden surowiec czy jeszcze nie na podstawie kilku ms. Surowców może być bardzo duża ilość, dlatego odpada opcja zapisywania ich jako DOUBLE.

Można je zapisywać jako całkowite, a w osobnej kolumnie ich miejsca po przecinku, ale to zbyt dużo zabawy.

Drugą opcją mogłoby być zapisywanie ich zmiany tylko podczas większych zdarzeń, a nie samego refresh'u strony (dość rozsądna opcja).

Inną opcją może być napisane osobnego serwera w c++, który będzie operował na tej bazie i robił obliczenia. CRON wg. mnie odpada, bo to zbyt dużo obliczeń i wczytywanie wszystkiego za każdym razem z bazy to masakra dla serwera.

Wartym zastanowienia się tematem są zdarzenia, bo wyobraźmy sobie sytuację :

-> 12:00:00 - Logout
-> 12:36:21 - Atak i zrabowanie surowców
-> 12:47:33 - Budowa kopalni dobiegła końca, a więc zmiana produkcji / h
-> 12:56:11 - Powrót floty z łupem
-> 13:01:11 - Magazyn zapełniony
-> 13:13:01 - Budowa magazynu dobiegła końca (do tego czasu produkcja była wstrzymana)
-> 13:30:00 - Login

I teraz trzeba wszystko obliczyć i uwzględnić każde zdarzenie po czym podać aktualny stan surowców..

Zastanawiam się która opcja jest lepsza? Obliczenia podczas akcji ze strony gracza? (w międzyczasie wszystko pozostaje "zawieszone?"). Czy może napisanie serwera w C++ i aktualizacja na bieżąco?

Czy ktoś ma doświadczenia w pisaniu gier przeglądarkowych i mógłby mi posłużyć pomocnymi radami i pomysłami?
webświr
tak sobie błądzę po sieci i znalazłem ten temat, w linkach podanych w postach wyżej znalazłem silnik do gry przeglądarkowej mam problem z jego konfiguracją nie wiem co DOKŁADNIE mam tu wpisać

<?php
$host =
$user =
$pass =
$nazwa =
$adminMail =
?>

jest to trzeci krok na odpalenie silnika proszę o wskazówki
Kshyhoo
Cytat(webświr @ 23.03.2012, 21:48:59 ) *
tak sobie błądzę po sieci i znalazłem ten temat, w linkach podanych w postach wyżej znalazłem silnik do gry przeglądarkowej mam problem z jego konfiguracją nie wiem co DOKŁADNIE mam tu wpisać

<?php
$host =
$user =
$pass =
$nazwa =
$adminMail =
?>

jest to trzeci krok na odpalenie silnika proszę o wskazówki

Aż mnie korci, żeby sobie pokpić...
$host = nazwa hosta (zazwyczaj localhost)
$user = pewnie login do bazy
$pass = pewnie hasło do bazy
$nazwa = pewnie nazwa bazy
$adminMail = Hmmm, niech pomyślę... szklana kula podpowiada, że email do admina
webświr
nazwa bazy tu dałem ciała zaraz sprawdzę czy odpali smile.gif

to by było zbyt piękne by wszystko tak od razu ruszyło
  1. <?php
  2. $host = "ftp.jcom.pl";
  3. $user = "jcom_10433081";
  4. $pass = "xxxx";
  5. $nazwa = "jcom_10433081_aaa";
  6. $adminMail = "djzwieracz@wp.pl";
  7. ?>


co mogłem wpisać źle ?

wyskakuje mi błąd połączenia z hostem

Próbowałem też tak
  1. <?php
  2. $host = "localhost";
  3. $user = "jcom_10433081";
  4. $pass = "xxxxx";
  5. $nazwa = "jcom_10433081_aaa";
  6. $adminMail = "djzwieracz@wp.pl";
  7. ?>
  8.  
Kshyhoo
Cytat(webświr @ 23.03.2012, 22:03:08 ) *
$host = "ftp.jcom.pl";

co mogłem wpisać źle ?

wyskakuje mi błąd połączenia z hostem

To forum o PHP a nie wróżb.
webświr
Cytat(Kshyhoo @ 23.03.2012, 22:22:34 ) *
To forum o PHP a nie wróżb.


Tak rozumiem że lubisz sobie pokpić ze świeżaków co oczywiście zaakcentowałeś w poprzednim poście ja jednak poszukuję zrozumiałych dla mnie informacji jeżeli nie chcesz pomóc nie pisz, po co męczyć klawiaturę.
markonix
Masz złe dane. Niby jak Ci lepiej pomóc?
Oczywiście $host = "localhost"; jest prawidłowe.
webświr
Nie wiem już czy ten hosting jest niekompatybilny z silnikiem czy ja coś źle wpisuję, założyłem nawet drugie konto na hostingu żeby wszystko zrobić od początku ale też nic nie wychodzi.
Yorki
Wracając do tematu, rozwiązałem to w sposób o którym pisałem (zapisywanie całości, a w osobnej kolumnie części po przecinku), może komuś kiedyś się przyda wink.gif

  1. public function calcProduction()
  2. {
  3. $time_now = getTimestamp();
  4. $rows = Engine::$DBase->query("SELECT * FROM resources as r JOIN village_build as b ON r.vid=b.village AND r.bid=b.build JOIN builds ON r.bid=builds.bid WHERE r.vid=?", array($this->id), true);
  5. $result = new Resources();
  6. foreach($rows as $row)
  7. {
  8. $last_update_time = $row->last_update;
  9.  
  10. $resource = array (
  11. "count" => $row->count,
  12. "dot" => $row->after_dot
  13. );
  14.  
  15. /*
  16. Last Update This is now
  17. ----------- -----------
  18. | < - - - - - - - Time passed - - - - - - - - - > |
  19. --|-------------------------------------------------|------->
  20. | |
  21. 1123.222 < < 1000.53 > > 2123.752
  22. */
  23.  
  24. //Time passed (seconds + 6 numbers after "dot" as ms)
  25. $time_difference = $time_now - $last_update_time;
  26. $time_passed = array(
  27. "sec" => (int)substr($time_difference, 0, strlen($time_difference)-6),
  28. "ms" => (int)substr($time_difference, strlen($time_difference)-6, 6),
  29. "time" => (double)substr($time_difference, 0, strlen($time_difference)-6).".".substr($time_difference, strlen($time_difference)-6, 6)
  30. );
  31.  
  32. //Production
  33. $production = array (
  34. "base" => $row->base_production,
  35. "mult" => $row->mult_production,
  36. "sec" => $row->base_production,
  37. "new" => array (
  38. "res" => 0,
  39. "count" => 0,
  40. "dot" => 0
  41. )
  42. );
  43.  
  44. //Production per second
  45. $lvl = 1;
  46. while($lvl++ < $row->lvl)
  47. $production['sec'] *= $production['mult'];
  48. $production['sec'] /= 3600;
  49.  
  50. //Resources produced within time passed
  51. $production['new']['res'] = $time_passed['time'] * $production['sec'];
  52. $production['new']['dot'] = $production['new']['res'] - floor($production['new']['res']);
  53. //(double)substr( $production['new']['res'],
  54. // strpos($production['new']['res'], '.')+1,
  55. // strlen($production['new']['res']) );
  56. $production['new']['dot'] += $resource['dot'];
  57. $production['new']['count'] += floor($production['new']['dot']);
  58. $production['new']['dot'] = $production['new']['dot'] - floor($production['new']['dot']);
  59. $production['new']['count'] += floor($production['new']['res']);
  60. $production['new']['count'] += $resource['count'];
  61.  
  62. switch( $row->rid )
  63. {
  64. case 1: //wood
  65. $this->wood = $production['new']['count'];
  66. $this->wood_dot = $production['new']['dot'];
  67. $result->setWood($this->wood, $production['new']['dot']);
  68. break;
  69. case 2: //stone
  70. $this->stone = $production['new']['count'];
  71. $this->stone_dot = $production['new']['dot'];
  72. $result->setStone($this->stone, $production['new']['dot']);
  73. break;
  74. case 3: //iron
  75. $this->iron = $production['new']['count'];
  76. $this->iron_dot = $production['new']['dot'];
  77. $result->setIron($this->iron, $production['new']['dot']);
  78. break;
  79. case 4: //gold
  80. $this->gold = $production['new']['count'];
  81. $this->gold_dot = $production['new']['dot'];
  82. $result->setGold($this->gold, $production['new']['dot']);
  83. break;
  84. }
  85. }
  86. return $result;
  87. }
webświr
adres mysql na jatsu to sql111.jcom.pl a nie localhost, ale okazało się że silnik jest bardzo uproszczony więc gra okazała się nie warta świeczki
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.