Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

Integrar JavaScript y XML: un ejemplo sencillo, pero potente

Vamos a mostrar, a través de un ejemplo, la sencilla manera en la que podemos integrar JavaScript y XML.


Supongamos que queremos incluir en nuestra web un apartado que contenga una lista de hipervínculos (o links). El problema es que esta lista va a variar continuamente y no queremos andar modificando el HTML cada vez.


La solución consiste en tener la lista de hipervínculos en un archivo XML externo y cargar la lista dinámicamente ayudados de JavaScript y su parser XML.


Nuestro archivo XML tiene el siguiente formato:


<?xml version="1.0" encoding="iso-8859-1"?>
<lista>
<link>
<titulo>Google</titulo>
<href>http://www.google.es</href>
</link>
<link>
<titulo>Metafísica de Costumbres</titulo>
<href>http://metafisicadecostumbres.blogspot.com</href>
</link>
<link>
<titulo>Metafísica Informática</titulo>
<href>http://metafisicainformatica.blogspot.com</href>
</link>
</lista>

Un detalle importante es la cabecera XML. Necesitamos especificar encoding="iso-8859-1" para evitar problemas con las tildes y las ñ. De no hacerlo, nos aparecerían símbolos raros en lugar de ñ y vocales acentuadas.


El código JavaScript que necesitamos para resolver nuestro problema es el siguiente:


<html>
<body>
<div id="links"></div>
<script type="text/javascript">
// En la variable div_links obtenemos el contenedor div con el id 'links'
var div_links = document.getElementById('links');

var xmlDoc = cargarXMLDoc('links.xml');
if (xmlDoc != null)
{

// Obtenemos la lista de links
var links_tag = xmlDoc.getElementsByTagName("lista")[0].getElementsByTagName("link");

for (var i = 0; i < links_tag.length; i++)
{
// Obtenemos el título del link
var titulo = links_tag[i].getElementsByTagName("titulo")[0].childNodes[0].nodeValue;

// Obtenemos el hipervínculo del link
var href = links_tag[i].getElementsByTagName("href")[0].childNodes[0].nodeValue;

// Modificamos el contenido html del contenedor div
div_links.innerHTML += "<p><a href=" + href + ">" + titulo + "</a></p>";
}
}

function cargarXMLDoc(archivoXML)
{
var xmlDoc;

if (window.XMLHttpRequest)
{
xmlDoc = new window.XMLHttpRequest();
xmlDoc.open("GET", archivoXML, false);
xmlDoc.send("");
return xmlDoc.responseXML;
}
// para IE 5 y IE 6
else if (ActiveXObject("Microsoft.XMLDOM"))
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load(archivoXML);
return xmlDoc;
}
alert("Error cargando el documento.");
return null;
}
</script>
</body>
</html>

Puedes encontrar información detallada sobre el parser XML (en inglés) aquí.


Tutorial ActionScript 3 - Juego Pong - Principiantes

ActionScript 3.0 - Guía para principiantes


Objetivo

Click en la ventana Flash para jugar. Controles: w, s, flecha arriba, flecha abajo.



¿De qué va la Guía?

Bienvenidos al primer curso de esta Metafísica Informática: ActionScript 3.0 - Guía para principiantes.


ActionScript 3.0 es un poderosísimo lenguaje de script integrado en Flash y que permite realizar todo tipo de virguerías, desde películas de animación hasta juegos realmente complejos.


¿Cuál es el objetivo?

El enfoque de la guía será doble:


  • Teórico: Aprender y entender los pormenores de ActionScript 3.0 y los conceptos básicos (y no tan básicos) de la Programación Orientadas a Objetos.

  • Práctico: Aplicar la teoría en un proyecto práctico: El desarrollo desde cero del clásico juego Pong. Un juego, en esencia, bastante simple (en su desarrollo y juego), pero al que iremos añadiendo difrentes items y funcionalidades para darle mayor gracia.


¿Qué necesito saber para seguirla?

No vendría mal algo de experiencia con la parte gráfica de Flash: trabajo con capas, formas, colores, dregadados... Aunque si no es el caso, no importa demasiado. Cuándo utilicemos Flash para desarrollar la parte visual de nuestro Pong, se procurará explicar detalladamente todos los pasos.


Respecto a conocimientos de programación, lo básico: Qué es una variable, un bucle, una condición...


No es necesario ningún conocimiento sobre Programación Orientada a Objetos.


Últimas indicaciones

No necesitas haber trabajado con la versión antigua de ActionScript, ActionScript 2. Aunque comparten puntos comunes, ActionScript 2 y ActionScript 3 son lenguajes que trabajan de manera distinta.


La guía se va a realizar sobre Flash CS4, aunque en principio puede seguirse con cualquier otra versión de Flash que admita ActionScript 3.


Algo importante que quiero recalcar es que esta guía está escrita de aprendiz a aprendiz. Mi trabajo con ActionScript 3 y Flash es relativamente reciente, y cualquier comentario o corrección será bien recibido.



Puedes comenzar la guía de ActionScript 3, o echar un vistazo al índice que viene a continuación.
Índice




  1. Primeros pasos

    1. Lo primero, organización

    2. Introducción. FlashDevelop: organizando nuestros archivos .as. Jerarquía de carpetas

    3. La clase del Documento

    4. ¿Qué es la clase del Documento? Creando la clase del documento. Comentarios en AS3. Conectando nuestro Flash con Main.as.


  2. ActionScript y la Programación Orientada a Objetos.

    1. Concepto de clase. Clases en ActionScript 3

    2. Un mundo lleno de objetos... Concepto de Clase. ¿Qué es un atributo? ¿Qué es un método? ¿Cuál es la diferencia entre Clase y Objeto? Clases en ActionScript 3. Definición de paquetes. Definición de clases. Añadiendo atributos y métodos a nuestra clase Pong. Definición de variables. Visibilidad de atributos y funciones. Definición de atributos. Definición de funciones. El constructor de la clase. Creando un objeto de la clase Pong.

    3. Herencia en ActionScript 3

    4. Diseño gráfico de nuestro pong. Enlazando la clase Pong con su representación gráfica. Añadiendo el pong a la escena. ¿Cuál es la idea básica tras la herencia?


  3. Finalizando nuestro Pong básico

    1. Controlando el pong desde teclado

    2. Colocando los pongs. ¿Cómo accedo a los métodos y atributos de un objeto? Controlando desde el teclado nuestros pongs. ¿Qué es un evento?

    3. Movimiento avanzado

    4. Control de velocidad realista. Acotando los límites del movimiento.

    5. Detección de colisiones

    6. La clase Bola. Detección de colisiones. ¿Cómo detecto colisiones en ActionScript?. Toques finales.


  4. Conclusión y archivos fuente Pong 1.0



FASE II: Pong 1.1 - Pong con escenarios y marcadores



  1. Objetivos

  2. Creando el Escenario

    1. ¿Qué queremos que haga nuestro escenario?

    2. Definición del Escenario. ¿Qué es el encapsulamiento? Control de colisiones: Colisionadores y colisionables. ¿Qué es una interfaz? Definición de interfaces en ActionScript 3.

    3. La Bola y el Pong como IColisionador e IColisionable

    4. Un pequeño problema... IColisionable e IColisionador. Bola como IColisionador. Pong como IColisionable.

    5. El código del Escenario
      La nueva clase Main. El código del Escenario. creaPongs, creaBolas, creaEscenario, bucle. La bola que colisiona...



  3. Bug (I): La Bola loca

  4. Añadiendo los marcadores

    1. Produciendo y detectando los goles

    2. ¡Gol! ¿Qué es un evento? Definición de GolEvent. ¿Qué es un atributo estático (static) o de clase? ¿Para qué sirve la palabra clave "super"? ¿Quién produce el GolEvent? ¿Quién detecta el GolEvent?

    3. Añadiendo los marcadores

    4. Nuestro marcador Flash. Código del marcador. Añadiendo los marcadores al Escenario

    5. Un campo de fútbol

    6. La clase CampoFutbol


  5. Conclusiones y archivos fuente del Pong 1.1


Números aleatorios (Random) en Haskell

Conseguir un puto número aleatorio en Haskell no es nada trivial. He estado buscando algunas soluciones, y al final he sacado el siguiente código, que no sé sí será el más correcto, pero funciona:

miRandom =
do
newStdGen
g<-getStdGen
let
a = 0::Int
b = 20::Int
x = randomR (a, b) g
print x

Que imprime por pantalla:

(17,1295529924 1123184626)
:: IO ()

La función miRandom imprime por pantalla la representación de la variable x que es del tipo (Int, StdGen). Vamos, el 17 es el número aleatorio entre 0 y 20, que son las variables a y b, y los otros dos números largos y extraños que forman el segundo campo de la tupla son un nuevo StdGen, que explicaremos después.
StdGen
Tipo de dato que representa un generador de números aleatorios. Necesario para todas las funciones encargadas de la generación del número.

getStdGen
Función que devuelve el generador de números aleatorios por defecto.

newStdGen:
Función que "actualiza" el generador de números aleatorios por defecto.

randomR
::(Random a, RandomGen b) => (a,a) -> b -> (a,b)

Recibe una tupla con los límites entre los que queremos sacar el elemento aleatorio y, como segundo un generador de números aleatorios, siempre del tipo StdGen.

En realidad, por defecto, pueden sacarse elementos aleatorios de los siguientes tipos de datos: Bool, Int, Integer, Char, Float, Double

Importante: clases genéricas (como Num) NO funcionarán en esta función.

Todo eso está muy bien, sí, pero hay un problema, y es que si ahora creamos esta función:
miRandom2 =
do
newStdGen
g<-getStdGen
let
a = 0::Int
b = 20::Int
x = randomR (a, b) g
y = randomR (a, b) g
print x
print y

y la ejecutamos, obtenemos esto:
(12,1295689980 1326707213)
(12,1295689980 1326707213)
:: IO ()

Es decir, el número aleatorio generado (el 12) es el mismo para ambas variables. ¿Casualidad? Podría ser. Pero si ejecutamos la función infinitas veces esas infinitas veces y las siguientes, los números aleatorios generados por randomR serán siempre los mismos para x e y. ¿Por qué? Porque el generador de números aleatorios siempre es el mismo, g y a partir de él siempre se generan los mismos números.

Solución: ¿Recuerdas que randomR devuelve una tupla en la que el primer miembro es el elemento aleatorio y el segundo dos números grandes y extraños? Pues ese segundo miembro es un nuevo elemento de tipo StdGen, distinto al original recibido por la función, y que utilizaremos para encontrar el siguiente número aleatorio. Entonces:
miRandom3 =
do
newStdGen
g<-getStdGen
let
a = 0::Int
b = 20::Int
x = randomR (a, b) g
y = randomR (a, b) (snd x)
print x
print y

Que tiene como salida:
(14,1994861249 30671636)
(16,413980776 402357293)
:: IO ()

Para terminar, recalcar que el uso de newStdGen es necesario para actualizar el generador de números aleatorios por defecto.

Si no lo hiciéramos, en cada una de las ejecuciones de miRandom3 los números aleatorios serían los mismos. Es decir, si en la primera ejecución fst x fuera 13 y fst y fuera 15, en las sucesivas ejecuciones de miRandom3, fst x y fst y continuarían valiendo 13 y 15, porque ambas generaciones, al no haber sido invocada newStdGen, partirían del mismo StdGen por defecto.