Sokoban

Status
Niet open voor verdere reacties.

ErikBooy007

Terugkerende gebruiker
Lid geworden
24 mei 2007
Berichten
3.814
Even voortbordurend op mijn vorige vraag (http://www.helpmij.nl/forum/showthread.php/534889-Object-Oriented-Programming),

Ik heb dus het spel Sokoban in JS geschreven.

Bij een pagina load wordt 1 level geladen. 1 level = 1 JS file. Welke file dat moet zijn wordt bepaald aan de hand van een cookie. Staat er al een numerieke waarde in de cookie, dan is dat het laatst gehaalde level, staat er nog niets in wordt de waarde op 0 gesteld. Vervolgens als een level gehaald is, dan wordt de cookie geupdate.

Mijn probleem is dat ik niet kan controleren of er nog een volgende level is. Heeft iemand daar suggesties voor. Nu bestaat er dus in de map "maps" voor elk level een bestand dat level "levelX.js" heet.

Nu heb ik even opgelost door als laatste (3e :P) level een onoplosbaar level te maken, maar dat verdient niet echt een schoonheidsprijs hè? ;)
 
Daar zijn verschillende manieren voor te bedenken. In eerste instantie denk ik aan een functie waarbij je gebruik maakt van het onload event op een script-element en een interval.
Dan zou je het bijvoorbeeld zo kunnen aanpakken (Ik maak in het voorbeeld gebruik van het Prototype framework)

PHP:
/**
 * variable loaded
 *
 * Geeft aan of het level is ingeladen of niet
 * 
 * @type {Boolean}
 * @since Sun May 23 2010
 */
var loaded = false;

/**
 * variable loadingFor
 *
 * Geeft aan hoelang er al geprobeerd wordt om het level te laden
 * 
 * @type {Number}
 * @since Sun May 23 2010
 */
var loadingFor = 0;

/**
 * constant MAX_LOAD_TIME
 *
 * Geeft aan hoelang er geprobeerd mag worden het veld te laden
 * 
 * @type {Number}
 * @since Sun May 23 2010
 */
var MAX_LOAD_TIME =  5;

/**
 * variable levelCheckProcessor
 *
 * Een periodical executer die elke seconde gaat controleren of het veld geladen is
 * 
 * @type {PeriodicalExecuter}
 * @since Sun May 23 2010
 */
var levelCheckProcessor = null;

/**
 * constant LEVEL_DIR
 *
 * Wijst naar de locatie waar de level opgehaald kunnen worden
 * 
 * @type {String}
 * @since Sun May 23 2010
 */
LEVEL_DIR = '/resources/levels/';


/**
* function getLevel
*
* Begint met het inladen van het level
*
* @since Sun May 23 2010
* @access public
**/
function getLevel(levelname) {
    window.level = new Element('script',{'type':'application/javascript','src':LEVEL_DIR + levelname});
    level.observe('load', function(){ setLoaded(true) } );
    levelCheckProcessor = PeriodicalExecuter(isLoaded,1);
    document.head.appendChild(level);
}

/**
* function isLoaded
*
* Controleert of het veld kan worden ingeladen
*
* @since Sun May 23 2010
* @access public
**/
function isLoaded() {
    if (loaded) {
        levelCheckProcessor.stop();
        // Hier het inladen van het level vervolgen
    }
    else if (loadingFor >= MAX_LOAD_TIME) {
        levelCheckProcessor.stop();
        // Het veld kon niet inladen, het spel is over...
    }
    loadingFor++;
}

/**
* function setLoaded
*
* Setter functie voor loaded
*
* @since Sun May 23 2010
* @param status {Boolean}
* @access public
**/
function setLoaded(status) {
    loaded = status;
}

Een andere manier is om de velden van te voren te laden en elk veld dat inlaadt in een Array/Hash te stoppen en het spel deze velden een voor een te laten spelen.
 
Well... ik neem aan dat het zonder php moet? Anders maak je een xmlhttpreq. naar dat php bestand dat de folder uitleest en het laatste level-nr. returnt.

Zo niet: je kan 2 dingen doen. De eerste is een xmlhttprequest maken naar de folder, en dan met wat string-replace-magie de lijst bekijken en het laatste nummer verkrijgen. Maar tsja... ook niet echt het netste plan ooit.

Optie 3 weet ik niet zeker (of het mogelijk is), maar je zou een level kunnen laden met een <script> tag, en deze een load event handler geven.



0.02$, :thumb:



[edit]ninja'd! Oh, dat brengt me op nog een idee: als je aan het eind van elk level-js-file een functie isGeladen() aanroept?[/edit]
 
Laatst bewerkt:
@JP, wow, dat script ga ik morgen eens uitpluizen. :thumb::thumb:

@Vegras, liefst zonder PHP ja, hoewel dat inderdaad de makkelijkste oplossing zou zijn.

Zou het niet mogelijk zijn om een xmlHttpRequest naar het volgende level-bestand, daar zou ik namelijk gewoon een 404 kunnen afvangen. Weet alleen niet of het dan nog mogelijk is om de teruggegeven data, als JS te laten interpreteren... (liefst zonder eval() ;))

[EDIT]
ninja'd! Oh, dat brengt me op nog een idee: als je aan het eind van elk level-js-file een functie isGeladen() aanroept?

Die moet je me ff uitleggen.

Trouwens... 0.02$... heel subtiel ;)
[/EDIT]
 
Laatst bewerkt:
Zou het niet mogelijk zijn om een xmlHttpRequest naar het volgende level-bestand, daar zou ik namelijk gewoon een 404 kunnen afvangen. Weet alleen niet of het dan nog mogelijk is om de teruggegeven data, als JS te laten interpreteren... (liefst zonder eval() ;))
[/EDIT]

Ja dat is mogelijk. Maar ik denk dat je dan wel eval zal moeten gebruiken. Je zou ook met een Ajax request kunnen kijken of het bestand bestaat en het dan in een script-element stoppen. Maar dan doe je dus in praktijk een dubbel request voor hetzelfde bestand.
 
Hee, dat klopt, best een goed idee! Denk dat ik dat maar ga doen.

Hartelijk dank!!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan