Comunidad de diseño web y desarrollo en internet online

Obtener una propiedad desde una array

Citar            
MensajeEscrito el 18 Sep 2010 11:28 pm
Buenas a tod@s,

Ante todo agradecer vuestro tiempo, ya que este foro es un referente para los que aprendemos actionscript.

Tengo una duda que me tiene en un callejón sin salida.

Tengo un objeto con la propiedad:

graphics.lineStyle (10, tinta, 1);

donde tinta es el color que le quiero dar des la pulsación de un botón.

Tengo un array:

var mycolor:Array = new Array("0xF9CC0F", "0xE0A032", "0xDA4A04", "0xC22F04", "0x992835", "0x9933CC", "0x333366", "0x006666", "0x0066CC", "0x333366", "0x653403", "0x000000", "0x333333");

Lo que quiero es que al pulsar un botón determinado, cambie el color, con lo que "tinta" tome el valor mycolor[0], mycolor[1], mycolor[2], etc...

Dejé Flash unos años, y con ActionScript 3 me está costando. Cualquier ayuda u orientación es de agradecer.

Un saludo y gracias de antemano ;-)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 19 Sep 2010 07:14 am
BuenAS:

Puedes plantearte varias opciones:

a) Utilizar en vez de un Array un Dictionary. Esto te permite acceder a los colores guardados con una referencia del botón y no con un índice numérico, como es el caso de la matriz:

Código ActionScript :

var misColores:Dictionary = new Dictionary();
misColores[botonRojo] = "0xff0000";
misColores[botonAzul] = "0x0000ff";
...
function clickHandler(event:MouseEvent):void
{
   var colorElegido:uint = misColores[event.target];
   //en la variable colorElegido recuperarías el color asociado al botón que se pulse en cada momento.
}


b) Llamar a tus botones secuencialmente, por ejemplo "boton_0", "boton_1", .... y después en la función controladora del evento Event.CLICK recuperas este número del nombre del botón pulsado, y accedes con el a la matriz para obtener el color.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Sep 2010 02:49 pm
Fantástico Lukánicos,

Mucho mejor, y con menos código. No conocía el Array Dcitionary.

Aún así, mi problema sigue estando, aunque en menor medida. El botón de cada color devuelve el valor del color correctamente. No obstante, en la llamada a la propiedad de color de graphics.lineStyle (10, tinta, 1); sustituyo tinta por la variable colorElegido y el depurador me dice que intenta acceder a un valor (colorElegido) no definido.

En cambio, si usava una variable a la que asignaba el color directamente como Number, al utilizar en esta línea el nombre de la variable sí me funcionaba.

No sé si puede haber problema en que independientemente de elegir un color, debe haber un color definido por defecto para iniciarse el clip (independientemente de que luego se modifique el valor del color desde los botones). ¿Cómo se puede aplicar un valor por defecto, y que pueda ser modificado después desde los botones?

Gracias de antemano, y si necesitas algo de diseño gráfico o fotografía (a lo que me dedico profesionalmente) estaré encantado en ayudarte (es lo menos que puedo hacer).

Un saludo ;-)

Pedro J. Bernal

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 19 Sep 2010 03:14 pm
BuenAS:

Imagino que el problema está en que no está definido el valor de "tinta" la primera vez que dibujas (antes de pulsar cualquier botón).

No sé cómo lo has hecho, por lo que te comento cómo lo haría yo. Me crearía un método llamado, por ejemplo, "dibujar" y le pasaría el color de la tinta (u otros parámetros, como grosor, transparencia...):

Código ActionScript :

function dibujar(tinta:uint):void
{
   graphics.lineStyle (10, tinta, 1);
   //además de todo el código que emplees para dibujar aquello que quieras.
}


La primera vez llamaría a dibujar() con un valor por defecto (el color que quieras que tenga "lo dibujado" antes de que el usuario pulse:

dibujar(0xFFFFFF);

Y volvería a llamar a "dibujar" en el método controlador del evento Event.CLICK que veíamos antes, pasándole el color almacenado en el Dictionary.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Sep 2010 06:46 pm
Gracias de nuevo.

Con esa función iría bien, salvo que tengo que modificar lo que ya tengo, pues después haré lo mismo para cambiar el tamaño del trazo o la transparencia.

Esto es lo que tengo ahora mismo:

Referente a la obtención de colores mediante botones

var misColores:Dictionary = new Dictionary();
misColores[amarillo] = "0xff0000";
misColores[azul_ultramar] = "0x0000ff";
function clickHandler(event:MouseEvent):void
{
var tinta:uint = misColores[event.target];
}

Tal y como me guiaste, con lo que obtengo el valor de "tinta", que el la variable a usar.

Por otro lado, donde se está usando la variable "tinta":

function _onMouseDown (e:MouseEvent):void {
debug ("_onMouseDown");
draw_shape.graphics.lineStyle (10, tinta, 1);
}

Al crear el método que me comentabas (dibujar), debería meterlo dentro de este código de acción del ratón.

En principio sí recibe el valor, pues tras el código que me has proporcionado he añadido para probarlo:

var tinta:uint = misColores[azul_ultramar];

y funciona. Si lo coloco antes no, pues aún no ha definido "misColores" y no sabe interpretarlo.

Puesto que en el resto de código entiende este color de la variable tinta, el tema está en que el valor de tinta de esta linea sea variable, sea el que seleccionemos según pulsemos un botón u otro, y por defecto sea una de esas variables [amarillo] o [azul_ultramar]


Gracias de nuevo por tu tiempo, y lamento mi bajo nivel.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 19 Sep 2010 07:29 pm
BuenAS:

No sé cómo, pero escribí los valores de colores entre comillas y por tanto los interpreta como texto (String) en lugar de entero. En todo el código que tengas da los valores SIN comillas; o sea:

misColores[amarillo] = 0xff0000;

y creo que no vas a tener mayor problema.

Y con respecto a la función, como no sabía cómo la estabas llamando, la nombré como clickHandler, pero con la tuya:

Código ActionScript :

function _onMouseDown (e:MouseEvent):void {
   var tinta:uint = misColores[e.target]; 
   debug ("_onMouseDown");
   draw_shape.graphics.lineStyle (10, tinta, 1);
}


Y acuerdate de quitar las comillas a los colores, deben de ser enteros en hexadecimal (0xff0000, 0x00ff00, etc)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Sep 2010 07:32 pm
...creo que me imagino lo que está pasando, para acelerar la escritura hago copy&paste del código que posteas y no lo reviso muy a fondo. Por ejemplo, en el último post he pegado:

misColores[amarillo] = 0xff0000;

y, lógicamente, ese color es rojo, y no amarillo ;)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Sep 2010 07:36 pm
Ja ja ja... gracias.. lo imaginaba.

Lo del color, es que estoy probando la función, y no he medido aún los valores (lo dejo para el final).

En un rato probaré a ver qué tal.


Mil gracias ;-)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 19 Sep 2010 11:09 pm
Ufff... nada.

El depurador no da ningún fallo, pero no toma el color variable. Pinta en negro (que no lo tengo definido) y no hace caso de los botones.

De nuevo, utilizando una variable tinta con un color como valor, la función de dibujar sí toma ese color.

¿No hay manera de definir al principio esa variable, asignándole un valor, y que pulsando un botón se modifique ese valor? Es que no sé si entra en conflicto el _onMouseDown de la función que dibuja, al insertar la función para que rescate el color del Dictionary. Le he puesto un Trace a uno de los botones de cambio de color, y no lo muestra el depurador.

Me refiero a sacar la función del botón fuera, y que escriba el valor en la variable tinta de alguna forma...

Creo que sólo esta será la forma.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 20 Sep 2010 05:15 am
BuenAS:

Echa un vistazo a esto:

Descargar fla

Ver ejemplo swf

He colocado 6 botones, uno con cada color, y al principio llamo a la función dibuja(0x00000) con el color inicial negro.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Sep 2010 12:00 pm
Gracias,

Ya lo he revisado. He comprendido muy bien tu código. Lo único es que me asalta una duda entonces...

En tu archivo funciona perfectamente, y la selección de colores va perfecta; tú tienes una función (dibuja) que hace una serie de acciones... en mi caso tengo una función personalizada:


function _onMouseDown(e:MouseEvent):void
{
debug("_onMouseDown");
draw_shape.graphics.lineStyle(10, tinta, 1);
erase_shape.graphics.lineStyle(20, 0xffffff, 1);
draw_shape.graphics.moveTo(e.localX,e.localY);
erase_shape.graphics.moveTo(e.localX,e.localY);
md = true;
}

¿Puedo integrar aquí tu función "dibuja"? Ya que son funciones diferentes, ¿podría dejar la función fuera de este código para que no interfiera? Entiendo que dentro de la función pueden ir acciones y variables.

He probado a cambiar el nombre d ela función dibuja por el mío pero entra en conflicto; debo suponer que es por donde se define la acción de mi función, que es esta:

event_spr.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
event_spr.addEventListener(MouseEvent.MOUSE_MOVE, _onMouseMove);
event_spr.addEventListener(MouseEvent.MOUSE_UP, _onMouseUp);
event_spr.addEventListener(MouseEvent.MOUSE_OUT, _onMouseUp);

;-)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 20 Sep 2010 12:34 pm
BuenAS:

Creo intuir lo que pretendes. Estás haciendo un pincel para pintar sobre un lienzo, ¿no? En el detector del evento MOUSE_DOWN (la función anterior) debes recuperar el color y guardarlo en la propiedad tinta, por si quieres utilizarlo más tarde en el detector del evento MOVE (donde imagino es donde tienes el lineTo():

Código ActionScript :

var tinta:uint;
function _onMouseDown(e:MouseEvent):void
{
   tinta = misColores[e.target];
   debug("_onMouseDown");
   draw_shape.graphics.lineStyle(10, tinta, 1);
   erase_shape.graphics.lineStyle(20, 0xffffff, 1);
   draw_shape.graphics.moveTo(e.localX,e.localY);
   erase_shape.graphics.moveTo(e.localX,e.localY);
   md = true;
}


En este caso, la función dibujar() no es necesaria, porque "creo" tu dibujas la línea en el detector del evento MOVE.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Sep 2010 01:11 pm
Sí, efectivamente es un programa de pintura (pintas mientras mueves el ratón teniendo pulsado el botón).

No sé si me dejo algo, pues el depurador no me da ningún fallo, pero sigue sin cambiar los colores.

Puedes ver el .fla aquí:

http://www.megaupload.com/?d=XIUD8PDU

Hay algo que me he dejado de lado (y eso que lo he revisado), o algo entrando en algún tipo de conflicto...

Gracias de nuevo.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 20 Sep 2010 01:34 pm
BuenAS:

Sin que sirva de precedente (no me gusta mucho hacer estas cosas), lo he modificado ;)

pintura_cs5.rar

Lo estabas exportando para iPhone y lo he cambiado para un perfil Flash Player 10.

Por otro lado, si estás haciendo una aplicación para iPhone sería conveniente que el stage tuviera exactamente el tamaño de la pantalla de un iPhone (320x480 en disposicion vertical).

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Sep 2010 02:02 pm
Mil gracias,

Voy a imprimir el código para repasar los cambios, a ver si termino de aclararme (aunque ahora funciona).

No es una aplicación iPhone... estuve probando una tontería para ver el tema de iPhone y de ahí cambié el tamaño del escenario y salvé cuando me puse a hacer esto (a raíz de un tutorial que había visto).

Ojalá pudiera/supiera hacer aplicaciones para iPhone.

Lukánicos, muchas gracias y como te dije (y va totalmente en serio) si necesitas algo de diseño gráfico o fotografía cuenta conmigo. Te debo una.

;-)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari
Citar            
MensajeEscrito el 20 Sep 2010 02:21 pm
...me acabo de acordar. Si estás con temas de pinceles quizá te interese echarle un vistazo a esto:

Oil painting

Custom brushes with actionscript

Este último es genial para personalizar el trazado del pincel.

En ambos casos te puedes descargar el código.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Sep 2010 03:42 pm
Pues se agradece!!

No sé si será demasiado de momento, pero voy a echarle un vistazo. Mediante la anterior fórmula (para predefinir un color) ya le he puesto un selector de grosor de trazo.

De momento a las mil maravillas. Gracias de nuevo por tu tiempo ;-)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

safari

 

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