Grondstoffen
Inhoud
- 1 - Wiskunde
- 2 - SQL
- 3 - Javascript
Een veelvoorkomende vraag, vooral bij het maken van een webbased spel, is de volgende:
"Hoe zorg ik ervoor dat mijn grondstoffen met een bepaalde hoeveelheid per tijd toenemen?"
Op deze pagina wordt het principe ervan uitgelegd. Gebruik geen Cron! Dan is je teller zelden up-to-date en het is veel meer werk voor je server. Als voorbeeld gebruik ik goud, met markplaatsen die goud genereren. Elke marktplaats brengt 6 goud op per uur.
Wiskunde
Stel de speler heeft aan het begin 10 goud en 2 marktplaatsen. Er komt dus 12 goud per uur bij. Als we nu op een willekeurig ander moment kijken, kunnen we makkelijk bepalen hoeveel goud de speler heeft: Kijk hoeveel uur er tussen nu en het begin zit, kijk hoeveelheid goud er per uur komt, vermenigvuldig dat en tel het op bij 10. Dit is een zeer kleine rekensom die niets aanpast in de database.
goud = begingoud + ( uren_tijdverschil * productie_per_uur )
Je kan natuurlijk ook in andere eenheden werken dan uren, zolang ze maar overeenkomen in tijdverschil en productie.
Let op dat het hetzelfde is om te zeggen dat je 3 uur geleden 12 goud had, 2 uur geleden 24 goud of 1 uur geleden 36 goud. In alle gevallen heb je nu 48 goud. Je bent dus vrij in de keuze van 'beginmoment'. Daarom is het mogelijk te kiezen voor het moment dat je 0 goud had, dan hoef je alleen het tijdstip op te slaan, niet het begingoud. De formule wordt dan nog simpeler:
goud = uren_tijdverschil * productie_per_uur
Stel nu dat een speler 100 goud heeft en nog steeds 2 marktplaatsen. Je kan dan het moment terugrekenen wat je op moet slaan, om dat het laten kloppen:
uren_tijdverschil = goud / productie_per_uur
Daarmee reken je dus de tijd op dat die persoon 0 goud had (ook als is dat niet echt voorgekomen). Wanneer je nu op een willekeurig moment het goud weer opvraagt met de eerste formule, komt het juiste getal eruit.
SQL
Eens kijken hoe dit er in een query uit ziet. Laten we tabel 'spelers' nemen, met de velden 'goudopnul' en 'productie'. Vaak is 'productie' natuurlijk geen veld, maar hangt-ie af van een het aantal marktplaatsen of iets dergelijks. Zo haal je dan het goud op van alle spelers, met hun username erbij:
SELECT username , productie * ( NOW() - goudopnul ) / 3600 AS goud FROM spelers
Wanneer er iets met het goud gebeurt, als het bijvoorbeeld wordt uitgegeven, bereken je het tijdverschil opnieuw en slaat dat op. Dit moet ook als de productie anders wordt!
Javascript
Tenslotte maak je het af met een Javascript teller. Je plaatst de beginwaarde op het scherm en update deze met setTimeout.

