Grondstoffen

Inhoud

  1. 1 - Wiskunde
  2. 2 - SQL
  3. 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.

Inloggen wachtwoord vergeten? Aanmelden