
Etiquetas: AdjustColor
Las clase AdjustColor permite crear un filtro para modificar las propiedades brillo, contraste, matiz y saturación de cualquier elemento de visualización. Esto nos permite, por ejemplo, pasar una imagen a blanco y negro (poniendo la saturación al mínimo(-100)) o ajustar los colores de una foto.
La clase AdjustColor está disponible para Flash Player 9 o superior.
El código comentado y los fuentes a continuación:

Etiquetas: System setClipboard
Con esta linea podemos copiar un texto al portapapeles del usuario desde Flash. La sintaxis es igual para Actionscript 2.0 y Actionscript 3.0:
System.setClipboard("El texto que queremos copiar");
Es muy útil por ejemplo si tenemos una web que genera códigos o urls personalizadas y queremos dar al usuario la oportunidad de copiarlas copn un botón.

Etiquetas: Event.CHANGE TextEvent.INPUT focus setSelection
Lo primero que tenemos que hacer para ir formateando el texto mientras el usuario escribe es añadir un listener para el evento change al campo de texto:
Texto_txt.addEventListener(Event.CHANGE,textoDentro);
Es importante que utilicemos el evento Event.CHANGE en lugar del TextEvent.INPUT, ya que el segundo se distribuye antes de que el campo se haya actualizado. Es decir, que si escribimos una "a" en el campo, flash lanza el evento TextEvent.INPUT, actualiza el valor .text del campo y lanza el eveno Event.CHANGE.
Después creamos la función que recoja el evento:
function textoDentro(e:Event):void {
e.target.text = formatear(e.target.text.split(".").join(""));
e.target.setSelection(e.target.text.length, e.target.text.length);
}En esta función hacemos dos cosas. Primero cogemos el texto del campo, le quitamos los puntos y lo mandamos a la función que lo va a formatear:
e.target.text = formatear(e.target.text.split(".").join(""));
Después ponemos el cursor al final del campo para que el usuario pueda seguir escribiendo al final del número:
e.target.setSelection(e.target.text.length, e.target.text.length);
La función que evalúa el número y le pone los puntos es esta:
function formatear(strNumber:String):String {
while (strNumber.substr(0, 1) == "0") {
strNumber = strNumber.substr(1);
}var dollar_array:Array = new Array();
var start:Number;
var end:Number = strNumber.length;
while (end > 0) {
start = Math.max(end - 3, 0);
dollar_array.unshift(strNumber.slice(start, end));
end = start;
}return dollar_array.join(".");
}
Etiquetas: FLVPlayback
Esta linea sirve para habilitar el suavizado (smoothing) en un componente FLVPlayback. Aunque el rendimiento se resiente bastante, puede ser útil si tenemos que reescalar el vídeo o este es de muy poca calidad
//Suponiendo que el FLVPlayback se llama "player"player.getVideoPlayer(player.activeVideoPlayerIndex).smoothing = true;

Etiquetas: FileReference FileFilter URLRequest
Este ejemplo muestra como hacer un formulario en Flash (Actionscript 3.0) con envio de adjuntos.
El esquema básico es que hacemos una subida normal con FileReference, y en el URLRequest de la subida incluimos las variables que queramos adjuntar en el formulario:
var request:URLRequest = new URLRequest(url);
request.method = URLRequestMethod.POST;
request.data = new URLVariables();
request.data.nombre = Nombre_txt.text;
request.data.destinatario = Destinatario_txt.text;
subidor.upload(request);
Estas variables las recogemos después en el PHP con el nombre que les hayamos puesto con:
$_REQUEST[nombre]
En el php tenemos el código típico de una subida, y una vez terminada pasamos a montar el correo electrónico.
Dejo los fuentes con el fla, la clase Formulario, y el php para la subida.
El código php es una versión adaptada del que podéis encontrar en esta página

Etiquetas: RegExp
Esta función utiliza una expresión regular para comprobar si una cadena es un email válido.
La expresión regular no la he construido yo, pero no puedo citar la fuente porque la he visto en muchos foros de actionscript, en castellano e inglés. La función en cuestión es esta:
function emailValido(email:String):Boolean{
var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
return emailExpression.test(email);
}Y estos serían algunos resultados:
@hotmail.com: false
pepe@hotmail.: false
paco@hotmail.hola.com: true
www.hotmail.com: false
paco@hola@hotmail.com: false
carmen@hotmail.com: true

Etiquetas: System totalMemory
Podemos comprobar cantidad de memoria utilizada por Flash Player mediante la propiedad System.totalMemory, que devuelve el valor en bytes.
Por ejemplo, si queremos ver el valor en KBs de la memoria utilizada por nuestra aplicación, pondríamos:
import flash.system.System;
trace(System.totalMemory / 1024 + " KBs")

Etiquetas: BitmapData Bitmap smoothing mask drawCircle
En este ejemplo voy a tratar de explicar como se hace el "Efecto lupa" en Flash, con Actionscript 3.0.
Para simplificar voy a explicar la teoria basándome en una imagen que tengo en un MovieClip el escenario. Por supuesto esto se puede modificar para cargar imágenes externamente o como se necesite.
Los pasos que tenemos que seguir para crear el "efecto lupa" son estos:
-Crear una copia del MovieClip en BitmapData, y ponerla por encima a una escala mayor que el original:
//Creo un pantallazo del clip, lo pongo con una escala == zoomvar myBitmapData:BitmapData = new BitmapData(clip.width, clip.height);
myBitmapData.draw(clip);
var bmp:Bitmap = new Bitmap(myBitmapData);
bmp.smoothing = true;
contenedor.addChild(bmp);
contenedor.scaleX = contenedor.scaleY = zoom;
addChild(contenedor);
-Poner a la copia una máscara circular, de manera que solo se vea el trozo de imágen tapado por la máscara:
//Le pongo una mascara del tamaño t al contenedormascara.graphics.beginFill(0x000000, 1);
mascara.graphics.drawCircle(0, 0, t);
contenedor.mask = mascara;addChild(mascara);
-Añadimos un evento enterframe. Dentro de la función del evento vamos a mover la máscara siguiendo al ratón, y a recolocar la "copia grande":
addEventListener(Event.ENTER_FRAME,renderizar)
En la función del evento tenemos que mover la máscara para que siga al ratón, y recolocar la imagen grande para que el trozo que se vé sea el que corresponde a la imagen pequeña. La función es cuestión es esta:
private function renderizar(e:Event):void {
//Calculo el porcentaje que tengo que mover el pantallazovar porcentajeX = clip.mouseX / clip.width;
var porcentajeY = clip.mouseY / clip.height;
//Recoloco el contenedorcontenedor.x = -(contenedor.width - clip.width) * porcentajeX
contenedor.y = -(contenedor.height - clip.height) * porcentajeY
//Muevo la mascaramascara.x = escenario.mouseX;
mascara.y = escenario.mouseY;
}Adjunto fuentes con todos los materiales, por si queda alguna duda.

Etiquetas: mouseChildren
Una de las trampas que me encontré cunado empecé con Actionscript 3.0 era esta:
-Creaba un MovieClip con un campo de texto dinámico dentro (por ejemplo para el botón de un menú).
-Le añadía un evento de ratón y ponia su propiedad buttonMode como true.
Resultado: no se veía el handCursor (la mano típica al hacer over sobre un botón) cuando ponía el ratón encima.
En aquel momento, para solucionar el inconveniente (estaba haciendo unos cambios delante del cliente), puse un botón transparente dentro del MovieClip, por encima del resto de elementos, de tal manera que al hacer over sobre el clip se hacia over sobre el botón y se mostraba el handCursor. Mas tarde, pude investigar un poco, y descubrí que lo que pasaba era que el campo de texto dentro del clip "interfería" con los eventos de ratón, y por eso no se mostraba "la mano".
Para solucionarlo, podemos utilizar la propiedad mouseChildren de los DisplayObjectContainer, que determina si los elementos secundarios de un objeto están habilitados para ratón. Su valor predeterminado es true.

En Actionscript 3.0 disponemos de dos operadores para verificar tipos: "as" e "is". Es decir, con estos operadores podemos comprobar, por ejemplo, si un elemento del escenario es de tipo Sprite, o si una variable es de tipo Number.
Para ver como funcionan estos dos operadores voy a utilizar un escenario sobre el que tengo 3 MovieClips de la clase "Cuadrado", que extiende de MovieClip, y 3 MovieClips de la clase "Circulo", que también extiende de MovieClip.
El operador is
Permite comprobar si una variable o expresión forma parte de un tipo de datos. No solo verifica si un objeto es una instancia de la clase especificada, sino también si es una subclase de ella o implementa la misma interfaz.
Por ejemplo, si en el escenario que hemos propuesto ponemos:
for(var i:uint = 0; i < numChildren; i++){
if (getChildAt(i) is DisplayObject) {
getChildAt(i).alpha = .1
}}Obtenemos:
Como vemos, "parpadean" círculos y cuadrados, ya que todos son instancias de clases que heredan de DisplayObject. Sin embargo, si ponemos:
for(var i:uint = 0; i < numChildren; i++){
if (getChildAt(i) is Cuadrado) {
getChildAt(i).alpha = .1
}}
vemos que solamente parpadean los cuadrados, ya que los circulos no pertenecen a la misma clase ni heredan de "Cuadrado".
El operador as
También permite comprobar si un elemento es miembro de un tipo de datos. Sin embargo, en lugar de devolver true o false, devuelve el valor de la expresión en lugar de true, y null en lugar de false. Por ejemplo:
trace(miCirculo as Circulo) //Devuelve: [object Circulo]
trace(miCirculo as Sprite) //Devuelve: [object Circulo]
trace(miCirculo as Cuadrado) //Devuelve: null

Etiquetas: complexIntersectionRectangle hitTestObject
La función hitTestObject(obj:DisplayObject) evalúa un objeto para comprobar si choca con el objeto obj. Por ejemplo, si tenemos dos objetos "Item1_mc" e "Item2_mc", podemos comprobar si chocan con:
Item1_mc.hitTestObject(Item2_mc)
Esta función, tiene el inconveniente de que comprueba los choques entre los contenedores rectangulares de los objetos. Por ejemplo:

por tanto, sin queremos comprobar las colisiones entre dos objetos no rectangulares, puede devolver valores que aparentemente no son correctos. Aquí tenemos un ejemplo en Flash:
Si queremos utilizar colisiones a nivel de pixel, podemos crear un objeto bitmapData, superponer los dos objetos en el objeto bitmapData con un filtro de color cada uno, y comprobar si hay pixels que tienen el color de la combinación de filtros utilizados. En el blog de
HitTest.complexHitTestObject(Item1_mc,Item2_mc)
Y si queremos recibir el rectángulo de colisión:
var rect:Rectangle = HitTest.complexIntersectionRectangle(Item1_mc,Item2_mc);
El resultado, sería este:
Los fuentes, y la clase HitTest de tink, tras el salto.

Etiquetas: BitmapData clone threshold
La función threshold permite hacer comparaciones pixel a pixel en una imagen. Por ejemplo, podemos separar todos los pixels mayores de un color de una imagen, y obtener otra imagen con esos pixels. La función threshold tiene 5 parámetros obligatorios (y varios opcionales):
threshold(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, operation:String, threshold:uint)
-sourceBitmapData: la imagen que vamos a utilizar
-sourceRect: rectángulo que define el area de la imagen de origen que vamos a utilizar
-destPoint: punto de la imagen de destino que corresponde a la esquina superior izquierda del rectángulo
-operation: operación que vamos a utilizar
-threshold: valor con el que comparamos cada pixel
Por ejemplo, si queremos separar los pixels mayores de 0xFFCCCCCC de los menores en una imagen, podemos utilizar:
img1.threshold(img1, new Rectangle(0, 0, 350, 242), new Point(0, 0), ">", 0xFFCCCCCC);
img2.threshold(img2, new Rectangle(0, 0, 350, 242), new Point(0, 0), "<=", 0xFFCCCCCC);
El código completo y los fuentes:

Etiquetas: ColorMatrixFilter filters
La clase ColorMatrixFilter de Actionscript 3.0 permite aplicar una transformación a los valores de color y alfa de cada pixel de una imagen. Se puede aplicar sobre cualquier objeto que herede de la clase DisplayObject (es decir MovieClip, SimpleButton, TextField...).
Los filtros ColorMatrixFilter, se crean a partir de una matriz de transformación de 4x5, con lo valores de modificación que queremos aplicar a cada canal. Por ejemplo, si tenemos la matriz:
private var rLum:Number = 0.2225;
private var gLum:Number = 0.7169;
private var bLum:Number = 0.0606;
private var bwMatrix:Array = [rLum, gLum, bLum, 0, 0,
rLum, gLum, bLum, 0, 0,
rLum, gLum, bLum, 0, 0,
0, 0, 0, 1, 0];
Podemos crear un filtro con ella, asi:
var filtroBW:ColorMatrixFilter filtroBW = new ColorMatrixFilter(bwMatrix);
y aplicarlo a un MovieClip (que en este caso está en el escenario con el nombre Imagen2_mc):
Imagen2_mc.filters = [filtroBW]
De esta manera, hacemos que el contenido de Imagen2_mc aparezca en blanco y negro, pero podemos modificar los valores de bwMatrix para obtener otros efectos.
El código completo y los fuentes, son estos:

Etiquetas: StyleSheet parseCSS styleSheet htmlText
Los campos de texto en flash pueden contener texto simple o texto en formato HTML. El texto en formato HTML se almacena en la propiedad htmlText. Sobre los campos con texto HTML podemos aplicar hojas de estilo CSS, creadas en el código de la aplicación o cargadas en tiempo de ejecución.
En este ejemplo vamos a ver como cargar un archivo css, y aplicar estos CSS a un TextField que contiene un teto HTML. La hoja de estilos que vamos a utilizar, es esta:
h1 {
font-family: Times New Roman, Times, _serif;
font-size: 30;
font-weight: bold;
}
h2 {
font-family: Arial, Helvetica, _sans;
font-size: 24;
}
p{
font-size: 15;
}
a{
color: #009900;
}
a:hover{
color: #00ff00;
}
Lo primero que tenemos que hacer, es cargar la hoja de estilos. Para ello, utilizamos una instancia de Loader:
cargador = new URLLoader();
cargador.addEventListener(Event.COMPLETE, onCSSFileLoaded);
cargador.load(new URLRequest("http://www.esedeerre.com/ejemplos/as3/css/ejemplo.css"));
Una vez cargado el archivo, salta el evento COMPLETE, y creamos una instancia de StyleSheet, parseamos el CSS cargado, y se lo aplicamos al campo de texto. Después de aplicar el CSS al campo de texto, podemos rellenar el campo con el texto HTML que queramos:
public function onCSSFileLoaded(event:Event):void
{var sheet:StyleSheet = new StyleSheet();
sheet.parseCSS(cargador.data);
campo.styleSheet = sheet; campo.htmlText = texto; }El código completo, y el ejemplo en Flash, tras el salto.

Método: concat()
var t:Number = getTimer();
var txt1:String = "Esto es";
var txt2:String = "una prueba de rendimiento";
var txt3:String = "de concatenacion de cadenas"
var txt:String;
for(var i:uint = 0;i < 1000000; i++){
txt = txt1.concat(" ", txt2, " ",txt3);
}trace(getTimer() - t);
Resultado: 2034 ms
Método: operador +
var t:Number = getTimer();
var txt1:String = "Esto es";
var txt2:String = "una prueba de rendimiento";
var txt3:String = "de concatenacion de cadenas"
var txt:String;
for(var i:uint = 0;i < 1000000; i++){
txt = txt1 + " " + txt2 + " " + txt3;
}trace(getTimer() - t);
Resultado: 894 ms
Conclusión: sumar Strings con + es 2 veces más rápido que utilizar el método concat() de la clase String().
Método: Math.min() / Math.max()
var t:Number = getTimer();
var n1:Number = 234;
var n2:Number = 675
var n:Number;
for(var i:uint = 0;i < 1000000; i++){
n = Math.min(n1,n2);
}trace(getTimer() - t);
Resultado: 149 ms
Método: condicionales
var t:Number = getTimer();
var n1:Number = 234;
var n2:Number = 675
var n:Number;
for(var i:uint = 0;i < 1000000; i++){
n = (n1>n2)?n2:n1;
}trace(getTimer() - t);
Resultado: 25 ms
Conclusión: una vez más, hacerlo "a mano" es más rápido.
Método: división
var t:Number = getTimer();
for(var i:uint = 0;i < 10000000; i++){
var n:Number = i / 2;
}trace(getTimer() - t);
Resultado: 226 ms
Método: multiplicación
var t:Number = getTimer();
for(var i:uint = 0;i < 10000000; i++){
var n:Number = i * .5;
}trace(getTimer() - t);
Resultado: 225 ms
Conclusión: esta era una de las "leyendas urbanas" que siempre habia oido pero nunca habia testeado. Por lo que he estado investigando, hasta alguna versión de FP9, era más rápido multiplicar que dividir un número, pero en las nuevas versiones de Flash Player ya no es así.

Etiquetas: Math.floor Math.abs
Este artículo recoge algunos test de rendimiento para diversas operaciones en Actionscript 3.0. Este es un tema que me interesa bastante, asi que espero hacer mas test e ir ampliando información en el futuro.
Los test se han realizado en un Core2 6420 2,13Ghz, con 3GB de RAM y Windows Vista Home Premium de 32 bits. La versión de Flash Player es la 10,0,2,54.
var t:Number = getTimer();
var temp:int;
for(var i:Number = 0; i < matriz.length; i++){
temp = matriz[i];
}trace(getTimer() - t);
Resultado: 130 ms
Si sustituimos el tipo de i de Number a uint:
var t:Number = getTimer();
var temp:int;
for(var i:uint = 0; i < matriz.length; i++){
temp = matriz[i];
}trace(getTimer() - t);
Resultado: 95 ms
Si almacenamos matriz.length en una variable:
var t:Number = getTimer();
var temp:int;
var l:uint = matriz.length;
for(var i:uint = 0; i < l; i++){
temp = matriz[i];
}trace(getTimer() - t);
Resultado: 23 ms
En definitiva, solo con poner uint (entero positivo) como tipo de i, y con almacenar la longitud de la matriz en una variable, hacemos que el bucle se ejecute 5,6 veces más rápido.
var t:Number = getTimer();
var temp:Number;
for(var i:uint = 0;i < 1000000; i++){
temp = Math.floor(1.7);
}trace(getTimer() - t);
Resultado: 163 ms
var t:Number = getTimer();
var temp:Number;
for(var i:uint = 0;i < 1000000; i++){
temp = uint(1.7);
}trace(getTimer() - t);
Resultado: 29 ms
var t:Number = getTimer();
var temp:Number;
for(var i:uint = 0;i < 1000000; i++){
temp = int(1.7);
}trace(getTimer() - t);
Resultado: 18 ms
Este test me ha sorprendido mucho. Convertir el número a int(entero), es 9 veces más rápido que utilizar Math.floor(). Teniendo en cuenta que el resultado es el mismo, y que encima int tiene menos letras que Math.floor, no veo motivos para no desterrar a Math.floor().
var t:Number = getTimer();
var temp:Number;
var n:Number = -53.44;
for(var i:uint = 0;i < 1000000; i++){
temp = Math.abs(n);
}trace(getTimer() - t);
Resultado: 145 ms
var t:Number = getTimer();
var temp:Number;
var n:Number = -53.44;
for(var i:uint = 0;i < 1000000; i++){
temp = n < 0 ? n * -1 : n;
}trace(getTimer() - t);
Resultado: 26 ms
Es decir, obtener el valor absoluto "a mano", 5,5 veces más rápido que utilizar Math.abs()

Etiquetas: charCodeAt charAt
Cuando cargamos un XML cuyos textos contienen saltos de linea, Flash duplica los saltos. Es decir, que si en el XML hemos puesto dos lineas separadas por un salto, en Flash aparecerán separadas por dos. Para solucionarlo, podemos aplicar una función al texto antes de mostrarlo en el campo de texto.
La función que podemos aplicar es la siguiente:

Etiquetas: Camera Video getCamera setMode attachCamera

Etiquetas: ColorPicker ColorTransform ColorPickerEvent

Etiquetas: SoundChannel Sound ByteArray computeSpectrum
Con AS3 podemos visualizar el espectro de sonido de un audio. Con unas pocas lineas de código, podemos hacer cosas impensables con anteriores versiones del lenguaje. Este es el resumen del código:
-Creo un objeto de tipo Sound() y cargo en él archivo mp3:
sonido = new Sound();
var request:URLRequest = new URLRequest(url);
sonido.addEventListener(Event.COMPLETE, sonidoCargado);
sonido.load(request);
-Programo la carga para que cuando termine se ejecute la función sonidoCargado. En esta función reproduzco el sonido (canal = sonido.play(0,1000);) y añado un evento para que se pinte el espectro de sonido (addEventListener(Event.ENTER_FRAME,mover)).
-La función mover es la encargada de "Pintar" el espectro. El espectro se almacena en la variable arrayMixer en forma de matriz de bits. Los elementos de esta matriz pueden ser 1 o 0. Resumiendo, podemos decir que cuantos más 1 haya, más "alto suena el sonido". Recorro la matriz y sumo todos esos 1, para ver como de grande tengo que pintar la barra de volumen. Cuando tengo ese valor lo almaceno en la matriz de volúmenes. Depués de esto, recorro toda la matriz de volúmenes y pinto una barra para cada valor almacenado.
El código completo:
package {import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.utils.ByteArray;
import flash.net.*;
public class CargadorSonidos extends Sprite {
var url:String = "sonido.mp3";
var canal:SoundChannel;var sonido:Sound;
var fourierTransform:Boolean = false;
var arrayMixer:ByteArray = new ByteArray();
var volumenes:Array = new Array();
public function CargadorSonidos():void {
cargarSonido();
}function cargarSonido():void {
SoundMixer.stopAll();
sonido = new Sound();
var request:URLRequest = new URLRequest(url);
sonido.addEventListener(Event.COMPLETE, sonidoCargado);
sonido.load(request);
}function sonidoCargado(event:Event):void {
canal = sonido.play(0,1000);
addEventListener(Event.ENTER_FRAME,mover);
}function mover(e:Event):void {
SoundMixer.computeSpectrum(arrayMixer, true);
var c = 0;
for (var i = 0; i < arrayMixer.length; i++) {
c += arrayMixer[i];
}volumenes.push(c);
if (volumenes.length > 400) {
volumenes.splice(0,1);
}graphics.clear();
graphics.lineStyle(1, 0x000000);
graphics.beginFill(0x000000);
for (var j = 0; j < volumenes.length; j++) {
graphics.lineTo(j,100+volumenes[j]/1200);
graphics.lineTo(j,100-volumenes[j]/1200);
graphics.moveTo(j,100);
}graphics.lineTo(volumenes.length,100);
graphics.lineTo(0,100);
} }}
Etiquetas: split return length

Etiquetas: removeChildAt numChildren getInstanceAtDepth


Etiquetas: Loader MovieClip URLRequest


Este código muestra como hacer una asignación condicional de valor a una variable. Sirve para ahorrar lineas de código cuando, como en el ejemplo, el valor de la variable que queremos definir, depende del valor de otra variable. El código vale para Actionscript 2.0 y 3.0.

Etiquetas: BevelFilter BlurFilter DropShadowFilter GlowFilter filters

Etiquetas: BitmapData Bitmap draw cachaAsBitmap createGradientBox beginGradientFill

Etiquetas: URLRequest URLLoader URLVariables
$email = $_POST['email'];
$asunto = $_POST['asunto'];
$cuerpo = $_POST['cuerpo'];
mail("$email","$asunto","$cuerpo");
echo "resultado=Mensaje enviado";

Etiquetas: numChildren getChildAt target currentTarget

Etiquetas: Bitmap BitmapData

Etiquetas: TextFormat font size TextField defaultTextFormat embedFonts selectable

Etiquetas: XML URLLoader URLRequest elements
El siguiente código carga un XML y recorre sus nodos y atributos imprimiendolos en pantalla.
El XML que he utilizado es el siguiente:
<Discos> <Disco puntuacion="10"><grupo id="20">The Knife</grupo>
<titulo>Deep Cuts</titulo>
</Disco> <Disco puntuacion="7"><grupo id="21">Jose Gonzalez</grupo>
<titulo>Veneer</titulo>
</Disco></Discos>Y el código AS:

Etiquetas: URLLoader URLRequest load

Etiquetas: Loader URLRequest contentLoaderInfo addEventListener load

Etiquetas: URLRequest URLVariables sendToURL URLLoader method load dataFormat
sendAndLoad permitía enviar información a un fichero externo (PHP, ASP o similar) y recibir después información de este. En AS3 ya no se puede utilizar esta función, pero en su lugar se puede utilizar el siguiente código (en el ejemplo envio dos numeros a un PHP, que los sumará y devolverá el resultado). El php puede ser como este:
<?php$numero1 = htmlentities($_POST[numero1]);
$numero2 = htmlentities($_POST[numero2]);
$suma = $numero1 + $numero2;
echo "suma=" . $suma;
?>Y el Actionscript:

Etiquetas: FileFilter FileReference URLRequest browse upload

Etiquetas: LocalConnection send connect

Etiquetas: Date getTime System totalMemory