| MetaCard y Revolution: Herramientas de autor multiplataforma para multimedia | ||
|---|---|---|
| Anterior | Capítulo 6. Interfaz: controles complejos y procesos externos | Siguiente |
Antes de adentrarnos en cuestiones más puntuales, en este apartado aboradaré una opción que debería tenerse en cuenta a la hora de generar determinadas configuraciones de objetos en una aplicación para permitir un desarrollo abierto.
Sea, por ejemplo, el caso de crear un tablero en el que disponer una actividad o un juego basados en casillas. Si se quiere disponer de un número elevado de objetos o que en tiempo de ejecución se determine la cantidad de estos, será necesario dejar que el código se ocupe de esta situación.
Sea, pues, el caso de un tablero (la Figura 6-2 muestra un base de experimentación de este supuesto) sobre el que se dispondrán una serie de elementos y sobre los que el usuario deberá actuar.
En este ejemplo, a la derecha, se ha dispuesto un grupo de objetos que permiten la construcción de este tablero basado en botones. Este grupo puede quedar oculto en una determinada aplicación, pero la funcionalidad del ejemplo sigue siendo la misma.
Con este ejemplo, se puede crear de forma dinámica una serie de botones. El número y tamaño de los mismos se indica en los controles situados en el mencionado grupo.
La mayor parte de la funcionalidad de este ejemplo reside en el botón que, a partir de los valores de los restantes elementos inicializa y dipone los botones en la ventana (la pila, en terminología de MetaCard) cuando el usuario lo activa. Su código es el siguiente:
button "Fer-lo"
on mouseUp
repeat with i = the number of buttons down to 1
if the short name of button i contains "boto" then delete button i
end repeat
repeat with i = 0 to ((field "nFiles" * field "nCols") - 1)
lock messages
create invisible button ("boto" & i)
unlock messages
set the height of button ("boto" & i) to field "altCuadre"
set the width of button ("boto" & i) to field "ampleCuadre"
show button ("boto" & i)
move button ("boto" & i) \
to ( ((field "ampleCuadre") * (i mod field "NCols")) + round(field "ampleCuadre" / 2) ), \
( (field "altCuadre" * trunc(i / field "NCols")) + round(field "altCuadre" / 2) ) \
in 0.5 seconds
end repeat
end mouseUp
Sugerencia: Se podría haber hecho de forma estática con
set the location of button ... to ...y lo dejo propuesto para que participe y repase lo que se ha tratado al respecto de esta orden con anterioridad. Aunque, espero que estará conmigo en que el resultado final es más divertido con la orden move.
Para facilitar la oportunidad visual que ofrece este interfaz, los campos de texto que configuran el tamaño de los botones creados modifican el del botón que desencadena toda la acción con el código siguiente, que se ejecutan cuando se teclea un valor numérico en los campos asociados:
#field "ampleCuadre"
on keyUp tecla
set the width of button "Fer-lo" to the text of me
end keyUp
#field "altCuadre"
on keyUp tecla
set the height of button "Fer-lo" to the text of me
set the top of button "Fer-lo" to (the bottom of me + 10)
end keyUp
| Aviso |
En concret gràfics, en les equacions de curves i demés que preparares per a la figura de la portà. #
# btn "ferLaEspiral"
#
on mouseUp
put empty into varAux
put round(the first item of the loc of this card) into despAlCentroX
put round(the second item of the loc of this card) into despAlCentroY
-- Ecuacio d'una espiral? No la se, pero es com un circul que es va obrint poc a poc
-- Si no mes que vols que pegue una volta ...
put round (360 / the number of lines of fld "nomsDeImages") into grausPerPunt
put round (despAlCentroY * 2 / the number of lines of fld "nomsDeImages") into incrRadioX
-- I ara mira de calcular els punts
repeat with i = 0 to (the number of lines of fld "nomsDeImages" - 1)
-- put (i * incrRadio) into radio
put (round( sin( pi / 180 * (i * grausPerPunt) ) * (i * incrRadioX ) ) + despAlCentroX) &\
"," &\
(round( cos( pi / 180 * (i * grausPerPunt) ) * (i * incrRadioX / 2) ) + despAlCentroY) &\
return after varAux
set the points of graphic "espiral" to varAux
end repeat
end mouseUp
#
# btn "ficarLesImages"
#
on mouseUp
put the points of graphic "espiral" into puntsEspiral
repeat with i = the number of lines of fld "nomsDeImages" down to 1
if not( the first char of (line i of fld "nomsDeImages") is "-" )
then
lock messages
create image ("miniatura" & i)
set the loc of image ("miniatura" & i) to line i of puntsEspiral
set the filename of image ("miniatura" & i) to \
(fld rutaImagens & line i of fld "nomsDeImages")
put the height of image ("miniatura" & i) & "x" & the width of image ("miniatura" & i)
set the width of image ("miniatura" & i) to\
( the width of image ("miniatura" & i) / \
(the height of image ("miniatura" & i) / 150))
set the height of image ("miniatura" & i) to 150
unlock messages
end if
end repeat
end mouseUp
|