Hace poco estuve preguntando por aquí acerca de XML y me enteré de que necesitaba algo como php para almacenar los records en un archivo XML y cargarlos en otra sesión.
Estuve mirando unos tutoriales y he acabado haciendo esto:
En el programa principal (Se trata de un videojuego):
Fotograma 1: Menú principal
Código ActionScript :
var urlRecords:String = "HighScores.xml"; var records:Records = new Records(); addChild(records);
Fotograma 2: Juego <-- Esto lo hago porque si intento cargar y escribir el archivo en el fotograma de GameOver, me da error siempre.
Código ActionScript :
records.cargarXML(urlRecords); //Precarga
Fotograma 3: GameOVer
Código :
Código ActionScript :
records.escribirXML(puntuacion.toString());
Clase Records:
Código ActionScript :
public function cargarXML(url:String){
cargador.addEventListener(Event.COMPLETE, cargaCompleta);
cargador.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
cargador.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
cargador.load(new URLRequest(url));
}
private function cargaCompleta(e:Event):void { //Funcion que se ejecuta cuando termina la carga.
cargador.removeEventListener(Event.COMPLETE, cargaCompleta);
cargador.removeEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
cargador.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
datos = new XML(e.target.data);
datos.ignoreWhite = true;
var i:int = 0;
var miRaiz:XMLList = datos.child("Score");
if (miRaiz != null){
for each(var nodo:XML in miRaiz){
i++;
miRoot.textoRecords.text += "#" + i +": " + nodo.nombre + "\t\t" + nodo.puntos + "\n";
}
}else{
miRoot.textoRecords.text = "Aún no hay records!!\n";
}
}
public function escribirXML(puntuacion:String){
var temp:String;
var miRaiz:XMLList = datos.child("Score");
var j:int = 0;
trace("antes del if");
if (miRaiz != null){
trace(miRaiz);
for each (var nodo:XML in miRaiz){
j++;
//Devuelve el atributo puntuacion
trace("antes de temp");
temp = nodo.puntos;
if (puntuacion > temp){
var newNodo:String = "<Score id = \"" + j + "\"><nombre>NuevoRecord</nombre><puntos>"+ puntuacion +"</puntos></Score>";
trace(nodo[2].nombre);
trace(newNodo);
datos = datos.insertChildBefore(miRaiz.Score[j], newNodo);
//borrar el último record
delete miRaiz[7].children;
trace("miRaiz: " + miRaiz);
trace(nodo.Score[2]);
trace("Datos: " + datos);
var myData:URLRequest = new URLRequest("save.php");
myData.method = URLRequestMethod.POST;
myData.contentType = "text/xml";
myData.data = datos;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, dataOnLoad);
loader.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler)
loader.load(myData);
break;
}
}
}
}
function dataOnLoad(evt:Event){
try {
xmlResponse = new XML(evt.target.data);
miRoot.textoRecords.text = xmlResponse;
removeEventListener(Event.COMPLETE, dataOnLoad);
removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
} catch (err:TypeError) {
miRoot.textoRecords.text = "An error occured when communicating with server:\n" + err.message;
}
}save.php:
Código PHP :
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
// $xml = xmldoc($GLOBALS["HTTP_RAW_POST_DATA"]);
$xml = $GLOBALS["HTTP_RAW_POST_DATA"];
$file = fopen("HighScores.xml","wb");
fwrite($file, $xml);
fclose($file);
// echo("<status>File saved.</status>");
echo($GLOBALS["HTTP_RAW_POST_DATA"]);
}
?>Dado que no tengo ni idea de php, veis vosotros algún problema? No lo graba, y da error en escribirXML() y en cargacompleta(), ambas en Recods.as
Gracias de antemano
