PDA

Просмотр полной версии : Подключение внешнего прелоадера


metzies
14.02.2014, 13:59
Создали некий внешний прелоадер, теперь встает вопрос как его соединить с основным контентом.
public class Test extends Sprite
{
private var _preloader :RoundedPreloader;

public function Test()
{
super();

_preloader = new RoundedPreloader();
_preloader.x = stage.stageWidth / 2;
_preloader.y = stage.stageHeight / 2;
_preloader.play();
addChild(_preloader);

Прошу подсказки как соединить все это дело с основным swf. (К примеру, Tour.swf, который является индивидуальной флешкой и не имеет открытых AS записей)


import flash.display.Sprite;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.Graphics;


public class RoundedPreloader extends Sprite
{
private var _color :uint;
private var _minRadius :int;
private var _segmentsCount :int;
private var _segmentLength :int;
private var _rotationSpeed :int;
private var _timer :Timer;
private var _playing :Boolean = false;

// ------------- public
public function RoundedPreloader($pColor:uint = 0x666666, $minRadius:int = 10, $segmentLength:int = 10, $segmentsCount:int = 12, $rotationSpeed:int = 50)
{
super();
_color = $pColor;
_minRadius = $minRadius;
_segmentLength = $segmentLength;
_segmentsCount = $segmentsCount;
_timer = new Timer($rotationSpeed);
_timer.addEventListener(TimerEvent.TIMER, onTimerHandler);

buildDisplay();
}

public function play():void
{
if (_playing || !_timer) return;
_timer.start();
_playing = true;
}

public function stop():void
{
if (!_playing || !_timer) return;
_timer.stop();
_playing = false;
}

public function destroy():void
{
_timer.stop();
_timer.removeEventListener(TimerEvent.TIMER, onTimerHandler);
while (numChildren) { removeChildAt(0); }
if(stage && parent) parent.removeChild(this);
}

public function get color():uint { return _color; }
public function set color($colorValue:uint):void
{
_color = $colorValue;
while (numChildren) { removeChildAt(0); }
buildDisplay();
}

public function get segmentLength():int { return _segmentLength; }
public function set segmentLength($lengthValue:int):void
{
_segmentLength = $lengthValue;
while (numChildren) { removeChildAt(0); }
buildDisplay();
}

public function get segmentsCount():int { return _segmentsCount; }
public function set segmentsCount($countValue:int):void
{
_segmentsCount = $countValue;
if (_segmentsCount < 5) _segmentsCount = 5;
while (numChildren) { removeChildAt(0); }
buildDisplay();
}

public function get minRadius():int { return _minRadius; }
public function set minRadius($radiusValue:int):void
{
_minRadius = $radiusValue;
while (numChildren) { removeChildAt(0); }
buildDisplay();
}

public function get speed():int { return _timer.delay; }
public function set speed($speedValue:int):void
{
_timer.stop();
_timer.removeEventListener(TimerEvent.TIMER, onTimerHandler);
_timer = new Timer($speedValue);
_timer.addEventListener(TimerEvent.TIMER, onTimerHandler);
if (_playing) _timer.start();
}

// ------------- private
private function buildDisplay():void
{
for(var i:int = 0; i < _segmentsCount; i++)
{
var line:Shape = drawRoundedRect(_segmentLength, _segmentLength * 0.4, _segmentLength * 0.2, _color);
line.x = _minRadius;
line.y = - line.height / 2;
var tempMc:Sprite = new Sprite();
tempMc.addChild(line);
tempMc.alpha = 0.3 + 0.7 * i / _segmentsCount;
tempMc.rotation = 360 * i / _segmentsCount;
addChild(tempMc);
}
}

private function onTimerHandler(e:TimerEvent):void
{
rotation += 360 / _segmentsCount;
}

private function drawRoundedRect($w:Number, $h:Number, $bevel:Number = 0, $color:uint = 0x000000, $alpha:Number = 1):Shape
{
var mc = new Shape();
mc.graphics.beginFill($color, $alpha);
mc.graphics.moveTo($w - $bevel, $h);
mc.graphics.curveTo($w, $h, $w, $h - $bevel);
mc.graphics.lineTo($w, $bevel);
mc.graphics.curveTo($w, 0, $w - $bevel, 0);
mc.graphics.lineTo($bevel, 0);
mc.graphics.curveTo(0, 0, 0, $bevel);
mc.graphics.lineTo(0, $h - $bevel);
mc.graphics.curveTo(0, $h, $bevel, $h);
mc.graphics.lineTo($w - $bevel, $h);
mc.graphics.endFill();
return mc;
}

}
}

silin
14.02.2014, 21:31
public class Test extends Sprite
{

private var _preloader :RoundedPreloader;
private var loader:Loader;

public function Test()
{
super();

_preloader = new RoundedPreloader();
_preloader.x = stage.stageWidth / 2;
_preloader.y = stage.stageHeight / 2;
_preloader.play();
addChild(_preloader);

loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
loader.load(new URLRequest("Tour.swf"));
}

private function loader_complete(e:Event):void
{
removeChild(_preloader);
addChild(loader);
}

}

metzies
15.02.2014, 14:04
Отлично, премного благодарен. Как теперь правильнее будет в это дело вписать процентную загрузку?

silin
15.02.2014, 14:12
подписаться у loader.contentLoaderInfo на ProgressEvent.PROGRESS
в обработчике смотреть loaderInfo.bytesLoaded / loaderInfo.bytesTotal
дальше от фантазии: текстфилд, прогрессбар, ...

Добавлено через 5 минут
package
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.text.TextField;

public class Test extends Sprite
{

private var _preloader:RoundedPreloader;
private var loader:Loader;

private var tf:TextField = new TextField();

public function Test()
{
super();

_preloader = new RoundedPreloader();
_preloader.x = stage.stageWidth / 2;
_preloader.y = stage.stageHeight / 2;
_preloader.play();
addChild(_preloader);

tf.x = _preloader.x;
tf.y = _preloader.y + 20;
addChild(tf);

loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.load(new URLRequest("Tour.swf"));
}

private function loader_progress(e:ProgressEvent):void
{
var loaderInfo:LoaderInfo = e.target as LoaderInfo;
var percent:int = 100 * loaderInfo.bytesLoaded / loaderInfo.bytesTotal;
tf.text = percent + "%";

}

private function loader_complete(e:Event):void
{
removeChild(_preloader);
removeChild(tf);
addChild(loader);
}

}

}

metzies
16.02.2014, 11:37
Уже более-менее становится понятным. Сейчас есть проблема с оформлением всего этого дела на хостинг. Я добавил на страницу с флешем следующий код: (Прочитал, что если прелоадер с мейн флешем не находятся в одном каталоге с хтмл страницей, то его нужно добавить)
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0"
width="800" height="600" id="Tour">
<param name="movie" value="preloader.swf">
<param name="quality" value="high">
<param name="base" value=".">
<embed src="preloader.swf" quality="high" width="800" height="600"
name ="Tour" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" base=".">
</embed>
</object>
Не помогло, прелоадер все равно не начинает запускать контент. Код прелоадера остался такой же, какой вы подкорректировали в первом посте.
+ При запуске прелоадера в IE он начинает жаловаться,
http://i6.pixs.ru/storage/8/5/4/int1jpg_3803278_10893854.jpg

Hauts
16.02.2014, 11:42
metzies, тестируйте не локально.

metzies
16.02.2014, 11:48
Я тестирую на хостинге с добавлением вышеуказанного кода, а скриншот я прислал в догонку, что локально IE жалуется на прелоадер. На хостинге прелоадер проходит, контент не появляется.

silin
16.02.2014, 12:01
www.google.com/search?q=actionscript+политика+безопасности

metzies
16.02.2014, 12:57
www.google.com/search?q=actionscript+политика+безопасности

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

silin
16.02.2014, 13:13
>>Но это не должно относиться к моему случаю
не берусь судить, но я бы все же попробовал прописать в Security.allowDomain() в подгружаемой
насчет ругани в локале, все решается настройками этой изолированной среды опциями компилятора(что-то типа use-network true\false) или же добавлением мест, где все это запускается в список доверенных (нажмите "Параметры", чтобы..)

metzies
17.02.2014, 13:17
Что ж, у меня нет возражений попробовать этот вариант, но как мне быть если мой подгружаемый swf не имеет никаких as записей? Это отдельная swf-ка, созданная в автоматизированной программе, не имеющая внешних кодированных файлов.

silin
17.02.2014, 14:08
сори, нечего больше посоветовать, такого вот очевидного
почитайте еще эти разъяснения (http://senocular.com/flash/tutorials/contentdomains/), может чего прояснит

metzies
18.02.2014, 17:36
подписаться у loader.contentLoaderInfo на ProgressEvent.PROGRESS
в обработчике смотреть loaderInfo.bytesLoaded / loaderInfo.bytesTotal
дальше от фантазии: текстфилд, прогрессбар, ...

Добавлено через 5 минут
package
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.text.TextField;

public class Test extends Sprite
{

private var _preloader:RoundedPreloader;
private var loader:Loader;

private var tf:TextField = new TextField();

public function Test()
{
super();

_preloader = new RoundedPreloader();
_preloader.x = stage.stageWidth / 2;
_preloader.y = stage.stageHeight / 2;
_preloader.play();
addChild(_preloader);

tf.x = _preloader.x;
tf.y = _preloader.y + 20;
addChild(tf);

loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.load(new URLRequest("Tour.swf"));
}

private function loader_progress(e:ProgressEvent):void
{
var loaderInfo:LoaderInfo = e.target as LoaderInfo;
var percent:int = 100 * loaderInfo.bytesLoaded / loaderInfo.bytesTotal;
tf.text = percent + "%";

}

private function loader_complete(e:Event):void
{
removeChild(_preloader);
removeChild(tf);
addChild(loader);
}

}

}

Теперь понятно, премного благодарен. В данной схеме мне требуется использовать текстфилд, почитал информацию с help.adobe и форума по текстфилду, но до конца не понял как это использовать в моем случае. Это мой первый проект на AS3, поэтому возникает так много вопросов.

P.S. По ссылке вашего прошлого поста информацию изучил, проблема с размещением проекта на хостинге решена. Конечно же, не без вашей помощи.

Akopalipsis
18.02.2014, 18:36
но до конца не понял как это использовать в моем случае.
Что именно не понятно?

metzies
19.02.2014, 10:54
Что именно не понятно?

Не понятно как заставить textfield выводить данные по загрузке.

Akopalipsis
19.02.2014, 14:18
Не понятно как заставить textfield выводить данные по загрузке.
У Вас в цитируемом коде, есть наглядный пример. Почему у Вас не получается? По другому быть не может.

metzies
19.02.2014, 15:52
Получается, отладчик во флеше отображает проценты загружаемого флеш-ролика, но визуально это не выводит.
Добавлял:
tf.x = _preloader.x;
tf.y = _preloader.y + 20;
tf.width = 200;
tf.border = true;
tf.textColor = 0x00334D;
addChild(tf);
Бордер отображается, а текст нет.

Akopalipsis
19.02.2014, 15:57
А что трейс показывает в loader_progress.. trace(tf.text); ?

silin
19.02.2014, 16:20
в локале просто этого не увидеть, чтоб проверить-посмотреть, не связываясь со всякими имитаторами медленной связи, можно во flash IDE открыть swf-файл и запустить simulate download (Ctrl-Enter)

metzies
19.02.2014, 18:31
Проблема решена. По неопытности не проставил слушателя на прогресс загрузки. Всем спасибо за помощь. Тему пока можно не закрывать, по мере поступления вопросов я бы хотел снова обратиться сюда.

Aprel
25.02.2014, 22:45
metzies, все классно и понятно расписано silin - ом... (только 19.02.2014, 15:20... если и в дальнейшем хотите что то тестировать локально, то поставьте хотя бы Апач)