Avatar billede altschuler Nybegynder
24. marts 2005 - 17:16 Der er 18 kommentarer og
1 løsning

Underlig fejl mht. _rotation o.O

Jeg er ved at lave et analogt ur, som også fungerer fint nok. Men jeg er stødt ind i et, for mig, meget underligt problem.
Mit script er som følger (ved godt det er noget værre slamscript, men kunne ikke lige gøre det bedre :P)

Altså problemet opstår når der skal ske ting og sager med h7_mc (se linket for neden). Og jeg forstår det simpelthen ikke, for koden er jo den samme for alle hx_mc'erne.

Men jeg tror det er nemmest vis i bare kigger på linket, der kan i selv se at efter "klokken 6" går det galt.

    if (sek_viser._rotation>0-5 && sek_viser._rotation<30) {
        h1_mc._alpha = 50;
    } else {
        h1_mc._alpha = 100;
    }
    if (sek_viser._rotation>30-5 && sek_viser._rotation<60) {
        h2_mc._alpha = 50;
    } else {
        h2_mc._alpha = 100;
    }
    if (sek_viser._rotation>60-5 && sek_viser._rotation<90) {
        h3_mc._alpha = 50;
    } else {
        h3_mc._alpha = 100;
    }
    if (sek_viser._rotation>90-5 && sek_viser._rotation<120) {
        h4_mc._alpha = 50;
    } else {
        h4_mc._alpha = 100;
    }
    if (sek_viser._rotation>120-5 && sek_viser._rotation<150) {
        h5_mc._alpha = 50;
    } else {
        h5_mc._alpha = 100;
    }
    if (sek_viser._rotation>150-5 && sek_viser._rotation<180) {
        h6_mc._alpha = 50;
    } else {
        h6_mc._alpha = 100;
    }
    if (sek_viser._rotation>180-5 && sek_viser._rotation<360) {
        h7_mc._alpha = 50;
    } else {
        h7_mc._alpha = 100;
    }
    if (sek_viser._rotation>210-5 && sek_viser._rotation<240) {
        h8_mc._alpha = 50;
    } else {
        h8_mc._alpha = 100;
    }
    if (sek_viser._rotation>240-5 && sek_viser._rotation<270) {
        h9_mc._alpha = 50;
    } else {
        h9_mc._alpha = 100;
    }
    if (sek_viser._rotation>270-5 && sek_viser._rotation<300) {
        h10_mc._alpha = 50;
    } else {
        h10_mc._alpha = 100;
    }
    if (sek_viser._rotation>300-5 && sek_viser._rotation<330) {
        h11_mc._alpha = 50;
    } else {
        h11_mc._alpha = 100;
    }
    if (sek_viser._rotation>330-5 && sek_viser._rotation<360) {
        h12_mc._alpha = 50;
    } else {
        h12_mc._alpha = 100;
    }


Der kan ses et eksempel her: http://www.altschuler.dk/simon/exp/analogur

Venlig hilsen og PFT
Simon Altschuler
Avatar billede altschuler Nybegynder
24. marts 2005 - 17:17 #1
hovsa.. den her: 

if (sek_viser._rotation>180-5 && sek_viser._rotation<360) {
        h7_mc._alpha = 50;
    } else {
        h7_mc._alpha = 100;
    }

skal selvfølgelig være:

    if (sek_viser._rotation>180-5 && sek_viser._rotation<210) {
        h7_mc._alpha = 50;
    } else {
        h7_mc._alpha = 100;
    }

men det virker ikke alligevel :)
Avatar billede barklund Nybegynder
24. marts 2005 - 17:31 #2
Dit skyldes problem, at Flash internt "afrunder" vinkler i _rotation, så de går fra -179 til 180 - og altså ikke fra 0 til 360. Det kunne løses ved, at du kopiere _rotation over i en anden variabel og skrev rot = (sek_viser._rotation+360)%360

Men - shish! - det kan laves meget smartere:

var rot = (sek_viser._rotation+360)%360
var hour = Math.ceil(rot / 30);
var current = this["h"+hour+"_mc"];
if (current != prev) {
    prev._alpha = 50;
    current._alpha = 100;
}
prev = current;

(ikke testet, men det er vist deromkring)

Så skal du bare kalde dette, hver gang du har flyttet din viser :)

--
Morten Barklund
Avatar billede altschuler Nybegynder
24. marts 2005 - 17:49 #3
Hmm, det ser jo meget mere behageligt ud det der :). Men jeg kna ikke lige få det til at virke. Har puttet det ind i en onEnterFrame sådan her:

sek_viser.onEnterFrame = function() {
    var rot = (this._rotation+360)%360;
    var hour = Math.ceil(rot/30);
    var current = this["h"+hour+"_mc"];
    if (current != prev) {
        prev._alpha = 50;
        current._alpha = 100;
    }
    prev = current;
};

Men det virker ikke, hmm!
Avatar billede altschuler Nybegynder
24. marts 2005 - 18:00 #4
Mangler prev ikek at blive defineret som noget? Bare et gæt, men kan ikke lige se hvordan flash skulle vide hvad prev er :)
Avatar billede barklund Nybegynder
24. marts 2005 - 18:14 #5
prev bliver til en tidslinjevariabel (se mere om det i kapitel 3), så den er ikke problemet.

Men der er da ikke noget, der drejer viseren rundt længere?
Avatar billede altschuler Nybegynder
24. marts 2005 - 18:31 #6
ALtså her er hele mit script. Viseren drejer, men ingen af felterne bliver ændret.

var interval = setInterval(opdaterUr, 10);
function opdaterUr() {
    var tiden_nu = new Date();
    _root.sek_viser._rotation = tiden_nu.getSeconds()*6;
    _root.minut_viser._rotation = tiden_nu.getMinutes()*6;
    _root.time_viser._rotation = tiden_nu.getHours()*30;
    var måned = tiden_nu.getMonth()+1;
    if (måned<=9) {
        var dato_måned = tiden_nu.getMonth()+1;
        måned = "0"+dato_måned;
    }
    var dag = tiden_nu.getDate();
    if (dag<=9) {
        var dato_dag = tiden_nu.getDate();
        dag = "0"+dato_dag;
    }
    _root.dato_mc.dato_txt.text = dag+"-"+måned+"-"+tiden_nu.getFullYear();
}
sek_viser.onEnterFrame = function() {
    var rot = (this._rotation+360)%360;
    var hour = Math.ceil(rot/30);
    var current = this["h"+hour+"_mc"];
    if (current != prev) {
        prev._alpha = 50;
        current._alpha = 100;
    }
    prev = current;
};

Ved ikke om det har nogen betydning, men inde i sekund_viseren har jeg et andet mc som kører i millisekunder (for at få viseren til at køre mere rent). Her ser scriptet således ud:

var intervalISekunder = setInterval(opdaterUrISekunder, 10);
function opdaterUrISekunder() {
    var tiden_nu = new Date();
    mil_sek_viser._rotation = (tiden_nu.getMilliseconds()*3.6)/600;
}
Avatar billede altschuler Nybegynder
24. marts 2005 - 18:53 #7
Ah, bare glem det, brugte den med rot = (sek_viser._rotation+360)%360 ;)

Drop et svar, så skal du få :)
Avatar billede barklund Nybegynder
24. marts 2005 - 19:26 #8
Niks, jeg nægter at lade det script stå!

var interval = setInterval(opdaterUr, 10);
var sidste_time = null;
function opdaterUr() {
    var tiden_nu = new Date();
    _root.sek_viser._rotation = tiden_nu.getSeconds()*6;
    _root.minut_viser._rotation = tiden_nu.getMinutes()*6;
    var timer = tiden_nu.getHours()
    _root.time_viser._rotation = timer*30;
    var nuværende_time = this["h"+timer+"_mc"];
    if (nuværende_time != sidste_time) {
        sidste_time._alpha = 50;
        nuværende_time._alpha = 100;
    }
    sidste_time = nuværende_time;
    var måned = tiden_nu.getMonth()+1;
    if (måned<=9) {
        var dato_måned = tiden_nu.getMonth()+1;
        måned = "0"+dato_måned;
    }
    var dag = tiden_nu.getDate();
    if (dag<=9) {
        var dato_dag = tiden_nu.getDate();
        dag = "0"+dato_dag;
    }
    _root.dato_mc.dato_txt.text = dag+"-"+måned+"-"+tiden_nu.getFullYear();
}

Burde det ikke gøre det?

--
Morten Barklund
Avatar billede altschuler Nybegynder
24. marts 2005 - 19:45 #9
Hmm virker stadig ikke. Forstår det ikke helt, så ved ikke lige hvad der kna være galt :/
Avatar billede barklund Nybegynder
24. marts 2005 - 23:25 #10
Ah, fejlen ligger i this-referencen:

var interval = setInterval(opdaterUr, 10);
var sidste_time = null;
var base = this;
function opdaterUr() {
    var tiden_nu = new Date();
    _root.sek_viser._rotation = tiden_nu.getSeconds()*6;
    _root.minut_viser._rotation = tiden_nu.getMinutes()*6;
    var timer = tiden_nu.getHours()
    _root.time_viser._rotation = timer*30;
    var nuværende_time = base["h"+timer+"_mc"];
    if (nuværende_time != sidste_time) {
        sidste_time._alpha = 50;
        nuværende_time._alpha = 100;
    }
    sidste_time = nuværende_time;
    var måned = tiden_nu.getMonth()+1;
    if (måned<=9) {
        var dato_måned = tiden_nu.getMonth()+1;
        måned = "0"+dato_måned;
    }
    var dag = tiden_nu.getDate();
    if (dag<=9) {
        var dato_dag = tiden_nu.getDate();
        dag = "0"+dato_dag;
    }
    _root.dato_mc.dato_txt.text = dag+"-"+måned+"-"+tiden_nu.getFullYear();
}

Det burde virke. :)

--
Morten Barklund
Avatar billede altschuler Nybegynder
25. marts 2005 - 13:49 #11
>.< Kan stadig ikke få det til at virke. Ved ikke om det er mig der laver fejl eller hvad, men har bare lagt det i frame 1, der hvor det andet lå/ligger.
Avatar billede barklund Nybegynder
25. marts 2005 - 14:29 #12
Jeg kager jo også rundt - jeg har lavet det, så det er timerne, den gør det i forhold til - og endda forkert stadigvæk:

var interval = setInterval(opdaterUr, 10);
var sidste_time = null;
var base = this;
function opdaterUr() {
    var tiden_nu = new Date();
    _root.sek_viser._rotation = tiden_nu.getSeconds()*6;
    _root.minut_viser._rotation = tiden_nu.getMinutes()*6;
    _root.time_viser._rotation = tiden_nu.getHours()*30;
    var sekund_time = (Math.floor(tiden_nu.getSeconds()/5)+12)%12+1;
    var nuværende_time = base["h"+sekund_time+"_mc"];
    if (nuværende_time != sidste_time) {
        sidste_time._alpha = 50;
        nuværende_time._alpha = 100;
    }
    sidste_time = nuværende_time;
    var måned = tiden_nu.getMonth()+1;
    if (måned<=9) {
        var dato_måned = tiden_nu.getMonth()+1;
        måned = "0"+dato_måned;
    }
    var dag = tiden_nu.getDate();
    if (dag<=9) {
        var dato_dag = tiden_nu.getDate();
        dag = "0"+dato_dag;
    }
    _root.dato_mc.dato_txt.text = dag+"-"+måned+"-"+tiden_nu.getFullYear();
}

Se det ser straks mindre overskueligt ud!

--
Morten Barklund
Avatar billede altschuler Nybegynder
25. marts 2005 - 15:41 #13
Ahh, så virker det sgu :D

Var dog nødt til at lave en enkelt rettelse:

    if (nuværende_time != sidste_time) {
        sidste_time._alpha = 50;
        nuværende_time._alpha = 100;
    }

Blev til:

    if (nuværende_time != sidste_time) {
        sidste_time._alpha = 100;
        nuværende_time._alpha = 50;
    }

Ellers så det meget underligt ud :), men meget inspirerende faktisk :P
Avatar billede altschuler Nybegynder
25. marts 2005 - 15:44 #14
Nå ja, og så var der lige et svar :)
Avatar billede barklund Nybegynder
25. marts 2005 - 15:45 #15
Flot af mig :)
Avatar billede barklund Nybegynder
25. marts 2005 - 15:45 #16
Men formlen:

var sekund_time = (Math.floor(tiden_nu.getSeconds()/5)+12)%12+1;

Er vist heller ikke den kønneste i verden - og ikke helt gennemskuelig :)
Avatar billede altschuler Nybegynder
25. marts 2005 - 16:08 #17
Jeg forstår den i hvert fald ikke til fulde :P, men hva fa'en den virker jo :)
Avatar billede barklund Nybegynder
25. marts 2005 - 16:11 #18
Hehe, tark for points :)
Avatar billede altschuler Nybegynder
25. marts 2005 - 21:19 #19
Non problemos, det er mig som takker
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