2010-10-30 15 views
6

In ActionScript 3 (e IIRC 2), le proprietà x e y su un oggetto di visualizzazione vengono sempre memorizzate come multipli di 0,05.Precisione delle proprietà di x e y 3d AS

così qualcosa come obj.x = 66.6666 è lo stesso di obj.x = 66.65

maggior parte del tempo, questo non importa. Ma a volte posso finire con oggetti molto lenti, ad esempio 1 pixel al secondo. 1/60 (fps) = 0,017 pixel per fotogramma. obj.x += 0.017 sarà mai effettivamente modificare il valore x, poiché viene arrotondato al più vicino 0,05.
Questo mi costringe a ignorare le proprietà x & y di DisplayObject in modo che non siano arrotondate.

Posso capire le coordinate di arrotondamento al valore integrale più vicino per il rendering. Con un renderer più avanzato, posso persino capire l'arrotondamento a una frazione rappresentabile in binario (ad es. 0.25). Ma 0.05 non può essere rappresentato esattamente in binario.

Quindi, perché potrebbe essere che i creatori di Flash hanno deciso di arrotondare al più vicino .05? Mi sembra un numero così arbitrario.

risposta

9

Dal Wikipedia article on Twips:

Flash calcola internamente nulla che utilizza pixel con twips (o 1/20 di un pixel). Sprite, filmati e qualsiasi altro oggetto sul palco sono posizionati con twip. Di conseguenza, le coordinate degli sprite (ad esempio) sono sempre multipli di 0,05 (vale a dire 1/20) (vale a dire 1/20).

Una soluzione alternativa consiste nel memorizzare le coordinate in un numero e quindi assegnarle alle proprietà del displayobject.

+0

ok, ma la mia domanda è più su ciò che l'annuncio vantaggio di utilizzare multipli di 0,05 è. – Ponkadoodle

+3

In base alle specifiche del formato di file SWF, "I twip rappresentano un buon compromesso tra dimensioni e precisione, forniscono accuratezza sub-pixel per lo zoom e il posizionamento preciso degli oggetti, mentre consumano pochissimi bit per coordinata." –

+0

Questa risposta non era quello che stavi cercando? –

5

Ancora meglio, la precisione è diverso per altre proprietà di DisplayObject ... considerare codice seguente:

var tmp:Number = 1/17; 
var s:Sprite = new Sprite(); 
s.scaleX = tmp; 
s.scaleY = tmp; 
s.x = tmp; 
s.y = tmp; 
s.rotation = tmp; 
trace(tmp); 
trace(s.scaleX); 
trace(s.scaleY); 
trace(s.x); 
trace(s.y); 
trace(s.rotation); 

risultato sarà

0.058823529411764705 
0.0588235294117647 
0.0588235294117647 
0.05 
0.05 
0.058823529411764705 

che significa che la rotazione è memorizzato in Numero precisione, x e y in twip (multipli di 0.05) e scaleX e scaleY sono memorizzati in precisione vicino a Number ma un po 'meno (forse esattamente un bit in meno?)

+0

Questo è bello sapere. Saluti. – Jono

+1

Questo è triste da scoprire, ed è ridicolo. I numeri dovrebbero essere memorizzati come numero; questo arrotondamento arbitrario richiede solo problemi di scripting, come errori cumulativi durante la trasformazione delle coordinate e, seriamente, un bit meno precisione per il ridimensionamento? È come se qualcuno avesse sabotato di proposito il sistema.È come "Oh, questo è un numero, quindi posso fare un calcolo con esso, tranne, no, non puoi, perché è arrotondato sotto il cofano senza preavviso." – Triynko

Problemi correlati