2010-10-30 13 views
6

En ActionScript 3 (y IIRC 2), las propiedades x e y de un objeto de visualización siempre se almacenan como múltiplos de 0,05.AS3 xyy precisión de propiedad

así que algo como obj.x = 66.6666 es lo mismo que obj.x = 66.65

mayoría de las veces, esto no importa. Pero a veces puedo terminar con objetos realmente lentos, por ejemplo, 1 píxel por segundo. 1/60 (fps) = 0.017 píxeles por cuadro. obj.x += 0.017nunca realmente cambian el valor x, ya que se redondea al 0.05 más cercano.
Esto me obliga a anular las propiedades x & y de un DisplayObject para que no se redondeen.

Puedo entender las coordenadas de redondeo al valor integral más cercano para la representación. Con un renderizador más avanzado, puedo incluso entender el redondeo a una fracción representable en binario (por ejemplo, 0.25). Pero 0.05 no se puede representar exactamente en binario.

Entonces, ¿por qué los creadores de Flash decidieron redondear al .05 más cercano? Simplemente me parece un número tan arbitrario.

Respuesta

9

Desde el Wikipedia article on Twips:

Flash calcula internamente nada que utiliza píxeles con twips (o 1/20 de un píxel). Sprites, clips de película y cualquier otro objeto en el escenario son posicionado con twips. Como resultado, las coordenadas de (por ejemplo) sprites son siempre múltiplos de 0.05 (es decir, 1/20). (Es decir, 1/20).

Una solución alternativa sería almacenar las coordenadas en un Número, y luego asignarlas a las propiedades del objeto displaye.

+0

bien, pero mi pregunta es más acerca de qué es el anuncio ventajosa de usar múltiplos de .05 es. – Ponkadoodle

+3

De acuerdo con las especificaciones de formato de archivo SWF, "Twips es un buen compromiso entre el tamaño y la precisión. Proporcionan una precisión subpíxel para el zoom y la colocación precisa de los objetos, mientras que consume muy pocos bits por coordenada". –

+0

¿No fue esta respuesta lo que estabas buscando? –

5

Aún mejor, la precisión es diferente para otras propiedades de DisplayObject ... consideran siguiente código:

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); 

es la salida

0.058823529411764705 
0.0588235294117647 
0.0588235294117647 
0.05 
0.05 
0.058823529411764705 

lo que significa que la rotación se almacena en la precisión de número, x y y en twips (múltiplo de 0.05) y scaleX y scaleY se almacenan en precisión que es cercana a Number pero un poco menos (tal vez exactamente un bit menos?)

+0

Esto es bueno saberlo. Aclamaciones. – Jono

+1

Eso es triste de descubrir, y es ridículo. Los números se deben almacenar como Número; este redondeo arbitrario solo requiere problemas de scripting, como errores acumulativos al transformar las coordenadas, y en serio, ¿un BIT menos precisión para escalar? Es como si alguien intencionalmente hubiera saboteado el sistema.Es como "Oh, ese es un número, así que puedo hacer un cálculo con él, excepto que no, no puedes, porque está redondeado bajo el capó sin previo aviso". – Triynko