Automatisch waardes toevoegen gebaseerd op een level.
Ik probeer een klein browser game te maken, maar ik wil graag dat de grondstoffen gebaseerd op een level (van gebouwen) toe worden gevoegd elke seconde. Ik ben nog niet heel erg bekend met javascript e.d., zou iemand mij op weg kunnen helpen?
Niet duidelijk.
Als je level 1 farm hebt moet er elke seconde 1 food bij komen, bij level 2 farm 4 food. Dit zijn de session variables voor de grondstoffen.
$food = $_SESSION['food'];
$wood = $_SESSION['wood'];
$stone = $_SESSION['stone'];
$gold = $_SESSION['gold'];
$lvl_food = $_SESSION['lvl_food'];
$lvl_wood = $_SESSION['lvl_wood'];
$lvl_stone = $_SESSION['lvl_stone'];
$lvl_gold = $_SESSION['lvl_gold'];
Maar....
Als ik dan als gebruiker 20 tabbladen in mijn browser open op je spel, dan worden mijn grondstoffen dus 20 keer per seconde opgehoogd. Dat is wel makkelijk verdienen :-)
Erwin H op 04/03/2013 17:06:43:
In javascript een interval van 1 seconde instellen en dan elke keer een ajax call naar de server versturen om de grondstoffen op te hogen.
Maar....
Als ik dan als gebruiker 20 tabbladen in mijn browser open op je spel, dan worden mijn grondstoffen dus 20 keer per seconde opgehoogd. Dat is wel makkelijk verdienen :-)
Maar....
Als ik dan als gebruiker 20 tabbladen in mijn browser open op je spel, dan worden mijn grondstoffen dus 20 keer per seconde opgehoogd. Dat is wel makkelijk verdienen :-)
Zou je me kunnen helpen met die js? Ik heb werkelijk waar geen idee hoe dat werkt, daarom kom ik hier. Ik heb alles afgezocht maar ik kan niet vinden wat ik wil.
En dat laatste, hoe is het anders op te lossen?
Dan kun je door middel van een join de waarden uit de database halen en die updaten. Zelf zou ik er een cronjob voor gebruiken en het niet elke seconde updaten. Maar bijvoorbeeld om de 5 seconden.
Om het spel voor de gebruiker up-te-daten kun je door middel van een request naar de server de data met een simpele query ophalen.
De tabellen
Gebouwen
- gebouw_id,
- naam
Grondstoffen
- grondstof_id,
- gebouw_id,
- naam
Levels
- level_id,
- grondstoffen_id,
- aantal_per_seconde
Gebouwen gebruikers
- gebruiker_id,
- grondstof_id,
- level_id
Grondstoffen gebruikers
- gebruiker_id,
- grondstof_id,
- aantal
Dan kun je dus ook meerdere grondstoffen per gebouw hebben als dat gewenst is. * Dit is gewoon even uit het hoofd, dus de tabellen kunnen er misschien wat anders uitzien. Het aantal grondstoffen dat een gebruiker heeft kun je ook eventueel in de gebouwen gebruikers opslaan. *

Waarbij het middelste vak al elke seconde update, maar ik hoef eigenlijk alleen te weten hoe de JS code eruit ziet voor de formule, dus het combineren van JS en PHP.
Gewijzigd op 04/03/2013 17:21:44 door Victor G
Wel als de grondstoffen in de database al geüpdate worden kun je door middel van een xhr request, $.post, $.get, $.ajax de data ophalen.
Aaron - op 04/03/2013 17:10:53:
Zelf zou ik er een cronjob voor gebruiken en het niet elke seconde updaten. Maar bijvoorbeeld om de 5 seconden.
Cronjobs werken niet met seconden maar met minuten.
Die upgedate data moet weer naar de database. Hij moet dus de formule elke paar sec uitvoeren, maar ik weet niet hoe mijn formule er uit moet zien door het combineren van PHP en JS.
Gewijzigd op 04/03/2013 17:25:23 door Victor G
Ohh SanThe. Dat wist ik niet. Nog nooit cronjobs gebruikt met zo'n kleine tijdspanne. Dan zou ik het gewoon iedere minuut doen, tenzei het echt elke seconde moet.
Viccie viccieg op 04/03/2013 17:08:16:
Zou je me kunnen helpen met die js? Ik heb werkelijk waar geen idee hoe dat werkt, daarom kom ik hier. Ik heb alles afgezocht maar ik kan niet vinden wat ik wil.
En dat laatste, hoe is het anders op te lossen?
En dat laatste, hoe is het anders op te lossen?
Het eerste, dat zou ik wel kunnen, maar dat is dan waarschijnlijk voor de kat z'n viool. Tenzij je het niet erg vindt dat iemand je zo makkelijk kan 'bestelen'. Als ik jou was zou ik me eerst druk maken over het tweede. Daar heb ik overigens geen antwoord op, maar dat concept is wel erg belangrijk. Dus ik raad je aan om eerst dat concept waterdicht uit te werken voor je je op de techniek stort.
@Viccie. Javascript wordt alleen uitgevoerd wanneer de gebruiker online is. Is dat wel hoe het moet zijn of moeten de grondstoffen ook geüpdate worden wanneer de gebruiker niet online is? Want dan kom ik toch terug uit bij cronjobs en anders een tabel met de update tijden (datetime met seconden). Alhoewel dit toch niet altijd heel erg accuraat zal zijn i.v.m. response time en dergelijke.
Ja ze moeten inderdaad updaten als de gebruiker offline is, kun je wat uitleg geven over cronjobs in dit geval?
Dus dan zal je moeten kijken naar PHP en het zo gaan update.
Toevoeging op 04/03/2013 17:45:49:
Je zou anders is naar een "Maffia game" moeten kijken, Google het is, bedoeld u dat?
Ik zal er naar kijken, in ieder geval bedankt voor de hulp tot zo ver.
In de database (ik zou zeggen in de grondstoffen gebruikers-tabel) hou je de timestamp bij wanneer je het laatst de grondstoffen hebt bijgewerkt. Zodra iemand een grondstof opvraagt, bereken je het verschil tussen de huidige tijd en de opgeslagen tijd in seconden (bijvoorbeeld time_to_sec(timediff(now(),grondstoffen_gebruikers.update_time) of zo) en dat vermenigvuldig je met aantal_per_seconde en tel je op bij het huidige aantal. Daarna werk je de update_time bij. Op die manier ziet iedereen altijd het juiste aantal grondstoffen.
Zeker wanneer je dit in een transactie doet, is dit ook bestand tegen gebruikers die 20 tabs open hebben staan.
Een hele mooie oplossing toon je daar. Alleen heb ik er maar een bedenking bij. Neem nu aan dat je 150 spelers online hebt en die requesten een pagina iedere minuut ongeveer 10 keer. Maar ook als er bijvoorbeeld iemand aangevallen wordt moeten er dingen berekend worden. Als dat zo is. Dan heb je ongeveer 1500 queries. Zou één query zoals de volgende niet beter zijn om de minuut qua server load?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
UPDATE
grondstoffen_gebruikers AS gg
INNER JOIN
grondstoffen AS g
ON
gg.grondstoffen_id = g.grondstoffen_id
SET
gg.aantal = gg.aantal + g.aantal
grondstoffen_gebruikers AS gg
INNER JOIN
grondstoffen AS g
ON
gg.grondstoffen_id = g.grondstoffen_id
SET
gg.aantal = gg.aantal + g.aantal
Dit is louter een vraag... Het zou ook kunnen dat het spel gewoon geüpdate moet worden omdat het dan realtime is zoals jij zegt.
Alvast bedankt
Als je dan 20 tabbladen in de browser open hebt staan, stopt het gewoon na een bepaald aantal behaalde grondstoffen in dat uur (gecontroleerd door de server).
Het volgende uur begint het weer van voor af aan met tellen hoeveel in het uur al is verdiend.
Je zou eigenlijk niet eens je server te hoeven belasten met een ajax call elke seconde.
Je doet gewoon de grondstoffen zichtbaar verhogen met javascript, maaar wat oinzichtbaar wordt bijgehouden op de server telt.
Zo zou wel de fout kunnen ontstaan dat het aantal grondstoffen dat javascript de gebruiker laat zien afwijkt van wat er in de database staat, maar dat is nooit echt meer dan 2 of 3 ofzo.
Met PHP reken je gewoon de tijd uit wanneer er een bepaald aantal grondstoffen is gehaald.
Alleen als er iets van de grondstoffen af moet (iets bouwen / kopen met de grondstoffen) dan doe je een ajax call, en berekent PHP opnieuw.
Gewijzigd op 04/03/2013 20:41:36 door Mark Hogeveen
Aaron - op 04/03/2013 20:27:45:
Neem nu aan dat je 150 spelers online hebt en die requesten een pagina iedere minuut ongeveer 10 keer. Maar ook als er bijvoorbeeld iemand aangevallen wordt moeten er dingen berekend worden. Als dat zo is. Dan heb je ongeveer 1500 queries. Zou één query zoals de volgende niet beter zijn om de minuut qua server load?
Je onderschat MySQL ;-)
Om je een indruk te geven: een van de servers die ik onderhoud is een doos van een paar jaar oud. Niet heel indrukwekkend: 2x quad-core Xeon 2.5 GHz met 8 GB geheugen en 250 GB harddisk. De afgelopen 137 dagen (19,5 week) heeft 'ie meer dan 3 miljard queries voor zijn kiezen gehad; gemiddeld 255 per seconde (en die belasting fluctueert tussen 0 en meer dan 1500 queries per seconde). De queries variëren van simpele inserts of selects tot queries waar een flinke stored procedure achter hangt.
MySQL is op die server overigens min of meer een bijzaak, want hij doet nog veel meer. We hebben de afgelopen vijf maanden nooit de indruk gehad dat hij het niet aankon.
Overigens verwacht ik niet dat die 150 online spelers je db-server platkrijgen door steeds dezelfde pagina te requesten. De caching van MySQL zorgt er wel voor dat er niet al teveel I/O plaatsvindt. En anders stop je de berekening (voor het gemak) in een stored procedure die maximaal eens per (bijvoorbeeld) 10 seconden een update doet.
Als je site al plat gaat door een aanval van spelers, verwacht ik eerder dat dat komt door overbelasting van je netwerk dan door MySQL.
Gewijzigd op 04/03/2013 22:09:54 door Willem vp
EDIT: Ik gebruik op dit moment localhost, dus cronjobs is niet mogelijk?
Gewijzigd op 05/03/2013 16:36:36 door Victor G