Köralakú slider, avagy trigonometria.
2006-10-08T23:55:49+02:00
2006-10-13T18:53:10+02:00
2022-07-19T06:43:52+02:00
  • na!
    most megcsináltam végre volt időm, amit irtál, és ez a megoldás már tökéletes nekem! Viszont bevallom őszintén, hogy nem nagyon értem:((
    Nagyon hálás lennék érte, hogyha cimszavakban le tudnád irni, hogy elvben mit kellene csinálni, mert nem akarom azt hogy kimásolom (ellopom) a scriptedet, és nem is értem miről van szó.

    Bemásolom ide a jelenlegi scriptet, hogy ne kelljen sokat dolgozni vele, igy is épp elég nagy munka lehetett hogy megirtad lentebb külön ezt az egészet.

    button.onPress = startCircle;
    button.onRollOut = button.onReleaseOutside=button.onRelease=stopCircle;
    KOZEPX = 43;
    KOZEPY = 45;
    SUGAR = 28;
    oldrot = 90;
    function startCircle() {
    button._alpha = 100;
    onMouseMove = function () {
    var dx = KOZEPX-this._xmouse;
    var dy = KOZEPY-this._ymouse;
    var rot = Math.atan2(dy, dx);
    var rotd = 360-(rot*180/Math.PI+90);
    var segedrot = rot*180/Math.PI+90;
    if (segedrot+90>=270) {
    var rotvar = segedrot-180;
    } else {
    var rotvar = segedrot+180;
    }
    segedrot = Math.round(segedrot);
    if ((oldrot<=180 && segedrot>=180 || oldrot>=180 && segedrot<=180) && segedrot>0 && oldrot>0) {
    setButton(-180);
    if (oldrot<=180) {
    var rotvar = 360;
    } else {
    var rotvar = 0;
    }
    } else {
    button._x = Math.round(SUGAR*Math.sin(rotd*Math.PI/180)+KOZEPX);
    button._y = Math.round(SUGAR*Math.cos(rotd*Math.PI/180)+KOZEPY);
    oldrot = segedrot;
    }
    setVOL(rotvar);
    };
    }
    function stopCircle() {
    delete onMouseMove;
    button._alpha = 80;
    }
    function setButton(val) {
    button._x = Math.round(SUGAR*Math.sin(val*Math.PI/180)+KOZEPX);
    button._y = Math.round(SUGAR*Math.cos(val*Math.PI/180)+KOZEPY);
    }
    function setVOL(rotvariable) {
    var vol = Math.round(rotvariable/360*100);
    bgSound.setVolume(vol);
    Vol = vol;
    }
    setButton(180);
    button._alpha = 80;
    function Volup() {
    volup = 0;
    onEnterFrame = function () {
    if (volup>=75) {
    volup = 75;
    delete this.onEnterFrame;
    button.enabled = true;
    } else {
    volup+=3;
    }
    setButton(-(volup/100*360)+180)
    Vol = volup;
    bgSound.setVolume(Vol);
    };
    }
    button.enabled = false;

    startCircle a lényeg ugyebár, sztem nagyjábol egyértelmu a kod, de ha nem akkor szolj és megmagyarázom. Nagyon szépen köszönöm előre is!

    //Egyébként ha szabad megkérdeznem, te miota programozol?
    Mutasd a teljes hozzászólást!
  • közben gondolkoztam és asszem rájöttem hogy tudom megoldani hogy negyedkörre lehessen csak rávinni.
    más kérdés: bár lehet uj topik kéne ehhez: van arra ötletetek hogy egy mp3mat hogy lehet szételemezni?
    http://www.devnet.hu/flash/news_rovat_hir.php?frm_id=909
    ilyesmi program kéne csak ez fizetős sajna és sehol enm találtam
    Mutasd a teljes hozzászólást!
  • igen, erre is gondoltam, ezzel az a baj, hogy ha nem ugráltatja meg valaki, hanem csak egyszeruen gyorsan tekeri, akkor le fog maradni nem?
    bár az onmousemove esemény elvben mindig bekövetkezik ha mozgatjuk az egeret, de ugy rémlik hogyha pl 90 fokrol lehuzom gyorsan 180 ra mondjuk akkor a flash nem tudja egyesével követni hanem valami ilyesmi lenne ha kitracelném:
    90 102 123 145 156 177 190
    ez csak egy példa volt
    Mutasd a teljes hozzászólást!
  • hali!

    es ha figyelned, hogy a poti egyszerre csak lepeskoznyit mozduljon el? igy a nagy ugrasok egybol ki lennenek zarva, tehat nem ugorhatna el. vagy nem jol ertem a problemadat?
    Mutasd a teljes hozzászólást!
  • hopp!
    nagyon köszönöm a választ, nem gondoltam volna hogy ilyen hamar ilyen komoly segitség érkezik.
    azért azt nem mondanám hogy kezdő programozo vagy, sőt az igazság az hogy amint átfutottam elsőre nem teljesen értem a kodot.
    bár hozzá kell tenni hogy csak 2 éve programozom, azt is inkább hobbi szinten még.
    megnéztem a megoldás, és 180 foknál lennt sajnos ez is átugrik, nem tudom mi lehet a gond.
    igazából nem feltétlenül konkrét scriptre gondoltam elsősorban hanem az elvre, hogy mi oldhatja meg matematikailag a gondomat.
    mindenesetre mégegyszer nagyon köszönöm, még ma átfutom a kodot alaposan is, csak msot röviden tudok válaszolni mert nem otthon vagyok.
    Mutasd a teljes hozzászólást!
  • eszembe jutott: nem biztos, hogy igazán tudtam segiteni, hiszen /* mint ahogy írtam */ az általam írt scriptben is van flip...
    a "favágó" javítás lehet a következő:
    1) felveszel egy további mezőt k-ba (amiben majd a gomb legutolsó helyzetét fogjuk nyílvántartani [0..1], így legalább ezt bármikor le is tudjuk kérdezni), mondjuk a
    k.lastq = 0;
    után
    k.lasta = 0;
    kezdőértékkel
    2) a
    this._parent._rotation = 360 * a;
    beállítás/elfordítás után értelemszerűen "update"-eljük:
    k.lasta = a;
    3) a lényeg (az igazi "favágás"): a case 0,1 : eseteknél, az 'a' aktuális értékének kiszámítása után: a
    this.lastq = q;
    helyett a következőt írjuk:
    if ((k.lasta == 0 || k.lasta == 1) && Math.abs(a - 0.5) < 0.45) a = -1; else this.lastq = q;
    /* azaz, ha előzőleg "koppantunk", akkor csak abban az esetben vesszük figyelembe az új értéket, ha egy adott szeletben vagyunk; célszerű lenne, ha 'a'-t nem [0..1]-be normalizálnánk, hanem a [0..360]-ba, így jobban látszódna, hogy miről is van szó, de nem akartam több helyen javítani...*/
    persze így is marad az a szépséghiba, hogy a megfogásnál/körbecsavarásnál a "foggantyú" az egérhez ugrik, de ez talán egyszerűen javítható...
    az is lehet persze, hogy egyszerűbb úgy megkeresni egy megoldást, hogy felállítassz egy egyszerű automatát, majd megkeresed a megfelelő átmeneti szabályokat /* a lehetséges állapotok:
    1) nem fogtuk meg a potit, 2) mindkét irányba tekerhető, 3) 0-ra koppantunk, jobbra lehet tekerni, 4) 100(%)-ra koppantunk, balra lehet tekerni...stb... */
    Mutasd a teljes hozzászólást!
  • szvsz elmeletileg szigoru ertelemben veve nem tudod megoldani, mivel nem garantalhato, hogy generalodik koztes esemeny, ha pld. ~1/4-rol igen gyorsan atrantod az egeret ~3/4-re, akkor nem tudod 100%-osan meghatarozni, hogy jelen esetben a 0-t vagy a 2/4-et "erintetted-e", /* irj egy onMouseMove esemenykezelot egy mc-re, es monitorozd a mutatoeszkoz poziciojat, minnel gyorsabban rangatod, annal nagyobb "lyukak" lesznek... */
    ez persze csak az elmelet, a gyakorlatban "megoldhato", szerintem az a legegyszerubb, ha siknegyedeket figyelsz, csak a szomszedos oldaluak kozott engedsz meg atjarast, kiveve persze a [0..1/4] es a [3/4..1] negyedeket,
    itt egy egyszeru peldascript (gondolatebresztonek):
    //---snip--- function drawHexagon(mc, r, c) { mc.beginFill(c); mc.moveTo(0, r); for (var i = 1; i < 6; i++) { var a = i / 3 * Math.PI + Math.PI / 2; mc.lineTo(r * Math.cos(a), r * Math.sin(a)); } mc.endFill(); } function createSlider(x, y, r, d) { var b = this.createEmptyMovieClip("base" + d, d); drawHexagon(b, r, 0); b._x = x; b._y = y; var k = b.createEmptyMovieClip("knob", 0); drawHexagon(k, r / 4, 0xff0000); k._x = 0; k._y = -3 / 4 * r; k.lastq = 0; k.updateKnob = function() { var x = _xmouse - this._parent._x; var y = _ymouse - this._parent._y; var q = x >= 0 ? (y < 0 ? 0 : 1) : (y > 0 ? 2 : 3); var a = -1; trace("\t[twirl]\n\t\tlastq=" + this.lastq + "\n\t\tx=" + x + "\n\t\ty=" + y + "\n\t\tq=" + q); switch (Math.abs(this.lastq - q)) { case 0 : case 1 : a = Math.atan2(y, x) + Math.PI / 2; if (a < 0) a += 2 * Math.PI; a /= 2 * Math.PI; this.lastq = q; break; case 2 : break; case 3 : a = q == 0 ? 1 : 0; break; } if (a != -1) { trace("\t\ta=" + (100 * a) + "\n\t-----------------------"); this._parent._rotation = 360 * a; updateAfterEvent(); } } k.onPress = function() { trace(this._parent._name + "\n\t[grab]"); this.updateKnob(); k.onMouseMove = this.updateKnob; k.onRelease = k.onReleaseOutside = function() { trace("\t[release]\n==========================="); delete(this.onMouseMove); delete(this.onRelease); delete(this.onReleaseOutside); } } return b; } var W = Stage.width; var H = Stage.height; var S = Math.max(W, H) / 10; createSlider(1 * W / 5, H / 2, S, 0); createSlider( W / 2, H / 2, S, 1); createSlider(4 * W / 5, H / 2, S, 2); stop(); //---snip---
    0) ertelemszeruen nincs "setter"-e, stb., csak egy pelda...
    1) nem igazan szep a kod /* kezdo AS koder vagyok meg mindig, meg regen kodoltam AS-t/-ben egyebkent is... */
    2) az egyszeruseg kedveert "megfogasnal" a tekerentyu a "jel" kozepere igazodik, ami zavaro lehet, a megoldast rad bizom...
    3) ha vmelyik szelsoertekig tekered a potit, majd 180 fokkal tovabb "tekered az egeret", akkor atugrik...
    ezt nem is olyan egyszeru kijavitani, mivel tultekeressel tetszoleges kozel kerulhetsz a tultekert allashoz, es akkor elvarnad, hogy utana lereagalja a tekerentyu a (jo)mozgast, azaz hiaba ellenorizned a mozgas iranyat stb., nem segitene...,
    talan az lenne a legegyszerubb, hogy tovabbtekeresnel, ha lelepsz a "jelrol"(ahol megfogtad/amivel tekered), akkor a kovetkezo eltekereshez megint ra kellene (logikailag) allnod stb...ennek figyelese/menedzselese nem tunik bonyolultnak,
    igazabol azert nem foglalkozom vele, mivel /* rettentoen lusta vagyok, es */ amugy sem szeretem, ha vmit ugy tudunk "mozgatni", hogy kozben "vizualisan" elengedjuk, levisszuk rola a mutatot, stb., az alapotlet (siknegyedek kozotti atjaras ellenorzesenek) bemutatasa miatt nem akartam tovabb bonyolitani...
    4) ...stb...

    ps. tesztelve: Macromedia Flash MX(6) alatt...
    Mutasd a teljes hozzászólást!
  • Üdv!

    Általában magamtól szoktam rájönni az ilyen dolgokra, de ezt most kénytelen vagyok beirni, mert már 3.napja gondolkozom rajta, és nem nagyon megy a megoldása. Talán meg tudnám oldani kerülőutakkal, de jobbnak láttam, hogy beirom ide, remélem lesz valaki aki találkozott már hasonló problémával.

    Arról van szó, hogy van egy kör, aminek a körvonalán lehet mozgatni egy kis gombot, ezt az egészet egy hangerőbeállításhoz használom, tehát ha pl 90 foknál van (azaz 3 óránál) a gomb, akkor ugye 25% os a hangerő. Biztos láttatok már ilyet, pl azt hiszem régi power dvdnél használtak ilyesmit. Trigonometriával meg van oldva a dolog, a gond a következő:

    Kell egy ütközéspont felülre, azaz, hogyha valaki feltekerte 100% ig a hangot akkor utána ne tudja továbbtekerni, hanem megálljon az egész, ugyanez 0 foknál ahol ne lehessen áttekerni 360 fokba.
    Hogy érthetőbb legyen erről van szó:
    http://stopthebees.uw.hu/main.html (jobb felső sarokban van az mp3 lejátszó).
    Ugy tünhet, hogy megoldottam ezt is, de sajnos nem teljesen, és ebben kérek segitséget most:
    hogyha valaki továbbtekeri 360 foknál akkor megáll egy ideig, de ha eljut 90 fokig, akkor odaugrik a gomb, ugyanez a másik oldalról (Tehát 0 fokról) is, csak ott 180 foknál ugrik át.

    A működése a dolognak: 2 változot használok, egy ELŐZŐPOZICIO meg egy UJPOZICIO, ami fokban megadja mindig hogyaz uj pozicio előtt eggyel éppen hány foknál állt a gomb. Ennek segitségével tudom eldönteni, hogy jobbrol vagy balrol megy e az ütközés.

    Jelenleg a kör igy néz ki:
    felül 180 fok, 3 óránál 270 fok, majd ha ezt elérte akkor rögtön -90 , 6 óránál tehát lent 0 fok, majd 9 óránál 90 fok. Azért van ilyen furcsán mert a flash igy számolja, de át tudom konvertálni 0-tól 360 fokig is, csak sajnos nem megyek vele többre.

    Aki eddig végigolvasta annak nagyon köszönöm, mostmár tényleg itt a vége: a feltétel amivel tesztelem, hogy megkapja e az uj poziciokat a gomb vagy ne mozogjon:

    if ((ELŐZŐPOZICIO<=180 && UJPOZICIO>=180 || ELŐZŐPOZICIO>=180 && UJPOZICIO<=180) && UJPOZICIO>0 && ELŐZŐPOZICIO>0) {
    //nem csinál semmit
    } else {
    itt megkapja az uj x és y poziciokat, valamint beirod ELŐZŐPOZICIO értéke is.

    A gond szerintem egyértelmű innen: azért kell belvenni hogy mindkét változo 0nál nagyobb is legyen, mert különben lenne egy blokkolási pont 3 óránál is: hiszen 270 nagyobb mint 180 és -90 kisebb mint 180. Ezzel viszont amint elérem azt ahol negativ az érték ott máris nem teljesül a feltétel vagyis az else ág hajtodik végre, tehát megkapja az uj pocizokat ezért kattan be.

    Nagyon megköszönöm annak aki segiteni tud, hogyha át kell irni a fokrendszert ugy hogy 0 tól menjen 360 ig az is tökéletes megoldás, de én ugy sem tudtam mit kitalálni rá.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd