Comunidad de diseño web y desarrollo en internet online

La propiedad _alpha no es exacta?

Citar            
MensajeEscrito el 23 Jun 2005 09:38 am
Tuve varias veces problemas por esto, asi que esta vez me tomé un poco de tiempo en hacer algunas pruebas, el resultado es "inquietante"... o yo soy un nabo que se me escapa algo...

El tema es que asigno un valor a _alpha pero lo leo y no es el mismo valor, es uno similar... mirar este ejemplo basico. A ver si se me escapa algo...

EL código es este:

Código :

mc._alpha = 0;
var alpha:Number = 0;
stop();
//
this.onEnterFrame = function() {
   mc._alpha = alpha;
   alpha++;
   //
   trace("MC: " + mc._alpha + " / VAR:" + alpha);
};


Y el resultado del codigo es este:
MC: 0 / VAR:1
MC: 0.78125 / VAR:2
MC: 1.953125 / VAR:3
MC: 2.734375 / VAR:4
MC: 3.90625 / VAR:5
MC: 4.6875 / VAR:6
MC: 5.859375 / VAR:7
MC: 6.640625 / VAR:8
MC: 7.8125 / VAR:9

Por josepzinkjn

63 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 09:51 am
tienes razón, no es exacta. la propiedad _alpha en realidad solo puede tomar 256 valores distintos. 100/256 = 0,390625, así que los valores que puede tomar son:
0,390625*0 = 0
0,390625*1 = 0,390625
0,390625*2 = 0,78125
0,390625*3 = 1,171875
0,390625*4 = 1,5625
0,390625*5 = 1,953125
....
0,390625*255= 99,609375
0,390625*256= 100

Cuando le asignas un valor, en realidad toma el más cercano de los posibles.

Espero haberte aclarado algo. saludos

Por schs

37 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 09:53 am
En tu ejemplo no salen los valores más cercanos al que le estás asignado porque el trace lo haces depues de alpha++, pero el funcionamiento es ese ^^

Por schs

37 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 09:54 am
Hooo!! Que lo parió! Muchas gracias!

Esta son la clase de tonterías que le hacen perder a uno MUCHO tiempo...

Sabes si hay alguna manera de hacerlo mas exacto?

Por josepzinkjn

63 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 10:14 am
En principio no hay manera más exacta de hacerlo. Como "arreglo" se me ocurre algo asi:

Código :

function setAlpha256(mc:MovieClip:alpha:Number) {
 mc._alpha = (alpha)*100/256

}

function getAlpha256(mc:MovieClip):Number {
 return = (mc_alpha)*256/100

}


Esto serían dos funciones para establecer y leer la propiedad alpha, pero en lugar de considerala entre 0 y 100 la considera entre 0 y 256.
Por ejemplo:
mc._alpha=0;
trace(getAlpha256(mc)); ---> debe devolver 0

mc._alpha=100;
trace(getAlpha256(mc)); ---> debe devolver 256

mc._alpha=50;
trace(getAlpha256(mc)); ---> debe devolver 128

setAlpha256(mc,0);
trace(mc._alpha) ---> debe devolver 0
trace(getAlpha256(mc)); ---> debe devolver 0

setAlpha256(mc,128);
trace(mc._alpha) ---> debe devolver 50
trace(getAlpha256(mc)); ---> debe devolver 128


setAlpha256(mc,100);
trace(mc._alpha) ---> debe devolver 39,0625
trace(getAlpha256(mc)); ---> debe devolver 128

setAlpha256(mc,256);
trace(mc._alpha) ---> debe devolver 100
trace(getAlpha256(mc)); ---> debe devolver 256


Asi controlas un poco más exactamente, aunque realmente no creo que valga la pena, es raro que se necesite tener un valor de alpha con exactitud, no se va a notar la diferencia de unas décimas.

saludos

Por schs

37 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 10:20 am
Ok, ok, muchas gracias por la molestia. Ya lo probaré a ver si me sirve o no.

De todos modos, supongo que tendrá su lógica para que sea así... pero es sumamente "chocante" no recibir los mismos valores que se supone uno almacena... :)

Lo importante es saber como son las cosas para no cometer errores gracias a ignorar algo como esto...

Gracias de nuevo!

Por josepzinkjn

63 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 10:52 am
Supongo que será por cuestiones técnicas. No se cuanto sabes de informatica, pero por si acaso aclaro que hay muchas formas de almacenar números en memoria: enteros, con signo, sin signo, coma fija, coma flotante... y además distintos tamaños: byte, word...
Es chocante aunque tiene su lógica. En un ordenador internamente todo son números binarios. Para representar en el sistema decimal un número entre 0 y 99 (100 valores distintos) necesitas 2 cifras. Para números más grandes (a partir del 100) ya necesitas una cifra más, con lo que te ocupa más espacio (incluso espacio físico, en papel, 3 cifras ocupan más que dos). Para representarlo en binario (1100100), necesitas 7 bits. De esa forma, estás reservando 7 bits para representar un número que solo va a tomar valores entre 0 y 99. Parece correcto, pero es que con esos 8 bits en binario puedes almacenar hasta el valor 128 (1111111), con lo que si solo permites valores entre 0 y 100, hay combinaciones que no estás usando, por lo tanto estás desperdiciando espacio. Esa es la razón por la q en informática se trabaja tanto con valores que son potencias de 2 (128,256,512,1024) en lugar de con números redondos de toda la vida (10,100,1000), es una forma de optimizar los recursos. Típicamente para variables que van a tomar valores pequeños se usa el tipo byte (8 bits->256 posibles valores).
Supongo (remarco supongo, que no tento ni idea de las verdaderas razones,solo es lo que me imagino yo) que en macromedia elegirian almacenar el valor de alpha con un byte porque es el tamaño más pequeño que da un resultado aceptable. Podrian haberlo implementado con otro tipo (coma flotante, por ejemplo) que diera valores exatctos con 50 decimales, aunque sería desperdiciar recursos ya que nadie va a necesitar tanta exactitud. En muchos otros lenguajes de programación para los colores y transparencia se usan típicamente valores entre 0 y 255 directamente. Supongo que habrán hecho la "conversión" a 0..100 para que sea más intuitivo, ya que todo el mundo está más acostumbrado a manejar porcentajes.

A la hora de la verdad esto tampoco tiene demasiada importancia aunque hay situaciones en las que puede llevar aun buen quebradero de cabeza.
Por ejemplo, hay que tener cuidado de no hacer esto:
mc._alpha = 20;
if (mc._alpha==20) .....

ahí probablemente la comparación sería falsa (sería casi 20 pero no exactamente 20) y no entraría en el if. Por eso es recomendable evitar los == en la medida de lo posible, cambiarlos por >=, != u otra comprobación.


Bueno, vaya parrafada he soltado. se ve que estoy aburrido :lol: jeje
saludos

Por schs

37 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 11:01 am
Sí, se te ve aburrido ;)

Básicamente el tema de los Bytes/Bits lo sabía, aunque hacía mucho mucho que no leía algo del tema. Mis tiempos de Código Máquina (!) de la C=64 y de Assembler en XT/286 han quedado muy muy lejos en el pasado...

Lo de preguntar por el _alpha > ==, etc hace mucho que aprendí que ciertas cosas "no se hacen" porque dan problemas. Una de ellas era esto del _alpha, pero no me imaginaba que el problema venía por este lado.

Sobre el porqué de 0-256, estoy de acuerdo que lo han puesto de 0-100 para que la gente se ubique mas rapido.

También resulta curioso pensar el porqué la gente de Necromedia no han aplicado una solución a este problema para que no se produzcan esta clase de errores o malentendidos...

Por josepzinkjn

63 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Jun 2005 11:11 am
En la ayuda de Macromedia indican que el numero en si es un porcentaje y no es equivalente al valor ... pero revisando en los LiveDocs, parece que ya estan "informados" de que no es la mejor opción:
Livedoc del _alpha
Pues nada ...

PD.
Bueno, vaya parrafada he soltado. se ve que estoy aburrido xD jeje

xD xD xD

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

clabbofh

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.