Avatar billede marrix Juniormester
01. januar 2004 - 09:58 Der 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?

Venligste nytårshilsener
Marianne
Avatar billede blim Nybegynder
01. januar 2004 - 13:16 #1
Hej...
Jeg ved ikke om det er mig der går glip af noget men har du muligvis overset det mest obvious :)

hvor skriver du ikke :
if the ticks > t then sprite(12).blend = 100

istedet for den tomme repeat?

Jeg har ikke afprøvet det da jeg var på vej ud af døren, kan også være jeg har overset noget... men se om det ikke virker
Avatar billede nilla Nybegynder
01. januar 2004 - 13:20 #2
Har du prøvet at lægge et check på musens position ind??
Hvis du kontrollerer musens position inden du starter din løkke
er dit problem muligvis løst.

on mouseEnter
  cursor 280
  t = the ticks + 60
if mousepos ??????? then
  repeat while (the ticks < t)
  end repeat 
  sprite(12).blend = 100
end
end
Avatar billede marrix Juniormester
01. januar 2004 - 19:19 #3
...okay...jeg prøver lige lidt af hver og vender tilbage.

Marianne
Avatar billede marrix Juniormester
04. januar 2004 - 21:09 #4
blim...

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.

Vender tilbage...

Venligst
Marianne
Avatar billede nilla Nybegynder
04. januar 2004 - 21:20 #5
Hej Marianne
Der skal ikke ret meget kode til.

Du checker musens koordinater og prøver f.eks:

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
Avatar billede nilla Nybegynder
04. januar 2004 - 21:22 #6
Jeg tror der skal tilføjes en begin ... 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
Avatar billede marrix Juniormester
04. januar 2004 - 23:15 #7
Hej nilla

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.

Tak til både blim og nilla for hjælpen...

Venligst
Marianne
Avatar billede marrix Juniormester
04. januar 2004 - 23:18 #8
Hej nilla - fik du pointene? Der gik lidt kludder i maskinen da jeg netop skulle til at være gavmild.

Allervenligst
Marianne
Avatar billede nilla Nybegynder
05. januar 2004 - 07:34 #9
ja det ser ud til det - tak

Hilsen Nilla

PS jeg ser lige om jeg kan få en god ide.
Avatar billede marrix Juniormester
06. januar 2004 - 10:42 #10
Hej...

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

  punktH = sprite(the currentSpriteNum).locH
  punktHmin = (punktH - 12)
  punktHmax = (punktH + 12)
 
  punktV = sprite(the currentSpriteNum).locV
  punktVmin = (punktV - 12)
  punktVmax = (punktV + 12)
 
 
  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
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
Kurser inden for grundlæggende programmering

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