Strix. Хождение по мукам.

Началось всё с того, что на работе не стало интеренета. Нет, его не отключили, просто он ну очень медленно работал. А тут я как назло начал встраивать во Flash прелоадер. Так как я до этого момента вообще ничего не присал на ActionScript 3.0, мне пришлось начитаться как русскоязычных так и англоязычных ресурсов.

Кроме неработающего интеренета еще вдабавок слёг один из самых на мой взгляд лучших русскоязычных ресурсов по Flash форум flasher.ru. Я взял пример написанный на Flash 9.0 alfa. Запускаю его….работает. Делаю тоже самое — не работает. Копирую содержимое в мой файл…. Не работает.

Выдаёт такую ошибку:

1046: Type was not found or was not a compile-time constant: TextField.

Стало грустно. К вечеру появился интеренет и всё встало на свои места. :)

Оказывается, если вы ложите в MovieClip поле для ввода и даёте ему имя, то в файле класса для этого MovieClip’а желательно (в моём случае оказалось обязательно) указать в импортах

import flash.text.TextField;

В этом мне помогли лайф доки от адоба.
Потом начала выскакивать другая ошибка. У меня был мувиклип, который лежал на TimeLine. Так вот мне надо было из этого MovieClip’а сделать play() для TimeLine. В примере было так:

parent.play();

Вот оно мне начало выдавать следующую ошибку.

1061: Call to a possibly undefined method play through a reference with static type flash.display:DisplayObjectContainer.

Но мы ж не лохи, мы знаем ООП и понимаем, что parent имеет тип DisplayObjectContainer (смотрите опять же лайф доки от Adobe), а метод play() есть у MovieClip. Дело ясное — casting, или говоря попросту нужно привести тип. Но как это делаеться во Flash. Ответ на это вопрос нам даёт англоязычный ресурс http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=3 (на смотреть в самом низу страницу) . Тутдаже и пример есть. Вот так всё просто оказалось.

MovieClip(parent).play();

Кстати, сайт senocular.com очень даже информативный. Советую посетить.

Посмотреть мой прелоадер можно тут. Он конечно не притендует на красоту и изящество, но функционал достигнут.

Как всегда, всех заинтересованных приглашаю в коменты. А код моего прелоадера получился примерно такой.


package main {
import flash.text.TextField;
import flash.display.MovieClip;
import flash.events.*;

public class preloader extends MovieClip {
public function preloader() {
addEventListener(Event.ENTER_FRAME, Update);
}

public function Update(e : Event):void {
var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;
var bytesTotal:Number = stage.loaderInfo.bytesTotal;
var s:String = "";
var percent:Number = 0;
if (bytesTotal>0){
percent = Math.floor(bytesLoaded/bytesTotal*100);
s = percent+"% ("+
Math.round(bytesLoaded/1024)+"kb / "+
Math.round(bytesTotal/1024)+"kb)";
}
this.txt.text="Loading... "+s;
if (bytesLoaded==bytesTotal || bytesTotal==0) {
removeEventListener(Event.ENTER_FRAME, Update);
MovieClip(parent).play();
}
}

}
}

Кстати, как выделить так исходный код я узнал в соответсвующем FAQ. Но у меня почемуто ничего не получаеться. :(

Реклама

%d такие блоггеры, как: