Просмотр полной версии : передача классов из PHP в AS3
Здравствуйте!
Подскажите кто нибудь пробовал передавать классы из пхп прямо в ас методом ПОСТ?
Разбирал клиент одной игры и обнаружил, что там идут запрос пхп далее вот что происходит с полученным ответом addChild(this.loader);
одной строки мало, хочется увидеть ВЕСЬ код
Лишнее убрал оставил самое нужное.
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
public class Preloader_in_acc extends MovieClip
{
private var loader:Loader;
private var preloaderBody:PreloaderBody;
private var puidUser:String;
public function Preloader_in_acc()
{
stage.scaleMode = StageScaleMode.SHOW_ALL;
this.preloaderBody = new PreloaderBody();
this.preloaderBody.txt.autoSize = TextFieldAutoSize.CENTER;
addChild(this.preloaderBody);
if (loaderInfo.parameters["puid"] == undefined)
{
this.puidUser = "0";
}
else
{
this.puidUser = loaderInfo.parameters["puid"];
}
var variables:* = new URLVariables("***********");
var request_auto:* = new URLRequest();
request_auto.url = "****************";
request_auto.method = URLRequestMethod.POST;
request_auto.data = variables;
var loader_auto:* = new URLLoader();
loader_auto.dataFormat = URLLoaderDataFormat.VARIABLES;
loader_auto.addEventListener(Event.COMPLETE, this.completeAutoRequest);
loader_auto.addEventListener(IOErrorEvent.IO_ERROR, this.ioErrorAutoRequest);
try
{
loader_auto.load(request_auto);
}
catch (e:Error)
{
preloaderBody.txt.text = "Load request error!";
}
return;
}// end function
function completeAutoRequest(event:Event) : void
{
var request:URLRequest;
var event:* = event;
try
{
this.loader = new Loader();
this.loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.ioErrorHandler);
this.loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.progressEvent);
this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.progressComplete);
request = new URLRequest(this.patio(event.target.data.em, event.target.data.pa));
this.loader.load(request);
}
catch (e:Error)
{
preloaderBody.txt.text = "Session error!";
}
return;
}// end function
function ioErrorAutoRequest(event:IOErrorEvent) : void
{
this.preloaderBody.txt.text = "Error connect!";
return;
}// end function
private function ioErrorHandler(event:IOErrorEvent) : void
{
this.preloaderBody.txt.text = "IO Error!";
return;
}// end function
private function progressEvent(event:ProgressEvent) : void
{
this.preloaderBody.txt.text = Math.round(event.bytesLoaded / event.bytesTotal * 100) + "%";
return;
}// end function
private function progressComplete(event:Event) : void
{
removeChild(this.preloaderBody);
this.preloaderBody = null;
addChild(this.loader);
return;
}// end function
// end function
}
}
Loader автоматически интерпретирует загруженные данные, он распазнаёт: SWF-файлы либо файлы изображений (JPG, PNG или GIF).
В вашем примере php вообще не причём. Он может вернуть ссылку на swf, который уже загрузит флешка, либо swf сам по себе может лежать на сервере и ждать прямого запроса.
Класс в виде "текстовых данных" загрузить во флешь хоть из php или ещё как - нельзя. Классы AS должны быть предварительно скомпилированны в swf или другой специальный формат файла, загрузив который, уже можно получить доступ к классам.
пс. На самом деле, загрузить классы прямиком как текстовые данные с последующей компиляцией прямо на клиенте - теоретически возможно и наверное даже есть готовые библиотеки для этого, но это отдельные исключительные случаи.
В примере dataFormat у экземпляра URLLoader выставлен в URLLoaderDataFormat.VARIABLES. Это позволяет подтягивать переменные из пар "ключ=значение".
PHP:
<?php
echo "status=ok";
?>
ActionScript:
var vLoader:URLLoader = new URLLoader();
vLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
vLoader.addEventListener(Event.COMPLETE, OnVariablesLoaded);
vLoader.load(new URLRequest('http://localhost/test.php'));
...
private function OnVariablesLoaded(e:Event):void
{
trace(e.target.data.status); //ok
}
В e.target.data(то есть, в поле data URLLoader'a) будет записан экземпляр класса URLVariables с полями, именующимися согласно полчуенным ключам. По-моему, этот метод - наследие загрзуки конфигурационных файлов подобного формата в AS2. В реальных проектах лучше использовать JSON или XML(желательно сериализировать для удобства представления данных и последующего рефакторинга), либо, для вариантов посерьезнее, Prorobuf или AMF.
if (loaderInfo.parameters["puid"] == undefined)
{
this.puidUser = "0";
}
else
{
this.puidUser = loaderInfo.parameters["puid"];
}
После этого, я бы даже не стал смотреть этот код - писал инвалид. Достаточно проверки else
if (loaderInfo.parameters["puid"] == undefined)
{
this.puidUser = "0";
}
else
{
this.puidUser = loaderInfo.parameters["puid"];
}
После этого, я бы даже не стал смотреть этот код - писал инвалид. Достаточно проверки else
хаха, может в this.puidUser по умолчанию должно быть "0", а ты его инвалидом...
private var puidUser:String = "0" - это умолчание
а это проверка
if (loaderInfo.parameters["puid"]) this.puidUser = loaderInfo.parameters["puid"]
AlexCooper
11.09.2013, 18:14
Класс в виде "текстовых данных" загрузить во флешь хоть из php или ещё как - нельзя. Классы AS должны быть предварительно скомпилированны в swf или другой специальный формат файла, загрузив который, уже можно получить доступ к классам.
Можно динамически создаваться классы, наследоваться от других и так далее (http://www.as3commons.org/as3-commons-bytecode/emit.html)
var source:String = (<![CDATA[
getlocal_0
pushscope
getlocal_2
iffalse L0
getlocal_1
pushbyte 100
multiply
convert_i
setlocal_1
jump L1
L0:
getlocal_1
pushshort 1000
multiply
convert_i
setlocal_1
L1:
getlocal_1
returnvalue
]]>).toString();
methodBuilder.addAsmSource(source);
Но требует более продвинутых навыков нежели у ТС.
Добавлено через 4 минуты
private var puidUser:String = "0" - это умолчание
а это проверка
if (loaderInfo.parameters["puid"]) this.puidUser = loaderInfo.parameters["puid"]
а я бы вообще написал
this.puidUser = loaderInfo.parameters["puid"] ? loaderInfo.parameters["puid"] : '0';
а я бы вообще написал Что тоже было бы лишним, дабы вы использовали 2 проверки, а не одну
Извиняюсь, а где Вы видите 2 проверки?
alexcon314
12.09.2013, 08:26
if (loaderInfo.parameters["puid"] == undefined)
{
this.puidUser = "0";
}
else
{
this.puidUser = loaderInfo.parameters["puid"];
}
При всем при том, код, приведенный ТС - читабельный и понятный даже детям, в отличие от кэпских прочих вариантов :D. К тому же эту конструкцию очень легко модифицировать.
AlexCooper
12.09.2013, 16:45
Что тоже было бы лишним, дабы вы использовали 2 проверки, а не одну
о_О
Покажите мне две проверки?
Как по мне
private var puidUser:String; // объявляем переменную
// присвистываем значение
this.puidUser = loaderInfo.parameters["puid"] ? loaderInfo.parameters["puid"] : '0';
в вашем случае
private var puidUser:String = "0" // объявляем переменную и присваеваем
if (loaderInfo.parameters["puid"]) this.puidUser = loaderInfo.parameters["puid"]
// если данные есть идет переприсвоение
соответственно одно присвоение с единым условием, оптимальней нежели присвоение, условие и переприсвоение в случае если данные есть.
В каком месте тернарного оператора (http://jacksondunstan.com/articles/793) их две?
if (loaderInfo.parameters["puid"] == undefined)
{
this.puidUser = "0";
}
else
{
this.puidUser = loaderInfo.parameters["puid"];
}
При всем при том, код, приведенный ТС - читабельный и понятный даже детям, в отличие от кэпских прочих вариантов :D. К тому же эту конструкцию очень легко модифицировать.
Плюс кэпские варианты делают немного не то, что "может быть хотел" автор: если в parameters["puid"] лежит пустая строка, результаты не сойдутся :)
AlexCooper
13.09.2013, 15:09
Плюс кэпские варианты делают немного не то, что "может быть хотел" автор: если в parameters["puid"] лежит пустая строка, результаты не сойдутся :)
что мешает тогда написанию
this.puidUser = loaderInfo.parameters["puid"]==undefined ? '0' : loaderInfo.parameters["puid"];
Но я всеравно использовал бы тернарный оператор для присвоения значения с условием. Для этого по сути он и существует.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.