Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: ajastin

dartvaneri [18.02.2014 15:51:33]

#

Hei!
Teen tässä ikuisuusprojektina selainpeliä(Travian yms. tapaista) php:llä ja js:llä(visuaalinen).
Rakenteilla on tällä hetkellä ajastin, jonka avulla ajastetaan kaikki tapahtumat pelissä. Kysymykseni on, kuinka tehdä tämä järkevästi?

Minulla on kahden tyyppisiä ajastimia:
-vakio ajastin
* Suoritetaan ikuisesti(ei poisteta koskaan)
* esim. raudan, puun, yms. tuotto ja veden kulutus

-määriteltävä ajastin
* suoritetaan vain kerran
* kun umpeutuu poistetaan
* perutettavissa käyttäjän toimesta
* esim. rakennusten rakentaminen ja joukkojen liikuttelu.

Ajattelin että tallentaisi aina, kun tapahtuma aloitetaan, tietokantaan timestampin aloitus hetkestä. Aina, kun sivua päivitetään, tarkistetaan onko aika umpeutunut. Mikäli on, tehdään tarvittavat toimet ja poistetaan ajastimen rivi kannasta. Vakio ajastimella tehdään vain tarvittavat toimet ja päivitetään uusi timestamp, ei poisteta riviä kannasta.

Jokaiselle vakio ajastimelle olen ajatellut tehdä tietokantaan oman rivin.

Vakio ajastimen kanssa ei ole ongelmia, mutta noiden määriteltävien kanssa vähän. Joudunko tekemään jokaista määriteltävää ajastinta varten oman funktion, ja joudunko lisäämään jokaiselle oman taulun tai sarakkeet vakio ajastimien tauluun määriteltävien ajastimien tiedoille tietokannassa? Vai onko tähän jokin järkevämpi ratkaisu?

Vakio ajastimen taulun sarakkeet:
-id
-time
-resource

Metabolix [18.02.2014 18:16:25]

#

Ajastimen toteutus sinänsä ei edellytä funktioita tai useita tauluja, mutta tietenkin sinun täytyy jollain tavalla ohjelmoida kaikki peliin kuuluva toiminta, ei siihen ole mitään oikotietä. Antamillasi lähtötiedoilla on vaikea antaa tarkkaa vastausta.

Voisit laittaa kaikki toiminnot samaan tauluun. Taulussa voisi olla id, ensimmäinen ja viimeinen suoritusaika, suoritusten välinen aika, seuraava suoritusaika ja JSON-enkoodatut toiminnon tiedot. Koodista tulisi idealtaan tällainen:

function toiminnot() {
	$hakukysely = "SELECT * FROM toiminto WHERE aika <= NOW() AND aika <= loppu ORDER BY aika ASC, id ASC LIMIT 1";
	while ($toiminto = sql($hakukysely)) {
		suorita($toiminto->aika, json_decode($toiminto->tiedot));
		$toiminto->aika = date("Y-m-d H:i:s", strtotime($toiminto->aika) + $toiminto->aikavali);
		sql("UPDATE toiminto SET aika = ? WHERE id = ?", $toiminto->aika, $toiminto->id);
	}
	// Valinnainen, jos et halua säilyttää historiaa:
	sql("DELETE FROM toiminto WHERE aika > loppu");
}
function suorita($aika, $tiedot) {
	if ($tiedot->asia == "liikuta") {
		liikuta($tiedot->liikkuja, $tiedot->kohde);
	}
	// jne, tai call_user_func tms.
}

Lisäksi voisit tehdä toisen taulun, joka liittäisi toiminnot yksiköihin. Taulussa olisi siis toiminto_id ja yksikko_id, ja ne olisivat kummatkin taulun avaimina. Näin olisi helppo selvittää, mitä toimintoja tietty yksikkö on tehnyt tai tulee tekemään, ja jos yksikkö vaikkapa tuhoutuu, olisi helppo perua siihen liitetyt toiminnot.

dartvaneri [19.02.2014 09:47:27]

#

Tarkoitus oli kysyä juurikin ideaa tuohon tietokannan taulujen järkevään rakenteeseen. Kieltämättä oli vähän sekava kysymys, mutta sain kyllä vastauksen kysymykseeni. Kiitos esimerkistä, sen tutkiminen avasi kummasti näkemystäni sql-kyselyjen käyttämisestä, yms.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta