PDA

Просмотр полной версии : [mxmlc][Flex SDK] Добавить стандартный прелоадер


xintrea
05.10.2010, 13:10
Здравствуйте!


Есть у меня AS3 приложение с главным файлом Main.as, которое я компилирую с помощью команды "mxmlc Main.as". Мне нужно добавить хоть какой-нибудь прелоадер.

Вот здесь (http://help.adobe.com/ru_RU/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e3c.html) написано, что вроде как достаточно сделать mxml файл, в котором нужно прописать:

<s:Application ... preloader="mx.preloaders.DownloadProgressBar">

и у приложения появится какой-то стандартный прелоадер.

В том же каталоге, где лежит файл Main.as, я сделал файл application.mxml со следующим содержимым:

<?xml version="1.0"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark"
preloader="mx.preloaders.DownloadProgressBar"
usePreloader="true">
<mx:Script source="Main.as"/>
</s:Application>

Но при компиляции командой "mxmlc application.mxml" выдается ошибка:

Ошибка: Не удалось использовать <mx:Script> для реализации компонента.
<mx:Script source="Main.as"/>

Как ее побороть, так и не понял. :umnik2:

Вот здесь (http://otvety.google.ru/otvety/thread?tid=0d00b0e05d9c4f68&pli=1) говорят, что нужно подключать пространство xmlns:mx="library://ns.adobe.com/flex/mx" - так оно у меня подключено.

Еще обнаружил, что если вместо Main.as указать несуществующий файл - будет такая же ошибка.

Что я делаю неправильно? Как простейшим образом добавить к AS3 приложению хоть какой-нибудь прелоадер?

i.o.
05.10.2010, 13:34
FlashDevelop не пробовали? Там есть стандартный проект "AS3 Project with Preloader".
За вами останется только графика.

Bgg
05.10.2010, 13:44
FlashDevelop не пробовали? Там есть стандартный проект "AS3 Project with Preloader".
За вами останется только графика.

Linux гораздо интереснее и занятнее.

xintrea
05.10.2010, 14:26
> Linux гораздо интереснее и занятнее.

То есть, специалитов тут нет, и по вопросу ответить никто не может?

Bgg
05.10.2010, 14:41
> Linux гораздо интереснее и занятнее.

То есть, специалитов тут нет, и по вопросу ответить никто не может?

Не надо быть специализдтом, чтобы написать прелоадер.
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;

public class Preloader extends MovieClip
{

public function Preloader()
{
if (stage) {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
}
addEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

// TODO show loader
}

private function ioError(e:IOErrorEvent):void
{
trace(e.text);
}

private function progress(e:ProgressEvent):void
{
// TODO update loader
}

private function checkFrame(e:Event):void
{
if (currentFrame == totalFrames)
{
stop();
loadingFinished();
}
}

private function loadingFinished():void
{
removeEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);

// TODO hide loader

startup();
}

private function startup():void
{
var mainClass:Class = getDefinitionByName("Main") as Class;
if (parent == stage) stage.addChildAt(new mainClass() as DisplayObject, 0);
else addChildAt(new mainClass() as DisplayObject, 0);
}

}

}

package
{
import flash.display.Sprite;
import flash.events.Event;

[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}

}

}

xintrea
05.10.2010, 15:24
> Не надо быть специализдтом, чтобы написать прелоадер.

Этот прелоадер ничего не показывает.

По вопросу стандартного прелоадера добился следующего. Код application.mxml сделал таким:

<?xml version="1.0"?>
<mx:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
preloader="mx.preloaders.DownloadProgressBar"
usePreloader="true">
<fx:Script source="Main.as"/>
</mx:Application>

При компиляции *.as файл теперь подхватывается. Но вылазит такая ошибка:

Main.as(7): Ошибка: Пакеты не могут быть вложенными.
import flash.events.MouseEvent;

Совершенно непонятно, почему компиляция командой "mxmlc Main.as" идет, а если компилировать через подключение к *.mxml, вылазит такая ошибка. Начало файла Main.as:

package {

import flash.display.Sprite;
import flash.text.TextField;
import flash.display.DisplayObject;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.events.Event;

import PushButton;

public class Main extends Sprite
{
...

Hidest
05.10.2010, 16:08
// TODO show loader

Как бы намекает, что сюда надо самому написать появление графики прелоадера на сцене,

а вот это // TODO update loader самому написать изменение состояния этого самого прелоадера ( изменение циферок + прогресс бар).

alatar
05.10.2010, 17:17
По вопросу стандартного прелоадера добился следующего.
Нет такого понятия как "стандартный прелоадер", как и самих стандартов. То, что вы пытаетесь использовать работает в флекс проектах и именно о таком случае говорится в хелпе по вашей ссылке.

<fx:Script source="Main.as"/>
В source тега Script нельзя вставить код класса, о чем завуалированно говорится в тексте ошибки. По-сути вы пытаетесь дописать код класса Main в класс Application.

P.S. Не морочьте себе голову и воспользуйтесь кодом, который привел Bgg.

Как-то так будет работать (это только направление куда копать, код не проверял):
<?xml version="1.0"?>
<mx:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
preloader="mx.preloaders.DownloadProgressBar"
usePreloader="true">
<mx:UIComponent width="100%" height="100%">
<Main/>
</mx:UIComponent>
</mx:Application>
Но тут возникает вопрос, а стоит ли тащить за собой половину флек-фреймворка ради прелоадера.

xintrea
05.10.2010, 20:39
Всё, всем спасибо. Сделал простейший прелоадер на базе кода что дал Bgg.

Результирующая флешка: http://www.multikov.net/animation.php?data1=550&data2=384&data3=000000&data4=1072.

За сим, забываю про Flex/Flash как про страшный сон.

arkadattx
05.10.2010, 20:53
Вот (http://www.flasher.ru/forum/blog.php?b=243), обсуждалось.
Linux гораздо интереснее и занятнее.
А при чем тут Linux? Или я юмора не понял?