PDA

Просмотр полной версии : Внутренний прелоадер


Фенёк
20.12.2011, 13:00
Всем привет, я вобщем-то тут по довольно избитому вопросу, по которому мне так и не удалось нагуглить какого-нибудь адекватного и внятного ответа, по сему иду в народ.

Так вот, ситуация такая. Есть главный класс Main


package {

import flash.display.MovieClip;
import flash.events.Event;


public class Main extends MovieClip {


var widthInBlocks :int = 5, //Ширина поля в блоках
heightInBlocks :int = 5, //Высота поля в блоках

groundSample :Ground = new Ground(), //Для снятия параметров
scape :Scape, //Объект который я буду перетаскивать
bar :Bar;

static public var scapeCenter :Object = new Object(),//Объект, относительно которого будет строиться поле
center :Object = new Object();

public function Main()
{

//Чтобы блоки были по центру экрана
scapeCenter.x = stage.stageWidth / 2 - groundSample.width/2;
scapeCenter.y = stage.stageHeight / 2 - groundSample.height * heightInBlocks/2;

center.x = stage.stageWidth / 2;
center.y = stage.stageHeight / 2;

bar = new Bar();
bar.x = center.x - bar.width/2;
bar.y = center.y;

addChild(bar);

bar.addEventListener("loaded", onLoadComplte);
}

public function onLoadComplte(e:Event):void
{
bar.removeEventListener("loaded", onLoadComplte);
removeChild(bar);
scape = new Scape(widthInBlocks, heightInBlocks);
addChild(scape);
}
}
}




Он добавляет прелоадер на таймлайн и ждет пока тот закончит загрузку, чтобы потому вгрузить следующий объект.

Вот код используемый Bar'ом загрузки:


package {

import flash.display.MovieClip;
import flash.events.*;

public class Bar extends MovieClip {


public function Bar() {

addEventListener(Event.ADDED_TO_STAGE, added);
}

private function added(e:Event):void
{
addEventListener(Event.ENTER_FRAME, enterFrame)
}

private function enterFrame(e:Event):void
{
var total :Number = loaderInfo.bytesTotal,
loaded :Number = loaderInfo.bytesLoaded;

scaleX = loaded/total;

if(loaded == total)
{
removeEventListener(Event.ENTER_FRAME, enterFrame);
dispatchEvent(new Event('loaded'));
}
}
}
}


Что же я имею на выходе? НИ-ЧЕ-ГО.
Прелодерный бар не появляется сразу, а ждет полной загрузки флешки, после чего соизваливает на мгновение появиться сам на отметке 99. Со всех ожидаемых объектов снял галочки экспорта в первый кадр, но, увы, все тщетно.

Подскажите пожалуйста, как сделать прелоадер. Желательно без выпотрашивания содержимого библиотеки на таймлайн.

Jewelz
20.12.2011, 13:05
читайте про метатег Frame, factoryClass

неужели за все время существование форума никто не спросил про внутренний прелоадер? сомневаюсь (http://lmgtfy.com/?q=site%3Aflasher.ru+%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D0%B9+%D0%BF%D1%80%D0%B5%D0%BB%D0%BE%D0%B0%D0%B4%D0%B5%D1%80)

Фенёк
20.12.2011, 13:52
Окей, разместил мета-тэг в классе, но не похоже, чтобы метод-конструктор указаного класса выполнялся хоть как-нибудь.

public class Main extends MovieClip {

[Frame(factoryClass="Bar")];

Jewelz
20.12.2011, 13:57
я же просил почитать (http://racer242.blogspot.com/2008/01/flex-as3.html), а не просто воткнуть куда попало =)

Фенёк
20.12.2011, 15:00
Никак не понять, вот написано

[Frame(factoryClass="MyFactory")]
public class FrameTest extends Sprite
{


Так и я делаю. Добавляю себе метатег в пакейдж с указанием на класс загрузчика.

Я так понимаю, что должен начать выполняться загрузчик, а после того как он все загрузит, меняем классы местами. Ну или что-то вроде того.

При том, как показывает трассировка, загрузчик продолжает не выполняться и все происходящее сводится в медититивному созерцанию белого экрана.

К слову сказать компилю все непосредственно во флеше, а то меня начало терзать сомнение что это может оказаться какой-нибудь чисто флексовой фичей. Да и вообще, откровенно говоря, похоже, что флеш попросту игнорирует строчку с метатегом.

ChuwY
20.12.2011, 15:26
И вы оказались правы.
В flash professional не работает.

Вот вам тема (http://www.flasher.ru/forum/showthread.php?t=172599&page=2) в помощь.

Inet_PC
20.12.2011, 15:35
Тут не телепаты, сразу нельзя было написать?

Фенёк
20.12.2011, 15:57
Просто никак не могу смириться с тем, что бывают другие среды разработки )

А теперь по делу. Все почти клево, только вот при попытке выполнить кусок кода
var mainClass :Class = getDefinitionByName("Main") as Class;
var app :Object = new mainClass();
addChild(app as DisplayObject);

Начинает ругаться на то, что кто-то null. А именно ошибка происходит при попытке создать объект класса.

Inet_PC
20.12.2011, 16:04
Просто никак не могу смириться с тем, что бывают другие среды разработки )
Оо. Я бы не назвал Flash средой разработки, это как блокнот назвать средой разработки, имхо конечно же. Хотя думаю бывают люди, которых и блокнот вполне устраивает (знаю нескольких пишущих на php так). Почитайте про другие Среды, возможно найдете, что - то подходящее и скорость с результативностью разработки вырастят в разы.

ChuwY
20.12.2011, 17:18
Просто никак не могу смириться с тем, что бывают другие среды разработки )

А теперь по делу. Все почти клево, только вот при попытке выполнить кусок кода
var mainClass :Class = getDefinitionByName("Main") as Class;
var app :Object = new mainClass();
addChild(app as DisplayObject);

Начинает ругаться на то, что кто-то null. А именно ошибка происходит при попытке создать объект класса.

Очевидно, не нашлось определение Main-класса.
Вы делали по тому примеру, что я привел?
Вы не забываете переходить на второй кадр?

Фенёк
20.12.2011, 17:31
По всей видимости был какой-то чокнутый глюк системы. Все заработало, большое спасибо, я чувствую себя легче )