• User Newbie

    Immagine che cambia secondo la data

    ho un problemino: vorrei che nel mio sito, a seconda della data del server (non del pc dell'utente) cambi un'immagine di sfondo.

    Per esempio, il 3 marzo avrò un fiore, il 7 avrò una farfalla etc..

    Credo di dover usare getdate ma non riesco a farlo funzionare e in più non so se prenda la data dal server o dal pc (è molto importante perchè l'immagine di sfondo deve cambiare in base a una data fissa).

    Quindi credo dovrei fare dei semplici "if date == 24 loadmovie("farfalla.swf"), if date == 25 loadmovie("fiore.swf")..."

    Potete aiutarmi?

    Grazie 🙂

    P.S.: Perdonate la mia niubbezza, ma sono alle prime armi, spero di essermi spiegato bene.


  • Super User

    Ciao e benvenuto nel forum GT 🙂

    La cosa che necessiti non è affatto semplice in quanto devi recuperare la giusta data dal server.

    Ti serve uno script lato server (php o asp o quello che credi) che quando chiamato da Flash ti restituisce la data attuale in formato secondi.

    Fatto questo devi lavorare con la classe Date di Actionscript e utilizzando della matematica devi recuperare l'offset dell'orologio della macchina dell'utente, trasformare tutto in millisecondi, fare dei calcoli ed ottenere la data.


  • User Newbie

    cacchio..è difficilissimo!

    Io però ho già una cosa che può aiutarmi: in pratica ho un contatore che prende i dati dal server..sicuramente in mezzo alla programmazione c'è la data che fa al caso mio..solo che sono proprio all'inizio e non capisco come poterla usare..

    Se hai voglia, ti faccio vedere lo script contatore, che online è http://www.whereis107.org/base.html

    // stop the timeline
    stop();
    
    
    // define the event date counting down to
    // this is constant so it won't need to be
    // calculated in the onEnterFrame function below
    // currently counting down 'til christmas of 2003
    // Date( year, month-1, date [, hour [, minute [, second [, millisecond]]]])
    eventDate = new Date(2007, 2, 30, 24, 59);
    eventMillisecs = eventDate.getTime();
    
    // define the function used to compare the current date
    // with the event date.  This will be set to run every
    // frame once the server date has been retrieved
    countdown = function(){
        // take the recieved server time and add on the milliseconds
        // calculated from flash that have occurred since that
        // time was recieved (which would match up to what that time
        // would be now if it was again retrieved from the server
        var currentMillisecs = server.time + getTimer();
        
        // the milliseconds between the current time and the
        // time of the event can then be calculated by simply
        // subtracting the current time's milliseconds from the
        // milliseconds of the time of the event
        this.msecs = eventMillisecs - currentMillisecs;
        
        // if the msecs variable is less than 0, that means the
        // current time is greater that the time of the event
        if (this.msecs <= 0){
            // and the event time has been reached!
            // play the next frame for the result of the countdown.        
            play();
            // a return can be used to exit the function since
            // in going to the next frame, there's no need to
            // continue with the remaining operations.
            return;
        }
        
        // if the date hasn't been reached, continue to
        // devise seconds, minutes, hours and days from
        // the calculated milliseconds
        this.secs = Math.floor(this.msecs/1000); // 1000 milliseconds make a second
        this.mins = Math.floor(this.secs/60); // 60 seconds make a minute
        this.hours = Math.floor(this.mins/60); // 60 minutes make a hour
        this.days = Math.floor(this.hours/24); // 24 hours make a second
        
        // make sure each value doesn't exceed the range in
        // which they exist.  Milliseconds, for example, will
        // be shown in a range of 0 - 999.  The modulous
        // operator, or %, well help in that.  Here the values
        // are also turned into strings preparing for the next step
        this.msecs = string(this.msecs % 1000);
        this.secs = string(this.secs % 60);
        this.mins = string(this.mins % 60);
        this.hours = string(this.hours % 24);
        this.days = string(this.days);
        
        // add on leading zeros for all the number values (which are
        // now strings) that aren't 3 or 2 characters long based on the
        // range being used to represent them.  Because mseconds and
        // days have up to 3 characters, a while loop is used to
        // continuously add 0s until they have 3.  Other values which
        // only need 2 leading 0s can get by on a single if check
        while (this.msecs.length < 3) this.msecs = "0" + this.msecs;
        if (this.secs.length < 2) this.secs = "0" + this.secs;
        if (this.mins.length < 2) this.mins = "0" + this.mins;
        if (this.hours.length < 2) this.hours = "0" + this.hours;
        while (this.days.length < 3) this.days = "0" + this.days;
    
        // finally, display your values.  If you want to put your values
        // in a textField, you can pretty much just stop here and throw them
        // into your textField as desired.  This example, however will go a step
        // further and use images for numbers for each numerical value in the
        // countdown to the desired date.
        
        // So, for that, loop through all the movies in this counter clip using the
        // evaluateFrameFrom prototype method on each. A single check for a
        // _parent variable is used to make sure the property found in a for
        // loop is a movieclip and is within the timeline of this counter clip.
        // TextFields and buttons would also be true here, but since the contents
        // within counter are strictly those numbers movieclips, we won't have to
        // be concerned with such complications.  The only movieclips in this counter
        // clip are the numbers movieclips with the frames of the imagery making up
        // the numbers of 0-9.
        for(movie in this){
            if (this[movie]._parent == this) this[movie].evaluateFrameFrom(this);
        }
    };
    
    // this function is a MovieClip.prototype meaning its available to be used by
    // all movieclips.  It's a sneaky function that saves a lot of work by using
    // name each numbers movieclip in the counter movieclip to determine which value
    // it needs to display based on the times derived from the previous 
    // calculations of the onEnterFrame. What it does is seperates a movieclip's
    // _name into a variable word and a number.  The variable word will represent
    // the variable to look up a value for in the passed variableClip and the
    // number will be used to get a character from that value (a string) which
    // represents which number this movieclip should display.
    MovieClip.prototype.evaluateFrameFrom = function(variableClip){
        // split this _name into an array of 2 values seperated by an underscore
        var nameArray = this._name.split("_");
        // the first value represents what variable in variableClip (counter clip)
        // this movieclip is used to represent whether it be mins or hours etc.
        var numberSet = variableClip[nameArray[0]];
        // next a number representing which character in that first value this
        // movieclip should display.  this will be between 0 and 2 (any one of
        // three values).  number() is used to force it to be a number value.
        var character = number(nameArray[1]);
        // a frame number can then be derived from the value of the numberset
        // variable based on the character defined by character.  number() is
        // used to force it to a number value and 1 is added to offset the
        // frame value by one since 0 is at frame 1 and 1 at frame 2 etc.
        var frame = 1 + number(numberSet.charAt(character));
        // if the movieclip is not already at the frame, move it there!
        if (this._currentframe != frame) this.gotoAndStop(frame);
    };
    
    // an example of the above function in action would be for a movieclip
    // with the name "days_1".  days_1 is seperated into an array by dividing
    // the name by its "_" character giving "days" (nameArray[0]) and "1" (nameArray[1]).
    // The value of days is then retrieved from the passed variableClip using
    // associative array ssntax and is set to numberset.  The value of days in variableClip
    // would be a string something along the lines of "045".  character is then used
    // to get which of those 3 values this movieclip is to represent. It is just
    // nameArray[1] turned into a number or "1" to 1.  So, charAt(1) of "045" would
    // be 4.  Turn that into a number and add one and you get frame 5 where the image of
    // the 4 is located.  The movieclip, days_1, is then played to that frame to show it.
    
    // make a new loadVars object to get the server date
    server = new LoadVars();
    server.onLoad = function(ok){
        // check for loading success
        if (!ok) return trace("Server error! Unable to obtain date from server");
        // if ok, assign countdown to run every frame for counter
        counter.onEnterFrame = countdown;
        // show the counter clip as it was hidden before the countdown
        counter._visible = true;
        // offset the recieved server time by the current value of
        // getTimer since getTimer starts at 0 when the movie starts.  By
        // the time the server time loads, getTimer will be some higher
        // value. This accounts for the extra time added on from 
        // getTimer in countdown every frame. Plus, since time() in 
        // php returns seconds and not milliseconds (which is used here)
        // *1000 is added to increase its value to represent milliseconds
        this.time = Number(this.time)*1000 - getTimer();
    };
    // load in the time from a php file (or any other server-side resource)
    // the value we want from the server is the milliseconds representation
    // of the current time as the server sees it.
    server.load("gettime.php");
    /* gettime.php:
    
    <?php
    echo "time=" . time();
    ?>
    
    */
    
    // now, since the counter clip has to wait for the time to be loaded, 
    // its a good idea not to show it act all wierd as it has nothing to control
    // how it plays its numbers.  We'll just hide it until the onLoad
    counter._visible = false;
    
    if (this.days == 29) function() {
         loadMovie("creatures.swf", _root.mappa);
         };
    ```Se potessi aiutarmi, te ne saremo tutti grati! 
    Siamo un gruppo di giovani artisti che organizzano una mostra d'arte libera e autogestita a Milano. La scorsa edizione è stata questa [www.whereis101.org](http://www.whereis101.org)
    
    Grazie comunque del tempo che mi dedichi :)

  • Super User

    Guarda cosa succede se metti queste 2 righe di codice :

    
    var my_date:Date=new Date(this.time);
    trace(my_date);
    
    ```dopo questa riga di codice(la n°147):
    

    this.time = Number(this.time)*1000 - getTimer();