Autor Zpráva
game
Profil *
Pekný večer,robím si vlastnú amatérsku online hru,narazil som na problém stavania budov,neviete ako to funguje už v existujúcich online hrách?mňa napadá len do db uložiť nejaký čas ked to má byť uložené a potom pomocou podmienky if overiť či už je toľko alebo viac a potom ak je tak aby upgradovalo mysql úroveň budovy,ibaže tak by to nešlo pretože aj keby to spúšťam cronom každú sekundu aby systém overoval všetky stavania či už skočili tak potom neviem ako by systém mal rozoznať že kde má u akého nicku zmeniť riadok v db,jediné možno pomocou session nick ibaže tá by sa zmazala ked by dotyčný zavrel prehliadač:(neviete niekto pomôcť?
DarkMeni
Profil
Možná bude dobrý nastavit aktualizaci po zobrazení profilu vesnice (jestli je ta hra něco jako DK nebo ********) a nebo až po přihlášení/zobrazení stránky hráčem.
undisputed
Profil
No len to by nebolo vhodné riešenie pretože ak by mal niekto produkciu napr 50za hodinu rozšíril by na 250 a zmenilo by mu to až po tom ako sa znova prihlási by mu dosť stratil na tom,
Rozmýšľam teraz nedalo by sa to spraviť že by sa session uložila platnosť na napr 3mesiace?
DarkMeni
Profil
Jak jsi to myslel s tím příkladem že by ztratil?
K Session: na 3 měsíce? No, možná ale mam pocit že po zavření okna se ta sessiona zruší.
undisputed
Profil
K tým surovinám si predstav produkuješ 100za hodinu dáš stavať tak aby ti produkovalo 500za hodinu,prídeš tam za 5hodín s tým že si myslíš že budeš už mať
5hodín krát 500 ale budeš mať len 5hodín krát 100,
k tej session neviem to bol len návrh preňho neviem ako to presne funguje
DarkMeni
Profil
Aha, se surovinama máš pravdu, ale když nastaví aby se ukládal čas poslední akce, a potom po přihlášení aby se mu to vypočítalo a přidalo tolik surovin kolik se mu mezitím vyprodukovalo, například:
Byl tu ve 14:00
Produkci má 5ks/vteřina
Vrátí se v 20:30
Vapočítá se počet vteřin od 14 do 20:30 a to se vynásobí produkcí ks/s.
Vypadá to docela jednoduše, kód by byl možná trochu hrozivý ale mam pocit že zrovna tak nějak to v těch prohlížečových hrách dělají, možná sem-tam nastaví pingnutí serveru a nebo vstup ajaxem.
1Pupik1989
Profil
Stačí odpočítávání javascriptem na pozadí a při dosažení času odeslat AJAXem požadavek do databáze. Z databáze pak znovu vyčíst hodnotu a jedeme. Možná ani načítat hodnotu není potřeba, jelikož při reloadu se stejně načte znovu, takže stačí akorát javascriptem přidat do proměnné momentální produkci.
miskith
Profil
Já bych to dělal tak, že bych odpočítával přes JS, ale do databáze to neukládal (kvůli programům zrychlující čas prohlížeče -> rychlejší produkce). Místo toho bych vždy při aktualizaci podle posledni aktualizace přepočítal pomocí PHP aktuální počet surovin. A nebo pokud by uživatel/hráč čekal (přes JS) až mu naběhne třeba 1000 od nějaké suroviny a pak dal postavit (tudíž by neměl v databázi aktuální stav surovin), přepočítal bych to pomocí AJAXu.

PS: SESSION jde nastavit doba expirace stejně jako u cookie.session_set_cookie_params()
Darker
Profil
Co se týče časem daného stavění/produkce v reálném čase, data se obvykle generují až když se někdo zeptá (jak říkal [#6] DarkMeni)
Totéž platí pro budovy. Jelikož stavba budovy (a při jednodužším herním enginu i produkce surovin) je lineární, nemusíš nic načítat a spočítáš si to pro zobrazení u klienta (pokud například chceš aby viděl timeout u stavějící se budovy).
game
Profil *
Aha,ďakujem za odpovede.
Ale pre začiatok by som to asi vyriešil najľahšou možnosťou pre mňa a to nastavenim asi tej session,teda pomocou
session_set_cookie_params
()
Ako to nastaviť nejak bližšie?lebo keď by som to tam len tak dal by mi to ťažko išlo.diky
game
Profil *
Môže niekto napísať ako to nastaviť ?
miskith
Profil
Pod jménem funkce, který jsem zaslal výše, se nachází odkaz na oficiální PHP podporu, kde máš v "komentářích" hromadu příkladů.
Jinak by také šlo nastavit trvání session přes běžné vytváření COOKIES, kdy bys zadal hodnotu odpovídající SESSION ID.
game
Profil *
No cookies nechcem..,a na ten link veď práve ked to tam len dám tak mi nič nefunguje
DarkMeni
Profil
1Pupik1989:
Stačí odpočítávání javascriptem na pozadí a při dosažení času odeslat AJAXem požadavek do databáze
AJAX = Asynchron JavaScript XML
To by šlo taky, a bylo by to dynamické, ...Ale co kdyby měl uživatel JavaScript vypnutý? Pak by to už byl problém a na řadu příjde matematika v PHP a poslední záznamy z databáze.

A to mě přivedlo k odtázce která se k tématu moc nehodí ale: Existuje způsob jak zjistit jestli má uživatel zapnutý JS a podle toho podřídit běh PHPka?
game
Profil *
Ako to mám teda nastaviť?mám v session nick uložený nick,z návodu som našiel len toto:
session.cookie_lifetime=86400;
Ale ked to tam takto dám tak nič nefunguje takže neviem ako to treba spojazdniť
DarkMeni
Profil
Session ti zajistí aby si prohlížeč pamatoval že ten a ten člověk tu byl nebo je přihlášený, ale jestli chceš aktualizovat stav výstavby budov tak se bude hodit buď nějaké pingnutí serveru a nebo projet ty budovy toho člověka pokaždý když někdo zapne jeho profil nebo když se přihlásí, a když tam bude nějaký výsledek, jako že ten hráč nějakou budovu staví tak zkontrolovat od kolika se staví, jak dlouho se má stavět a kolik hodin je teď a popřípadně tu budovu z buildlistu smazat a hráči na tý budově zvýšit level nebo jí nechat tak jak je v případě že podmínka nebude platit.

Doufám že jsem správně pochopil co chceš udělat.
game
Profil *
Keď si do session uložím nick,a v skripte budem kontrolovať či už je určitý čas ktorý budem mať v db a budem ten skript opakovať cronom tak mi to bude fungovať len potrebujem tu session spraviť
DarkMeni
Profil
No ten nick můžeš uložit i do nějaké tabulky v databázi, a změní se jen to že ho pak nebudeš tahat $_SESSION ale mysql_query("SELECT ..."); a navíc mam pocit že k $_SESSION se jen tak nedostaneš.
miskith
Profil
Pokud vím, tak CRON se k SESSION přihlášeného uživatele nedostane, protože CRON se nespouští pod návštěvníkem/hráčem, ale pod serverem. Asi si pleteš CRON a JavaScript. JavaScript můžeš volat každých x vteřin/minut/... na straně uživatele/hráče.

A to s tím COOKIES na prodloužení lifetimu SESSION sem myslel nějak takto (ano, takto to funguje, ale mělo by i přes tu funkci... Asi něco špatně děláš):
setcookie("PHPSESSID", $session_id, $lifetime, $path, $domain, $secure, $httponly);
game
Profil *
Aha no spravil som to teda tak ako niekto písal,
Že vždy si len do db uložím čo sa stavia a u akého hráča a tým je to vyriešené,lebo v skripte kontroluje len či už nejaký cas skončil a ak hej tak updatetne db,a ten skript opakuje cron
1Pupik1989
Profil
DarkMeni:

Dal bych jako podmínku spuštěný javascript. Bez javascriptu už snad žádná hra nefunguje (žádná větší). Samozřejmě bourání a upravování stavící fronty by šlo jen PHP + skript do DB + redirect zpět, ale hezčí je, když člověk klikne a je to nastavené. Já osobně to mám javascriptem a ajaxem. Vyčtu hodnoty z DB a akorát odpočítávám. Ke každé další položce akorát přičtu čas té předešlé, aby se nestavili zároveň.
DarkMeni
Profil
Ale dá se phpkem vůbec zjistit jestli uživatel má nebo nemá zapnutý js a včas to "zabít"?
1Pupik1989
Profil
<noscript></noscript> a mezi to hodit přesměrování v hlavičce nebo přesměrování meta tagem. Víc mě zatím nenapadá. Další možnost by byla věci v JS generovat přímo JS. Třeba udělat hlášku že JS není aktivovaný jsem dělal přes div s display:block a javascriptem mu nastavil hodnotu na none, takže zmizel.
miskith
Profil
Funkce get_browser() by to podle php.net měla také zjistit. Osobně jsem ale nikdy nezkoušel.
DarkMeni
Profil
Z nějakého důvodu mi tenhle kód u javascriptu napíše pokaždý 1, když js bude zapnutý ale i když zapnutý nebude.
	$browser = get_browser(null,true);
	print_r($browser);

Takže tohle asi jen zjistí jestli prohlížeč js podporuje.
Nox
Profil
Proč vyhazovat lidi bez JS?
Proč to zjišťovat v PHP?
Není důvod

Vymysli to tak aby nepřítomnost JS nic nekazila a bude - JS stejně nesmí samo spustit nějakou akci bez toho aniž by to minimálně validoval server, jinak si ti takhle každý nakliká budov kolik bude chtít

Takže JS bude třeba jen zjišťovat jestli je něco nového a pokud JS nebude, tak si uživatel prostě bude refreshovat když si vzpomene

OGame to má třeba tak že pokud jakýkoli časovač dojede na 0 tak se zamění za "hotovo" a stránka se normálně refreshne
Případně to můžeš prostě překreslit (tohle by zrovna byla pohoda pomocí Nette)

Do databáze rozhodně ANO - resp. do persistentního (trvalého) úložiště, což cookies, sessions, atd. nejsou (persistentní jsou soubory, databáze (kromě enginu MEMORY)...)

Pokud to dáš do session - smažu si cookies a přijdu o budovy, nebo změním prohlížeš/počítač na dýl a přijdu o budovy atd. Navíc tyhle věci by se měly brát jako že je je možné smazat (cookies, sessions, cache a generovaná data atd.) a nemělo by to ovlivnit chod aplikace

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0