Avatar billede baitianlong Nybegynder
09. marts 2005 - 21:46 Der er 27 kommentarer og
1 løsning

en ud af otte fejler

Jeg har puttet dette script på otte knapper:

this.stop();
this.maaly = this.starty = this._y;
this.onEnterFrame = function() {
    if(Math.abs(this._y - this.maaly) < 2) this._y = this.maaly;
    if(this.maaly < this._y) this._y -= 2;
    else if(this.maaly > this._y) this._y += 2;
}
this.onRollOver = function() {
    for(i=1;i<9;i++) {
        if(i<3)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>3) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
this.onRollOut = function() {
    for(i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}

og selvfølgelig ændret tallet, der hvor det er nødvendigt. Den en knap opfører sig anderledes, hvorfor ?

www.legende.dk/diverse/menu.swf
Avatar billede baitianlong Nybegynder
09. marts 2005 - 21:47 #1
Det er som om scripts går lidt for langt ned og games går lidt for kort nedad. Det er da underligt
Avatar billede barklund Nybegynder
09. marts 2005 - 22:10 #2
Hm, det kan vel nok laves lidt kønnere end det kæmpe script på hver knap og masser af løkker og enterframes over det hele - skulle man mene.

Læg et simpelt kald på hver knap - såsom:

knap1.onRollOver = åbenKnap;
knap1.onRollOut = lukKnap;
...

Og så i de to funktioner lave det nødvendige script.

Derudover er jeg ganske overbevist om, at fejlen i dit script ligger i det faktum, at to af dine knapper muligvis ligger på skæve koordinater. De skal ikke nødvendigvis ligge på hele pixels - men på en hel tyvendedel af en pixel. Altså 0.05, 0.1, 0.15 og så videre.

Prøv engang ;)

--
Morten Barklund
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:19 #3
function lukKnapper() {
    for(i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}
function openKnapper(knapnavn) {
    tal = knapnavn.substring(3,4);
    for(i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
for(i=1;i<9;i++) {
    _root["knap" + i].stop();
    _root["knap" + i].onRollOver = function() {
        openKnapper(_root["knap" + i]);
    }
    _root["knap" + i].onRollOver = lukKnapper();
}

Kun knap1 stopper og ingen bevæger sig :'(
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:21 #4
for(i=1;i<9;i++) {
    _root["knap" + i].maaly = _root["knap" + i].starty = _root["knap" + i]._y;
    _root["knap" + i].onRollOver = function() {
        openKnapper(_root["knap" + i]);
    }
    _root["knap" + i].onRollOver = lukKnapper();
}
    _root["knap" + i].stop();
    _root["knap" + i].onRollOver = function() {
        openKnapper(_root["knap" + i]);
    }
    _root["knap" + i].onRollOver = lukKnapper();
}

Jeg havde lige glemt at sætte maaly og starty, men alligevel virker det ikke
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:25 #5
hov, der gik et eller andet helt galt med copy/paste der:

function lukKnapper() {
    for(i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}
function openKnapper(knapnavn) {
    tal = knapnavn.substring(3,4);
    for(i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
function openKnapper(knapnavn) {
    tal = knapnavn.substring(3,4);
    for(i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
for(i=1;i<9;i++) {
    _root["knap" + i].maaly = _root["knap" + i].starty = _root["knap" + i]._y;
    _root["knap" + i].onRollOver = function() {
        _root.openKnapper(_root["knap" + i]);
    }
    _root["knap" + i].onRollOver = function() {
        _root.lukKnapper();
    }
    _root["knap" + i].stop();   
}

men det er stadig ikke helt rigtigt :)
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:27 #6
lidt dobbelt funktion er jo altid godt... Men bortset fra det, hvad er der så galt ?
Avatar billede barklund Nybegynder
09. marts 2005 - 22:31 #7
Tja, knappens navn er jo this._name set inde fra funktionen (og dit forslag virker slet ikke af helt andre årsager):

function lukKnapper() {
    for(var i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}
function openKnapper() {
    var tal = Number(_this_name.substring(3));
    for(var i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
var m;
for(var i=1;i<9;i++) {
    m = _root["knap" + i];
    m.maaly = m.starty = m._y;
    m.onRollOver = openKnapper;
    m.onRollOver = lukKnapper
    _root["knap" + i].stop(); 
}

Men derudover er der jo stadig ingen onEnterFrames. Dette kan stadig være en god ide, men de skal kun sættes på, når de skal bruges - og fjernes igen, når de ikke skal bruges længere

--
Morten Barklund
Avatar billede barklund Nybegynder
09. marts 2005 - 22:32 #8
Hov, m.stop() til sidst er på sin plads :)
Avatar billede barklund Nybegynder
09. marts 2005 - 22:33 #9
Og:

Number(this._name.substring(3));

Selvfølgelig ;)
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:36 #10
Er dette virkelig rigtigt, Barklund?

m.onRollOver = openKnapper;
m.onRollOver = lukKnapper

??????????????????

Jeg var lige lidt panik agtig der, men har nu fået lidt koldt vand i hovedet:

function lukKnapper() {
    for(i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}
function openKnapper(knapnavn) {
    tal = knapnavn.substring(4,5);
    for(i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
for(i=1;i<9;i++) {
    _root["knap" + i].stop();   
    _root["knap" + i].maaly = _root["knap" + i].starty = _root["knap" + i]._y;
    _root["knap" + i].onRollOver = function() {
        _root.openKnapper(this._name);
    }
    _root["knap" + i].onRollOut = function() {
        _root.lukKnapper();
    }
    _root["knap" + i].onEnterFrame = function() {
        if(Math.abs(this._y - this.maaly) < 2) this._y = this.maaly;
        else if(this._y < this.maaly) this._y += 2;
        else if(this._y > this.maaly) this._y -= 2;
    }
}

Så var den der :)
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:39 #11
men smid lige et svar  :)
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:41 #12
Det er meget smukkere at putte det hele på på een gang, men det kiksede for mig første (og anden) gang :) Derfor var jeg havnet der hvor jeg smed et script på hver knap, ak ja...
Avatar billede barklund Nybegynder
09. marts 2005 - 22:42 #13
Ja, funktioner er variabler som alle andre. Om jeg skriver:

function foo() {}
foo = function(){}

Er i praksis (næsten) det samme. Og sidstnævte angiver tydeligt, at funktioner er variabler:

foo = function() { trace("hejhej"); };
bar = foo;
bar();

Og jamen dog, funktionen virker under et nyt navn.

Well, det skal vi ikke komme ind på her, det kan du læse meget mere om i http://globe.dk/?action=detail&vare=FG227-7 :)

Og dit script kan dermed laves mange gange pænere. I stedet for at lave en rollover funktion for hver knap, kan du lave en generel funktion. Så i stedet for at du ovenover bruger i alt 31 funktioner, kan du nøjes med 4. Det er da lidt smartere :)

--
Morten Barklund
Avatar billede baitianlong Nybegynder
09. marts 2005 - 22:46 #14
Jamen som det er nu, er det vel ok (eller er det der der er 27 for mange ?)

Skriv lige din rørende version så, så jeg kan få en lille tåre i øjet :P (og svar)
Avatar billede barklund Nybegynder
09. marts 2005 - 23:16 #15
Jamen du kan vel selv gætte det? Alle de funktioner, der i praksis er ens, kan erstattes med en enkelt fælles funktion (og se så at var'e dine lokale variabler i funktioner):

function lukKnapper() {
    for(var i=1;i<9;i++) {
        _root["knap" + i].maaly = _root["knap" + i].starty;
    }
}
function openKnapper() {
    var tal = this._name.substring(4,5);
    for(var i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
function flytKnapper() {
    if(Math.abs(this._y - this.maaly) < 2) this._y = this.maaly;
    else if(this._y < this.maaly) this._y += 2;
    else if(this._y > this.maaly) this._y -= 2;
}
for(i=1;i<9;i++) {
    m = _root["knap" + i];
    m.stop(); 
    m.maaly = m.starty = m._y;
    m.onRollOver = openKnapper;
    m.onRollOut = lukKnapper;
    m.onEnterFrame = flytKnapper;
}

See ;)

At bruge "m" til sidst er primært for overblikkets skyld, men også en smule for hastigheden - det vil nemlig eksekvere lidt hurtigere :)
Avatar billede barklund Nybegynder
09. marts 2005 - 23:16 #16
Og et svar.

Og jeg synes stadig, at du kun bør sættes dine onEnterFrame's, når de er nødvendige - og slette dem igen, når de ikke skal bruges mere.
Avatar billede baitianlong Nybegynder
09. marts 2005 - 23:22 #17
din brug af "var" er lidt svingende ;)

Men ellers fik jeg da noget ud af det :) Takker igen igen
Avatar billede barklund Nybegynder
09. marts 2005 - 23:25 #18
Samtlige lokale variabler i alle tre funktioner er da var'et? Men tark for points ;)

Og jeg vil lige tillade mig at referere til http://globe.dk/?action=detail&vare=FG227-7 igen ;)
Avatar billede baitianlong Nybegynder
09. marts 2005 - 23:53 #19
1)

function openKnapper() {
    var tal = Number(_this_name.substring(3));
    for(var i=1;i<9;i++) {
        if(i<tal)    _root["knap" + i].maaly = _root["knap" + i].starty - 10;
        else if(i>tal) _root["knap" + i].maaly = _root["knap" + i].starty + 10;
    }
}
var m;  //HVA SÅ DER
for(var i=1;i<9;i++) {
    m = _root["knap" + i];
    m.maaly = m.starty = m._y;


2)

function flytKnapper() {
    if(Math.abs(this._y - this.maaly) < 2) this._y = this.maaly;
    else if(this._y < this.maaly) this._y += 2;
    else if(this._y > this.maaly) this._y -= 2;
}
for(i=1;i<9;i++) {
    m = _root["knap" + i];
    m.stop(); 
    m.maaly = m.starty = m._y;


;);)

Den eneste grund til at jeg nævner det, er at du kan tage det. Men Få Lige Lidt KodeDiciplin Der :P
Avatar billede barklund Nybegynder
10. marts 2005 - 00:04 #20
Well, at bruge "var" på tidslinje variabler vil du også kunne finde viden om i ovenstående bog. At skrive det er i praksis overflødigt, men da man generelt bør var'e sine variabler, så kan det da ikke skade - for synets skyld :)
Avatar billede baitianlong Nybegynder
10. marts 2005 - 00:17 #21
jeg hører ikke så godt? VAR ??!! ;)
Avatar billede barklund Nybegynder
10. marts 2005 - 00:19 #22
Så er det godt! I seng!
Avatar billede baitianlong Nybegynder
10. marts 2005 - 00:24 #23
okay :D
Avatar billede barklund Nybegynder
10. marts 2005 - 00:25 #24
Og husk at bestille et eksemplar :)
Avatar billede baitianlong Nybegynder
10. marts 2005 - 00:34 #25
ok, beklager jg var lidt langsom
kiggede først på linket nu... så, du har skrevet en bog nu. Det er da rørende. Men hvem fanden skulle ellers gøre det. Fra nu af skal du besvare sørgsmålene: "kig i side 138 i min bog" :P

Du er da smuk med det der moderne flash
Avatar billede barklund Nybegynder
10. marts 2005 - 09:04 #26
Hehe tak ;)
Avatar billede altschuler Nybegynder
12. marts 2005 - 10:20 #27
haha god idé legende.dk... en eller anden laver en søgemaskine som søger i bogens tekst og så bliver flash afdelingen bare skiftet ud med den ^__^
Avatar billede barklund Nybegynder
12. marts 2005 - 12:25 #28
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester