APACHE Arquitectura Apache se estructura como un conjunto de módulos. Unos forman el núcleo de la aplicación, mientras que otros son opcionales y se instalan o no en función de las necesidades del servicio que se quiera prestar: Módulos adicionales APACHE Núcleo y módulos básicos Instalación La instalación del servidor Apache es muy simple, debiendo tener en cuenta solo que el puerto donde lo configuremos debe estar libre (si ya tenemos instalado otro servidor como el IIS, se puede instalar Apache en el puerto 8080). Hay varias versiones disponibles, incluyendo una compilación que permite dar servicios de protocolo https. Si no es necesario se recomienda la instalación sin esa funcionalidad. Una vez instalado Apache, se crea un árbol de directorios típico, con las siguientes carpetas: /Bin – Archivos ejecutables y librerías del programa. /Conf – Ficheros de configuración (httpd.conf) /Error – Mensajes de error en varios idiomas. /Logs – Ficheros de registro de acceso y errores al servidor. /Htdocs – Carpeta donde por defecto se almacenan los documentos web que se publican en el servidor. Configuración básica La configuración de Apache se hace a partir del fichero http.conf. Hay tres aspectos básicos que controla este fichero: Configuración de parámetros globales del servidor Se aplican sobre el comportamiento del servidor en conjunto. Entre los más importantes se encuentran: ServerRoot: Directorio raíz donde está instalado Apache. Listen: Puerto o puertos asignados al servidor. LoadModule: Carga de módulos adicionales al núcleo del programa. ServerAdmin: Dirección de correo del administrador que se muestra en algunos mensajes de error. ServerName: Nombre DNS o dirección IP del servidor que se envía como información adicional en las peticiones HTTP. DocumentRoot: Carpeta que se asocia con la raíz de servidor. Usualmente la carpeta htdocs del directorio de instalación del programa. DirectoryIndex: Fichero que se sirve por defecto en una petición en la que no se especifica nombre de fichero alguno (usualmente como entrada de http://localhost) ErrorDocument: Permite modificar el mensaje de error que envía el servidor por defecto, asociando incluso un documento web. Alias: Permite la definición de directorios virtuales, mediante los cuales enlazamos a carpetas fuera de la carpeta de instalación del programa, con el formato Alias nombre_ficticio ubicacion_real. Parámetros sobre directorios y ficheros. Con las directivas <Directory>..</Directory> y <File>… </File>, se aplican al directorio o fichero que se especifique. La configuración de algunos parámetros de este tipo puede hacerse mediante ficheros .htaccess en los directorios correspondientes. Configuración de hosts virtuales. Sirve para crear varios sitios webs alojados en un único servidor. Cada uno puede tener diferentes direcciones IP o nombres DNS. PHP Introducción Para instalar PHP descomprimiremos el fichero .ZIP en el directorio C.\PHP. PHP es un lenguaje interpretado que se utiliza ampliamente junto con Apache para la generación de contenidos dinámicos para la web. Los archivos con la extensión PHP pueden ejecutarse también desde línea de comandos. Para ello, se utiliza el ejecutable php que se encuentra en el directorio raíz de PHP. Para ello, tecleamos por ejemplo, C:\php>php.exe c:\prueba.php. Dentro de los archivos PHP, el código que deseamos que sea interpretado debe ir entre las etiquetas <?php ……. ?>. Existe la posibilidad de crear aplicaciones ejecutables usando el lenguaje PHP mediante la extensión PHP-GTK. Instalación y uso con un servidor web Es un lenguaje de servidor, frente a Javascript, que se ejecuta en el navegador del cliente. La configuración puede hacerse según CGI (Common Gateway Interface), en la que los ficheros php se interpretan mediante un ejecutable cuya salida stdout es recogida por el servidor y enviada al cliente web. La otra opción es cargar en Apache un módulo que se encarga de interpretar el fichero y enviar la salida stdout del mismo al navegador. Características del lenguaje Variables y constantes Una característica llamativa de PHP es que las variables van precedidas por el símbolo $, y que además, no es obligatoria su declaración, dejando libre el tipo asignado a la misma. Los nombres de las variables son ‘Case Sensitive’. Las variables permiten el trabajo por referencia (similar al trabajo con punteros), anteponiendo el símbolo & al nombre de la variable (&$x sería una referencia). Existen un conjunto de variables predefinidas que permiten la comunicación de los scripts con el entorno. Entre ellas, que luego desarrollaremos con mayor detalle, están: $_SERVER — Información del entorno del servidor y de ejecución $_GET — Variables asociadas a peticiones GET de HTTP $_POST — Variables asociadas a peticiones POST de HTTP $_FILES — Variables de Carga de Archivos HTTP $_REQUEST — Variables HTTP Request $_SESSION — Variables de sesión $_ENV — Variables de entorno $_COOKIE — Cookies HTTP $argc — El número de argumentos pasados a un script $argv —Argumentos pasado al script (este y el anterior al modo C). Las constantes se definen con la directiva DEFINE (nombre, valor): define("FOO","something"); Tipos de datos Los tipos de datos primarios más importantes soportados por PHP son los siguientes: boolean - (true o false) integer – Números especificados en base 10, octal (0344) o hexadecimal (0xFF) float – Número de coma flotante string – Las cadenas se delimitan por comillas dobles (“) que conllevan evaluación de variables, o las comillas simples (‘), que no lo hacen: $a=’palabra’; echo ´Ni una $a´; //Devuelve Ni una $a echo “Ni una $a”; //Devuelve Ni una palabra array – Los arrays en PHP no tienen solo como índices números enteros, también es posible utilizar cadenas. Los arrays son tratados mediante un conjunto de funciones Operadores Aritméticos OPERADOR DESCRIPCIÓN EJEMPLO Negativo -$a - + * / % Suma Resta Producto División Resto $a + $b $a - $b $a * $b $a / $b $a % $b Asignación La asignación se realiza con el igual: $a = 3; Operadores a nivel de bit OPERADOR & | ^ ~ << >> DESCRIPCIÓN EJEMPLO $a & $b AND $a | $b OR $a ^ $b XOR ~ $a NOT DESPL. IZQUIERDA $a << $b $a >> $b DESPL. DERECHA De comparación OPERADOR == === ¡= <> ¡== < > <= >= DESCRIPCIÓN EJEMPLO IGUAL $a == $b IDÉNTICO $a === $b DISTINTO $a != $b DISTINTO $a <> $b NO IDÉNTICO $a !== $b MENOR $a < $b MAYOR $a > $b MENOR O IGUAL $a <= $b MAYOR O IGUAL $a >= $b De incremento/decremento OPERADOR ++ DESCRIPCIÓN PREINCREMENTO EJEMPLO ++$a POSTINCREMENTO PREDECREMENTO POSTDECREMENTO ++ --- $a++ --$a $a-- Lógicos OPERADOR DESCRIPCIÓN EJEMPLO AND $a and $b AND OR $a or $b OR XOR $a xor $b XOR NOT ! $a NOT AND $a && $b && OR $a || $b || De cadena $a . $b Concatena dos cadenas Instrucciones de control IF if ($a > echo } elseif echo } else { echo } $b) { "a es mayor que b"; ($a == $b) { "a es igual que b"; "a es menor que b"; WHILE while ($i <= 10) { echo $i++; } DO..WHILE do { if ($i < 5) { break; } $i *= $factor; } while (0); FOR for ($i = 1; $i <= 10; $i++) { echo $i; } FOREACH foreach ($arr as &$value) { $value = $value * 2; } SWITCH..CASE switch ($i) { case 0: echo "i es igual a 0"; break; case 1: echo "i es igual a 1"; break; case 2: echo "i es igual a 2"; break; } Existe una forma alternativa de escribir las estructuras de control, pero nosotros seguiremos este formato ‘a lo C’. Definición de funciones y procedimientos Un aspecto a destacar de PHP es que no es necesario definir el tipo de los parámetros de entrada o salida de una función. Los procedimientos se definen como funciones sin tipo de retorno Las funciones se definen como: function foo($arg_1, $arg_2, /* ..., */ $arg_n) { echo "Función de ejemplo.\n"; return $valordevuelto; } Los parámetros de una función pueden tener un valor por defecto asignado de la siguiente forma: function hacercafé($tipo = "capuchino") La devolución de un resultado por parte de la función se hace mediante la función return (), como se muestra en los siguientes ejemplos: return $núm; //Devuelve un número return array (0, 1, 2); //Devuelve una matriz Aspectos interesantes de la programación en PHP Trabajo con formularios Cuando especificamos en un formulario HTML un fichero PHP como gestor en su propiedad ACTION, podremos acceder a la información de los controles de dicho formulario a través de la variable global $_POST o $_GET. Veamos un ejemplo: Dentro del código HTML: <FORM METHOD="post" ACTION="mis_datos.php"> <input type="hidden" name="edad" value="55"> <p>Tu nombre <input type="text" name="nombre" size="30" value="jose"></p> <p>Tu sistema favorito <select size="1" name="sistema"> <option selected value="Linux">Linux</option> <option value="Unix">Unix</option> <option value="Macintosh">Macintosh</option> <option value=&qmargin-left: 75"><option value="Windows">Windows</option> </select></p> <p>¿Te gusta el futbol ? <input type="checkbox" name="futbol" value="ON"></p> <p>¿Cual es tu sexo?</p> <blockquote> <p>Hombre<input type="radio" value="hombre" checked name="sexo"></p> <p>Mujer <input type="radio" name="sexo" value="mujer"></p> </blockquote> <p>Aficiones</p> <p><textarea rows="5" name="aficiones" cols="28"></textarea></p> <p><input type="submit" value="Enviar datos" name="enviar"> <input type="res-left: 50"> <input type="reset" value="Restablecer" name="B2"></p> </FORM> En el fichero PHP: <?PHP; if (isset($_POST['enviar']) { echo "Hola <b>" . $_POST['nombre'] . "</b> que tal estás<BR>n"; echo "Eres " . $_POST['sexo'] . "<BR>n"; echo "Tienes " . $_POST['edad'] . "<BR>n"; echo "Tu sistema favorito es " . $_POST['sistema'] . "<BR>n"; if (isset($_POST['futbol']) { echo "Te gusta el futbol <BR>n"; } else odigo" style="margin-left: 50">} else { echo "NO te gusta el futbol <BR>n"; } if ($_POST['aficiones'] != "") { echo "Tus aficiones son: <BR>n"; echo nl2br($_POST['aficiones']); } else { echo "NO tienes aficiones <BR>n"; } } echo "<a href='formulario.htm'>VOLVER AL FORMULARIO</a>" ?> Carga de ficheros La carga de ficheros puede verse como una extensión del trabajo con formularios. Para poder utilizarlo hemos de crear un control adicional en el formulario de origen: <form enctype="multipart/form-data" action="__URL__" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> Enviar este archivo: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> , donde hemos marcado en rojo las partes clave de este proceso. Desde el punto de vista del fichero PHP que gestiona el proceso de subida, la información relativa al control de tipo FILE se almacena en las variables: $_FILES['userfile']['name'] El nombre original del archivo en la máquina cliente. $_FILES['userfile']['type'] El tipo mime del archivo, si el navegador proporciona esta información. Un ejemplo podría ser "image/gif". Este tipo mime, sin embargo no se verifica en el lado de PHP y por lo tanto no se garantiza su valor. $_FILES['userfile']['size'] El tamaño, en bytes, del archivo subido. $_FILES['userfile']['tmp_name'] El nombre temporal del archivo en el cual se almacena el archivo cargado en el servidor. $_FILES['userfile']['error'] El código de error asociado a esta carga de archivo. Este elemento fue añadido en PHP 4.2.0 Un ejemplo de fichero de tratamiento sería: <?php // En versiones de PHP anteriores a 4.1.0, $HTTP_POST_FILES debe utili zarse en lugar de $_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "El archivo es válido y fue cargado exitosamente.\n"; } else { echo "¡Posible ataque de carga de archivos!\n"; } echo 'Aquí hay más información de depurado:'; print_r($_FILES); print "</pre>"; ?> Cookies Las cookies son pequeños ficheros de texto que se almacenan en el navegador del cliente, y que pueden ser leídos desde el servidor. Para ello, usamos la función: setcookie(nombre_cookie, valor, tiempo_expiracion, directorio_cookie) Para poder usar esta función hay que advertir al servidor de que debe enviar en la cabecera del fichero una información determinada. Para ello, debemos hacer la llamada a la función antes de enviar cualquier información de la página. El contenido de una cookie puede leerse usando el array $_COOKIE [ ]. A modo de ejemplo: <?php $value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */ setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.co m", 1); ?> <?php // Print an individual cookie echo $_COOKIE["TestCookie"]; ?> Sesiones Las sesiones son una forma de guardar información, de un modo más elaborado que en el caso de las cookies. Antes de leer o escribir una variable de sesión será necesario llamar a la función session_start(); El acceso a las variables de sesión es a través de la variables del sistema $_SESSION [‘nombre’]. Como ejemplo: <?php session_start(); // Use $HTTP_SESSION_VARS con PHP 4.0.6 o anterior if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } else { $_SESSION['count']++; } ?> Para eliminar una variable de sesión usamops la función: unset($_SESSION['count']); Existen un conjunto de funciones asociados a la gestión de sesiones, como son: session_destroy — Destruye toda la información registrada de una sesión session_id — Obtener y/o establecer el id de sesión actual session_is_registered — Averiguar si una variable global está registrada en una sesión session_name — Obtener y/o establecer el nombre de la sesión actual session_register — Registrar una o más variables globales con la sesión actual session_start — Inicializar información de sesión session_unregister — Deja de registrar una variable global de la sesión actual session_unset — Libera todas las variables de sesión MySQL Instalación y órdenes básicas La instalación de MySQL puede hacerse mediante un instalador MSI, o bien a partir de un fichero comprimido .ZIP. En plataformas Linux, es usual compilar el ejecutable en el propio equipo donde va a funcionar. Si optamos por la instalación manual, en Windows necesitaremos instalar la base de datos como un servicio. La instalación tipo crea el siguiente árbol de directorios: /bin – Ejecutables (incluye el servidor y los clients) /examples – Ficheros y scripts de ejemplo . /include – Ficheros de cabeceras. /lib – Librerías. /scripts – Scripts de utilidades. Además, dependiendo del sistema operativo en el que trabajemos, encontramos los directorios de log y las bases de datos: C:\Documents and Settings\All Users\Application Data\MySQL, o bien C:\ProgramData\MySQL Los programas disponibles en el directorio /bin son: Mysqld --> Es el servidor de la base de datos Mysql –-> Es el cliente de línea de comandos interactivo. mysqladmin --> Cliente para tareas administrativas. mysqlcheck --> Cliente para tareas de mantenimiento de tablas. mysqldump --> Para realizar volcados de la base de datos a ficheros. Mysqlimport --> Carga datos en las tablas a partir de ficheros de texto. Mysqlshow --> muestra información diversa sobre objetos de la base de datos. Configuración y administración del servidor A la hora de configurar el funcionamiento del servidor, podemos especificar los parámetros de funcionamiento mediante línea de comandos, o mediante un fichero de configuración. Usualmente, la línea de comandos no es más que el nombre de la variable de configuración que queremos usar precedida por dos guiones. Además algunos de los parámetros se consideran parámetros de estado del servidor. En el caso de utilizar un fichero de configuración, las opciones se incluyen en el mismo. Para saber que fichero de configuración está usando mysqld, hacemos: mysqld –h IP –u usuario –ppasswd variables Por defecto, los ficheros buscados son: WINDIR\my.ini, WINDIR\my.cnfGlobal optionsC:\my.ini, C:\my.cnf Global optionsINSTALLDIR\my.ini, INSTALLDIR\my.cnfGlobal optionsdefaults-extra-fileThe file specified with --defaults-extrafile=path, if any El contenido de uno de estos ficheros es un conjunto de variables de configuración agrupados en secciones. Por ejemplo: [client] port=3306 [mysql] default-character-set=latin1 [mysqld] # The TCP/IP Port the MySQL Server will listen on port=3306 #Path to installation directory. All paths are usually resolved relative to this. basedir="F:/Archivos de programa/MySQL/MySQL Server 5.5/" Para administrar la seguridad, hay que tener en cuenta que el modo de gestión de MySQL funciona en base al conjunto de opciones: usuario host permisos_sobre_BBDD. La gestión de usuarios y permisos se realiza mediante las órdenes CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD. La información sobre los permisos se almacena en las siguientes tablas de la base de datos: user: Contains user accounts, global privileges, and other non-privilege columns. db: Contains database-level privileges. host: Obsolete. tables_priv: Contains table-level privileges. columns_priv: Contains column-level privileges. procs_priv: Contains stored procedure and function privileges. Características de la base de datos (tipos de datos y funciones) Los tipos de datos permitidas para MySQL son: Strings – Delimitados por comillas dobles o simples. Numbers Date and Time Values -DATE, TIME, DATETIME, and TIMESTAMP Hexadecimal Values (con X’…’, x’…’ o 0x….) y la función HEX() Boolean Values NULL Values Las funciones disponibles son las usuales en cualquier entorno SQL. Un listado de ejemplo sería: ABS(), ACOS(), ADDDATE(), ADDTIME(), ASCII(), ASIN(), ATAN2(), ATAN(), AVG(), , CEIL(), CHAR(), CONCAT_WS(), CONCAT(), COS(), COT(), COUNT(), CURDATE(), CURRENT_DATE(), DATE_ADD(), CURRENT_TIME(), DATE_FORMAT(), DATE(), CURRENT_USER(), DATEDIFF(), DAY(), DATABASE(), DAYNAME(), DAYOFMONTH(), DAYOFWEEK(), DAYOFYEAR(), DIV, EXP(), FLOOR(), FORMAT(), GREATEST(), HEX(), HOUR(), IFNULL(), IN(), INSTR(), LAST_DAY, LEAST(), LENGTH() LOG10(), LOWER(), LPAD(),LTRIM(), MAX(), MINUTE(), POW(), REPLACE(), RIGHT(), ROUND(), RPAD(), RTRIM(), SQRT(), STR_TO_DATE(), SUBSTR(), SUM(), SYSDATE(), TIME_FORMAT(), TIME(), TIMESTAMP(), TRIM(), TRUNCATE(). Procedimientos almacenados MySQL permite el trabajo con procedimientos almacenados, mediante las ordenes CREATE PROCEDURE y CREATE FUNCTION: CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END; De la misma forma, se permite la programación de disparadores, con la orden CREATE TRIGGER: CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; ´Trabajo con la BBDD Para conectar con la base de datos, utilizamos el programa mysql, cuyos principales parámetros son: -h ---> Host del servidor -u --> Nombre de usuario -p --> Password del usuario (se escribe sin espacio –pmi_contrasenya) Al conectar se abre una sesión que notamos por el prompt (mysql>). Para desconectar de la base de datos, utilizamos la orden quit dentro del Dentro del prompt, las sentencias SQL deben finalizarse con punto y coma (;). Las órdenes más usuales son las siguientes: SHOW DATABASES; --> Lista las bases de datos disponibles. USE basededatos; --> Selecciona la base de datos test CREATE DATABASE basededatos; --> Crea una base de datos SHOW TABLES; --> Muestra las tablas de la base de datos activa DESCRIBE nombredetabla; --> Muestra los campos de una tabla (DESC en Oracle) El uso de las bases de datos puede hacerse también en modo batch. De esta forma lo que hacemos es enviar un fichero al servidor para que se ejecuten sus ordenes. La sentencia a utilizar es: mysql < batch-file Se puede capturar a la vez la salida de este proceso: mysql < batch-file > mysql.out Introducción MySQL Workbench MySQL Workbench es una herramienta gráfica de gestión de la base de datos, que contiene tres funciones básicas: Desarrollo SQL – Es un editor SQL para MySQL. Se puede acceder a los registros y modificarlos. Modelado de datos – Permite ingeniería directa e inversa. Sirve para diseñar tablas, campos, índices, etc. Administración – Administra instancias de las bases de datos. Configuración con PHP Si vamos a compilar nuestro propio PHP, podemos incluirle la extensión de MySQL. Si trabajamos en un entorno Windows, esto no será así, de forma que lo que haremos será incluir la referencia a la extensión (¡ojo!, en PHP 4 MySQL está incluido en PHP). Para incluir la extensión, hemos de añadir la referencia a php_mysql.dll en el fichero php.ini (activando la directiva extension=php_mysql.dll). Además, necesitamos tener acceso a libmysql.dll, por lo que deberemos incluir la ruta a este fichero en el PATH de Windows. Para comprobar que una extensión está cargada, usaremos la función phpinfo(); Información detallada puede encontrarse en el fichero install.txt. Funciones PHP de trabajo con BBDD MySQL Si usamos la extensión PHP MySQL, entre el conjunto de funciones disponibles destacan: mysql_affected_rows — Obtiene el número de filas afectadas en la anterior operación de MySQL mysql_close — Cierra la conexión de MySQL mysql_connect — Abre una conexión al servidor MySQL mysql_create_db — Crea una base de datos MySQL mysql_db_query — Envía una consulta MySQL mysql_drop_db — Omite (elimina) una base de datos MySQL mysql_errno — Devuelve un mensaje de error con un valor numérico de la operación anterior con MySQL mysql_error — Devuelve el texto con error del mensaje de la anterior operación MySQL mysql_fetch_array — Recupera una fila de resultado como un array asociativo, un array numérico o como ambos mysql_fetch_assoc — Recupera una fila de resultado como un array asociativo mysql_fetch_row — Recupera una fila de resultado como un array numérico mysql_free_result — Libera la memoria del resultado mysql_list_dbs — Lista de las bases de datos disponibles en un servidor MySQL mysql_list_fields — Lista los campos del resultado de MySQL mysql_list_tables — Lista las tablas de una base de datos MySQL mysql_num_fields — Obtiene el número de campos en un resultado mysql_num_rows — Obtener el número de filas de un resultset mysql_ping — Efectuar un chequeo de respuesta (ping) sobre una conexión de servidor o reconectarse si no hay conexión mysql_query — Enviar una consulta MySQL mysql_result — Obtener datos de resultado mysql_select_db — Seleccionar una base de datos MySQL Aquí está un ejemplo básico de uso de MySQL con PHP: <?php // Conectando, seleccionando la base de datos $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or die('No se pudo conectar: ' . mysql_error()); echo 'Connected successfully'; mysql_select_db('my_database') or die('No se pudo seleccionar la base de datos'); // Realizar una consulta MySQL $query = 'SELECT * FROM my_table'; $result = mysql_query($query) or die('Consulta fallida: ' . mysql_erro r()); // Imprimir los resultados en HTML echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo "\t\t<td>$col_value</td>\n"; } echo "\t</tr>\n"; } echo "</table>\n"; // Liberar resultados mysql_free_result($result); // Cerrar la conexión mysql_close($link); ?> FLASH Entorno de edición El entorno de edición consiste en una ventana principal en la que se pueden distinguir diferentes secciones: 4 5 3 2 1 , siendo: La sección 1 corresponde a la parte de edición de las propiedades de los objetos seleccionados. La sección 2 es la ventana de acciones. En ella se programará el código en ActionScript asociado a la película o a los objetos instanciados en la misma. La sección 3 es la ventana de edición de la película. En ella se insertan los objetos que formarán parte de ella. La visión en esta ventana corresponde a un fotograma concreto. La sección 4 es la línea de tiempo de la película. La línea de tiempo consiste en un conjunto de capas que contienen los fotogramas. La sección 5 corresponde a la barra de herramientas, en las que disponemos de las herramientas típicas de los programas de edición de imágenes. Edición básica Flash presenta al arrancar, el escenario que es el lugar donde se llevará a cabo la animación. El escenario sitúa el origen de coordenadas en la esquina superior izquierda. El tamaño total del escenario es una propiedad del documento, que puede cambiarse en Modificar->Documento. Un clip de película se organiza en escenas, cada una de las cuales tiene una línea de tiempo propia. Para moverse entre escenas, se usa el control que hay en la parte superior del editor: El escenario de Flash se organiza en capas, como en otros programas de edición gráfica. Cada capa está formada por un conjunto de fotogramas que se extiende a lo largo de la línea de tiempo de la película. La velocidad de reproducción de una película depende del número de frames (o fotogramas) por segundo, pudiendo cambiarse este atributo. Existe la posibilidad de usar una capa como capa de máscara. El fundamento de una capa de este tipo es que la forma o formas que estén dibujadas actuarán como si estuvieran recortadas, permitiendo ver la capa que está detrás. Cuando creamos una capa de máscara, las capas que estan por debajo se incluyen como capas enmascaradas: Flash como programa de animación Como hemos dicho, flash es un programa que permite crear animaciones. Hay dos enfoques básicos a la hora de realizar una animación: Animación fotograma a fotograma – Es el enfoque que se utiliza en las películas de dibujos animados antiguas. En ella, un conjunto de fotogramas se van alternando para generar la animación. En esta opción se incluye el trabajo con sprites. Animaciones interpoladas – Es una forma más moderna y cómoda de trabajar. Consiste en definir un estado inicial y otro final, en el que especificamos los objetos y sus estados (fotogramas clave). En los fotogramas intermedios las características se interpolan mediante una función matemática que proporciona la animación. Pueden modificarse también características como el color o la transparencia de una figura. Las interpolaciones de forma se clasifican en dos bloques: interpolaciones de movimiento e interpolaciones de forma. Interpolaciones de movimiento Las interpolaciones de movimiento modifican la posición, escala y ángulo de giro de los objetos. Las interpolaciones de movimiento se hacen con una animación a velocidad constante. Para modificar esto, existe la opción aceleración en el menú de propiedades: La interpolación se acelerará para valores entre -1 y -100 y se ralentizará con valores entre 1 y 100. Las interpolaciones de movimiento pueden restringirse a una trayectoria determinada, usando un trazado (o capa guía). Un trazado no es más que una capa en la que hay una curva dibujada. La capa que actúa como guía debe tener la capa que contiene la animación como capa dependiente: La interpolación se consigue fijando el punto de referencia del objeto sobre la curva: Podemos comprobar el efecto de una interpolación visionando varios fotogramas a la vez, lo que se consigue mediante el papel cebolla (hay diferentes tipos, de contorno, la figura entera, etc.…): Hay otro tipo de transformaciones que también consideraremos en esta categoría, como son las modificaciones de color, transparencia, etc. Interpolaciones de forma En este tipo de interpolación, lo que cambia es la forma misma de los objetos. Durante la interpolación, se intenta que la deformación sea continua. No obstante, puede ocurrir que queramos que la deformación se lleve a cabo de una forma determinada. Para ello utilizaremos los consejos de forma. Los consejos de forma son referencias a puntos concretos que aparecen en la forma inicial y final, y que colocaremos sobre el objeto que queremos deformar. Para reproducir una película entramos en Control --> Reproducir, o también podemos probarla haciendo Ctrl.+Enter. Objetos, instancias, botones y otros Los objetos creados y editados en Flash pueden convertirse en símbolos (clases) que pueden ser usadas varias veces como instancias. Las instancias pueden ser modificadas como objetos independientes. Una vez creados así, los símbolos están disponibles en la biblioteca. Las bibliotecas pueden ser compartidas Las instancias solo pueden situarse en fotogramas clave Hay tres tipos de símbolos que pueden definirse: gráficos, botones y clips de película. Gráficos – Se utilizan para imágenes estáticas y animaciones ligadas a la línea principal. Botones – Son símbolos gráficos que incorporan interactividad. Los botones tienen asociados cuatro estados (en realidad cuatro fotogramas), que serán editados para modificar el aspecto del botón en los estados sobre el botón, botón presionado y la definición de la zona activa del botón (zona que reacciona a las actuaciones del usuario). Clips de películas – Los clips de películas con objetos que contienen su propia línea de tiempo con varios fotogramas. La ventaja es que no ocupan varios fotogramas en la línea de tiempo del archivo principal. Los clips de película se editan como una película normal, y se ve que estamos editándola en la línea de tiempo: Una vez creados los símbolos, se pueden crear instancias de los mismos y que pueden nombrarse desde la ventana propiedades: Animaciones múltiples Existe la posibilidad de convertir una animación en un clip de película, de forma que pueda ser utilizado como un elemento en otra escena (por ejemplo para dibujar las ruedas de un coche). ActiveScript: Lenguaje de Flash ActiveScript es un lenguaje muy parecido a JavaScript que podemos utilizar para programar interactividad en las animaciones. El código puede estar ligado a un símbolo o a fotogramas del escenario, siendo ejecutado cuando corresponda en cada caso (al cargar un fotograma o al recibir un objeto un evento de algún tipo). Las acciones (código) se edita en la ventana Acciones: Algunas funciones básicas para utilizar son: Trace(mensaje) – Muestra un mensaje con fines de depuración en una ventana de salida. Existe una opción de depuración, a la que podemos acceder mediante Control-> Depurar Película. Características del lenguaje Tipos de datos String - Delimitados por comillas simples o dobles. Las cadenas se concatenan con el operador +. Number Boolean Object MovieClip Null Undefined EL tipo de datos de una variable puede determinarse con la función typeof(variableName)); Variables Las variables se pueden declarar de forma estricta usando la directiva var. var x:Number = 7; Instrucciones de control IF if (this._x>rightBound) { X=1; } else if (this._x<leftBound) { X=2; } else if (this._y>bottomBound) { X=3; } else { X=4; } SIWTCH switch (number) { case 1: trace ("case 1 break; case 2: trace ("case 2 break; case 3: trace ("case 3 break; default: trace ("ningún } es verdadero"); es verdadero"); es verdadero"); case es verdadero") FOR for(i=0; i<10; i++) { my_array [i] = (i + 5)*10; trace(my_array[i]); } WHILE while (var i > 0) { my_mc.duplicateMovieClip("newMC" + i, i ); i--; } DO..WHILE do { statement(s) } while (condition) Operadores Numéricos Operador Operación realizada + Suma * Multiplicación / División % Módulo (resto de la división) - Resta ++ Incremento -- Decremento De comparación En la tabla siguiente se enumeran los operadores de comparación de ActionScript: Operador Operación realizada < Menor que > Mayor que <= Menor o igual que >= Mayor o igual que Lógicos En la tabla siguiente se enumeran los operadores lógicos de ActionScript: Operador Operación realizada && AND lógico || OR lógico ! NOT lógico Sobre bits Operador Operación realizada & AND en modo bit | OR en modo bit ^ XOR en modo bit ~ NOT en modo bit << Desplazamiento a la izquierda >> Desplazamiento a la derecha >>> Desplazamiento a la derecha con relleno con ceros De igualdad Operador Operación realizada == Igualdad === Igualdad estricta != Desigualdad !== Desigualdad estricta De asignación Operador Operación realizada = Asignación += Suma y asignación -= Resta y asignación *= Multiplicación y asignación %= Módulo y asignación /= División y asignación <<= Desplazamiento a la izquierda en modo bit y asignación >>= Desplazamiento a la derecha en modo bit y asignación >>>= Desplazamiento a la derecha rellenando con ceros y asignación ^= XOR en modo bit y asignación |= OR en modo bit y asignación &= AND en modo bit y asignación Definición de funciones Las funciones se asocian a la línea de tiempo del clip que las define. Para definir una función global, se debe definir con la directiva _global, como en el ejemplo: _global.prueba = function (x) { return x; } Para definir una función de línea de tiempo, usamos la expresión usual: function areaOfCircle(radius) { return Math.PI * radius * radius; } Los valores se devuelven con la instrucción return. Existen funciones y procedimientos predefinidos, algunos de los más útiles son: clase Array – Permiten el trabajo con arrays de objetos. clase Button – Permite trabajar con botones en la animación. clase Color – Clase asociada a los colores y su gestión. Se utiliza para asignar propiedades de objetos. my_color = new Color(my_mc); my_color.setRGB(0xff9933); clase Date –Para trabajar con fechas. getProperty – Lee una propiedad de un objeto : my_mc_x = getProperty(_root.my_mc, _x); getTimer – Número de milisegundos desde el inicio de la reproducción. getURL – Carga una página web: gotoAndPlay(), gotoAndStop() –Envía el lector al fotograma que se getURL(incomingAd, "_blank"); especifique y comienza la reproducción o se pausa. clase Key – Es una interfaz para el control de los eventos de teclado. Ver más adelante. loadVariables, loadVariablesNum – Permite la carga de un conjunto de variables desde un fichero externo (usualmente un fichero de texto, o la salida de un script PHP). clase LoadVars – Una posibilidad alternativa al uso de las funciones anteriores. claseMath – Contiene la definición de funciones matemáticas. clase Mouse – Se utiliza para acceder a las propiedades del puntero del ratón, y para capturar eventos del mismo. clase MovieClip – Para trabajar con clips de película. Contiene métodos para la creación dinámica de objetos como líneas y otros. on()- Controlador de eventos. Admite los siguientes: press, release, releaseOutside, rollOut, rollover, keyPress ("key"). play() – Activa la cabeza lectora sobre la línea de tiempo. setInterval – Crea una alarma para llamar regularmente a una función. setProperty – Da valor a una propiedad de un objeto. clase String – Para trabajar con cadenas. clase System.capabilities – Contiene funciones para determinar las características del sistema. clase TextFormat – Clase de formatos de texto, que usaremos para asignar al texto de un control, por ejemplo: my_fmt = new TextFormat(); my_fmt.bold = true; my_txt.setTextFormat(my_fmt); clase XML – Se utiliza para trabajar con archivos XML. Interacción con el usuario Para controlar las entradas de usuario, tenemos que atender las entradas del ratón y las entradas por teclado Control de entradas de ratón Se realiza mediante el objeto Mouse. Básicamente, el proceso consiste en crear un Listener asociado a un objeto que recibe los eventos de ratón, El objeto debe tener métodos asociados a los eventos definidos sobre Mouse: onMouseDown, onMouseMove, onMouseUp y onMouseWheel. someListener = new Object(); someListener.onMouseDown = function () { ... }; Mouse.addListener(someListener); Control de eventos de teclado La pulsación de teclas puede controlarse a partir del objeto Key. El objeto Key contiene una serie de constantes como BACKSPACE, CONTROL, etc.. que representan teclas concretas. Por otro lado, existe una serie de funciones que permiten el control de los eventos de teclado. A continuación tenemos un ejemplo: function myOnPress() { trace( "hola" ); } myListener = new Object(); myListener.onKeyDown = function () { trace ("Ha presionado una tecla."); } myListener.onKeyUp = function () { trace ("Ha soltado una tecla."); } myListener.onPress = myOnPress; Key.addListener(myListener); Carga dinámica de datos Una forma sencilla de acceder a datos externos es mediante la clase XML, que nos permite comunicar la película con ficheros de tipo XML. Otra opciones utilizar la clase LoadVars, que permite la lectura de datos a partir de ficheros de texto externos a la aplicación Flash. Para poder acceder a los valores, estos deben estar guardados con el siguiente formato: &nombre_var1=valor_var1&nombre_var2=valor_var2….. Código de carga de las variables: var cargador_lv:LoadVars = new LoadVars(); cargador_lv.onLoad = function(exito) { if (exito) { nombre_txt.text = this.nombre; edad_txt.text = this.edad; } else { nombre_txt.text = "Error!! :("; } }; stop(); Código que desencadena la carga de los datos: on (release) { cargador_lv.load("variables.txt"); } La extensión de este método permite utilizar como orígenes de datos a ficheros PHP, desde los que podemos consultar a bases de datos para construir estos datos. Una vez que el documento se ha cargado correctamente, se puede acceder al nombre de las variables tratando la variable como una propiedad del objeto LoadVars definido. La carga de un documento puede hacerse también mandando parámetros (que serán recepcionados por el fichero PHP, mediante el método sendAndLoad(). Código de carga de las variables: var envio_lv:LoadVars = new LoadVars(); var recibir_lv:LoadVars = new LoadVars(); function enviarForm() { envio_lv.nombre = nombre_txt.text; envio_lv.email = email_txt.text; envio_lv.clave = clave_txt.text; envio_lv.sendAndLoad("form.php", recibir_lv, "POST"); } recibir_lv.onLoad = function(exito) { if (exito) { mensaje_txt.html = true; mensaje_txt.htmlText = this.mensaje; } else { mensaje_txt.htmlText = "<b>Error en el Script</b>"; } }; Código PHP: form.php <? $nombre=$_POST["nombre"]; $email=$_POST["email"]; $password=$_POST["password"]; echo "mensaje=Bienvenido " . nombre . "<br />Entra con tu clave '" . password . " :D"; echo "<br />Att: The Cristalab Team"; ?>