[AS3.0] Enkele pixels gaan verloren bij scrollen

Pagina: 1
Acties:

  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Ik heb enkele simpele lijntjes AS3-code die zorgen dat een movieclip verplaatst/gescrolled wordt.

code:
1
2
3
4
5
ratio:Number = (content_mc.height-mask_mc.height)/mask_mc.height;

var deltaScroll:Number = (this.thumb.y-oldPos)*ratio;
content_mc.y -= deltaScroll;
oldPos = thumb.y;


Nu heb ik het probleem dat ik onderaan enkele pixels te kort kom. Ik scroll dus volledig naar beneden, en de movieclip verplaatst perfect mee. Maar wanneer ik volledig met de thumb van de scrollbar beneden ben, zijn er toch nog enkele pixels van mijn movieclip onzichtbaar (die zich dus nog onder de mask bevinden).

Iemand die kan zien in de code hoe dit probleem ontstaat? Ik denk dat het iets te maken heeft met afronding van getallen, maar zie niet direct waar.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

trace je posities dan eens? :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Heb eens een trace uitgevoerd.

De thumb verplaatst zich perfect. Gaat volledig tot beneden. Maar de content wordt niet iedere keer juist verplaatst. Het wordt zelfs per scrollbeurt wat minder verschoven.

voorbeeld: eerste keer dat je naar beneden scrollt gaat alles perfect: thumb volledig naar beneden en de content verplaatst zich zodat alles zichtbaar wordt.

Wanneer je daarna naar boven scrolled en dan opnieuw volledig nar beneden, loop het fout. De content wordt ongeveer een pixel minder naar boven verplaatst, waardoor onderaan de laatste pixel niet meer in de mask komt en dus onzichtbaar wordt.

Als je dan nog eens naar boven en opnieuw naar beneden scrolled, wordt er een extra pixel minder verplaatst. Nu zijn er dus twee pixels niet zichtbaar onderaan, enz.


Lijkt mij dat er iets moet mislopen bij het gebruiken van de oude Y-coördinaat positie (oldPos). Daar wordt er telkens een deeltje afgekapt ofzo, maar zie echt niet in hoe. Want er wordt met numbers gewerkt en niet met integers.

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 00:29
Mischien is juist dat je probleem wel. Een halve pixel niet tonen kan heel goed gelijk staan aan een hele.

Acties:
  • 0 Henk 'm!

Verwijderd

Ook floating point getallen hebben last van afronding. Je telt nu telkens deltaScroll op bij je y-positie. De afronding van deltaScroll hoopt zich hierdoor op in de waarde van je y-positie.
Beter is, de y-positie opnieuw uit te rekenen aan de hand van je scroll positie etc. Dus niet zeggen:

code:
1
content_mc.y -= deltaScroll;


maar

code:
1
content_mc.y = [berekening van nieuwe positie];


Edit:
Nu ik er even over nadenk: de onnauwkeurigheid van floating point getallen speelt hier waarschijnlijk niet echt; content_mc.y is waarschijnlijk een integer variabele. Dan kan je deltaScroll nog zo nauwkeurig berekenen; zodra je de waarde bij content_mc.y optelt, wordt het resultaat afgerond.

De oplossing blijft hetzelfde; nieuwe waarde van de y-positie herberekenen en niet delta's optellen.

[ Voor 32% gewijzigd door Verwijderd op 27-11-2009 11:17 ]


Acties:
  • 0 Henk 'm!

  • F e r o x
  • Registratie: Mei 2006
  • Laatst online: 18-11-2024
Had nu inderdaad de code veranderd naar een nieuwe waarde dit telkens berekend wordt.

Maar het blijft een raar probleem met de vorige code. Indien er afronding is, lijkt het mij niet dat het in praktijk een rol speelt. Maar het werkt nu, wat natuurlijk het belangrijkst is.

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Daarom zei ik ook: tracen ;) Dat geeft je iig beeldvorming of je door een halve pixels steeds een pixel verliest. Als je dat maar vaak genoeg doet, dan ga je vanzelf hoogte verliezen ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Verwijderd schreef op vrijdag 27 november 2009 @ 10:51:
Nu ik er even over nadenk: de onnauwkeurigheid van floating point getallen speelt hier waarschijnlijk niet echt; content_mc.y is waarschijnlijk een integer variabele. Dan kan je deltaScroll nog zo nauwkeurig berekenen; zodra je de waarde bij content_mc.y optelt, wordt het resultaat afgerond.
Flash rond y-posities niet af. Een object kan prima op halve pixels staan. (ook al zie je dat op je scherm natuurlijk niet)

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Tsjilp schreef op vrijdag 27 november 2009 @ 13:23:
[...]


Flash rond y-posities niet af. Een object kan prima op halve pixels staan. (ook al zie je dat op je scherm natuurlijk niet)
Wat geen zak te maken heeft met het feit dat afrondingsfout op afrondingsfout op afrondingsfout op ... uiteindelijk natuurlijk een aantal pixels kan doen ontbreken.

Floats en afronding

[ Voor 11% gewijzigd door RobIII op 27-11-2009 13:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1