01. januar 2004 - 09:58Der er
9 kommentarer og 1 løsning
Forsinkelse med afbrud
Hej...
Jeg skal have en sprite til at dukke op på stage, efter en kort forsinkelse, når "on mouseEnter" (eller withIn) på en anden sprite. Har forsøgt mig med følgende, som er lagt på den sprite, der skal udløse handlingen:
on mouseEnter cursor 280 t = the ticks + 60 repeat while (the ticks < t) end repeat sprite(12).blend = 100 end
on mouseLeave cursor -1 sprite(12).blend = 0 end
Men problemet er, at der ikke skal ske noget overhovedet, hvis brugeren når at flytte cursoren fra spriten (der udløser handlingen) inden "the ticks + 60".
Som det ser ud nu udløses handlingen selv for et meget kort visit (gansk vist i et meget kort "glimt" - men irriterende at se på alligevel) pga. af den repeat, der sættes i gang. Jeg har forsøgt med noget exit repeat (exit if the mouseLeave), men det virker ikke.
Mon nogen har et simpelt forslag til lidt kodeværk, der kan løse mit problem?
Jeg har nu prøvet dit forslag. Men problemet er, at der tilsyneladende kun tjekkes i det musen entrerer (on mouseOver eller mouseWithin). Kode-stumpen bliver ikke ved med at tjekke, hvornår "the ticks > t" - det gør den kun hvis jeg holder fast i koden med en repeat.
Sådan ser det ihvertfald ud for mig lige nu (ret mig hvis jeg tager fejl). Så altså med dit forslag når "the ticks" aldrig at blive "> t", før end "on mouseWithin" er betragtet som et afsluttet kapitel.
Jeg mangler et eller andet der kan holde øje med om der fortsat er "mouseWithin" og hvis der er det (og KUN hvis der er det), så efter et kort øjeblik afslører den nye sprite.
...nilla
Jeg prøver nu med nillas forslag. Men da den knap, der skal udløse on mouseWithin -handlingen fylder mere end blot en enkelt pixel, er jeg i tvivl om hvor meget kode der skal til, for at tillade brugerne at flytte musen rundt inden for samme knap (ryste lidt på hånden), og alligevel udløse handlingen efter et givet antal ticks.
on mouseEnter cursor 280 t = the ticks + 60 if (mousex>dit_object.left) and (mousex<dit_object.left+dit_object.width) and (mousey>dit_object.top) and(mousey<dit_object.top+dit_object.height)then repeat while (the ticks < t) end repeat sprite(12).blend = 100 end end
on mouseEnter cursor 280 t = the ticks + 60 if (mousex>dit_object.left) and (mousex<dit_object.left+dit_object.width) and (mousey>dit_object.top) and(mousey<dit_object.top+dit_object.height)then begin repeat while (the ticks < t) end repeat sprite(12).blend = 100 end end end
Nu har jeg puslet lidt med noget a la det du har foreslået. Det jeg har fundet frem til - og som virker - er lavet inden for de sidste par timer, og før jeg (netop nu) læser dine to ovenstående forslag. Men mon ikke vi i det store hele er enige? Det jeg langt om længe (med en masse omveje) kom frem til er følgende:
------------------------- on mouseWithin cursor 280 t = the ticks + 60
repeat while ((mouseH() > 752) AND (mouseH() < 778)) AND ((mouseV() > 13) AND (mouseV() < 39)) if the ticks > t then exit repeat end repeat
if ((mouseH() > 752) AND (mouseH() < 778)) AND ((mouseV() > 13) AND (mouseV() < 39)) then if the ticks > t then sprite(11).blend = 100 end if end if end ---------------------
Din måde at tjekke musens position ser noget mere enkel ud - det må jeg lige kigge videre på.
I din repeat-løkke mangler der muligheden for at afbryde løkken når/hvis musen flytter sig væk fra knappen. Med din version vil der være en "tvungen" forsinkelse (svært at forklare - men man fornemmer det som om filmen går lidt i stå), hvis først løkken er sat i gang (selvom the ticks + 60 ikke er særlig lang tid - indrømmet).
Desuden skal det tjekkes (i min version ihvertfald), når løkken forlades om de to kriterier (musen stadig over knappen OG "the ticks > t") stadig er opfyldt. Hvis de er det, skal blend = 100.
Har du forslag til, hvordan jeg eventuelt kan skære lidt overflødig kode væk, så meld endelig tilbage. Jeg er selv lidt forbløffet over, at der skal så mange tjek til, men jeg har været omkring en del forskellige varianter af ovenstående.
Jeg forsøgte indledningsvis med blandt andet følgende mulighed:
---------------------- on mouseWithin cursor 280 t = the ticks + 60 repeat while ((mouseH() > 752) AND (mouseH() < 778)) AND ((mouseV() > 13) AND (mouseV() < 39)) if the ticks > t then sprite(11).blend = 100 end if end repeat end -----------------
...men if-then sætningen bliver ignoreret (eller misforstået - hvad ved jeg?!) så længe det foregår i repeat-løkken. Først når løkken forlades (altså musen forlader knappen) bliver if-then sætningen opfyldt i en brøkdel af et sekund.
??????????? Det forstår jeg ikke helt - men det er ihvertfald sådan det fungerer.
Du har allerede fortjent pointene - men hvis du har yderligere kommentarer eller gode ideer til koden, må du meget gerne vende tilbage.
Da der er mere en en enkel knap (sprite...), der skal have denne forsinkede meddelelse hæftet på sig, og da jeg oven i købet flytter lidt rundt på knapperne, for at tilpasse siden, har jeg ændret koden til noget mere "dynamisk".
Nu holder koden selv øje med, hvornår musen forlader knappen (eller rettere forlader det areal knappen fylder ud). Det ser lidt voldsomt ud, men var det bedste jeg kunne finde frem til. Kan der barberes noget væk, er jeg meget modtagelig for gode forslag:
NB! Knapperne fylder ca. 24 x 24 pixels. LocH og LocV giver mig knappens midterpunkt - derfor skal der lægges hhv. 12 (px) til og trækkes 12 (px) fra, for at kunne angive knappens samlede areal.
---------------------- on mouseWithin cursor 280 t = the ticks + 60
repeat while ((mouseH() > punktHmin) AND (mouseH() < punktHmax)) AND ((mouseV() > punktVmin) AND (mouseV() < punktVmax)) if the ticks > t then exit repeat end repeat
if ((mouseH() > punktHmin) AND (mouseH() < punktHmax)) AND ((mouseV() > punktVmin) AND (mouseV() < punktVmax)) then if the ticks > t then sprite(15).blend = 100 end if end if -------------------------
Venligst Marianne end
Synes godt om
Ny brugerNybegynder
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.