Просмотр полной версии : ооп во ActionScript
Здравствуй народ!
У меня всё хорошо,вот только надоело код на кадры лепить.Решил для себя ООП освоить(по книжке Колин Мука).Но обьекты классов всё равно на временной создаю.Нужен инициализирующий класс не такли?Как свести на нет код таймлайна?
P.S.Не судите строго картина всего пока размыта.
Если ты еще только начинаешь учить, то лучше сразу переходи на ActionScript3. Там для ооп больше инструментария
Можно сделать класс например назвать его Main. Он будет наследоватся от MovieClip и атачится в таймлайне. Это будет единственный код написанный в таймлайне. Далее использовать этот Main как основной класс-контейнер для других т.е будет как аналог _root или DocumentClass в AS3
chingachgoog
05.02.2009, 16:22
Можно хранить в библиотеке пустой мувик, который экспортируется в 1-й кадр для скрипта.
В мувике
#initclip
// Активация главного класса
#endinitclip
Vrem немогу себе такое позволить!
Всем спасибо,за советы.И такой вопрос:литературу какую посоветуете?
Колин Мук. "ActionScript 3.0 для Flash. Подробное руководство"
Psycho Tiger
05.02.2009, 21:03
Можно хранить в библиотеке пустой мувик, который экспортируется в 1-й кадр для скрипта.
В мувике
#initclip
// Активация главного класса
#endinitclip
Лучше наверное, классом оформить.
да, лучше классом
//-----------------------------
// File *.swf
//-----------------------------
Main.assign(this);
//-----------------------------
// File Main.as
//-----------------------------
class Main {
public static function assign(mc:MovieClip):Main {
if (!mc) return null;
var c:Function = Main;
mc.__proto__ = c.prototype;
c.call(mc);
return Main(mc);
}
/**
* Constructor.
*/
private function Main() {
super();
// точка входа
}
}
Всеравно лучше было бы если бы этот класс работал с клипом какимто основным как бы, но сам бы им не являлся)
Хотя я вообще не пойму зачем так сделано)
я в свое время довольно плотно пользовал (и сейчас пользуюсь если надо что-то в AS2 делать) такую схему (http://silin.fatal.ru/AS2/manager):
все основано на том же приеме, что показал dimarik - просто ставим мувик в цепочку наследования классу (походу вызываем конструктор, если надо)
в результате имеем возможность создавать (и аттачить тоже) мувики "своих" классов без прописывания класса в библиотеке
в общем получается работать с нормальной иерархией классов без особой оглядки на таймлайн (почти как AS3 :))
реально экономит время если работать в схеме типа FD-mtasc-swfmill, IDE здесь получается почти не при делах (только сгенерить графику)
если же писать/компилить в IDE, то не думаю что от такого подхода будет выгода - тогда наверное удобнее все же в библиотеке класс прописать
Ага и искать его среди сотен клипов. Я не понимаю почему оно будет работаеть если Main не MovieClip :/
static function getFreeDepth(parent:MovieClip):Number{
var depth:Number=0;
while(parent.getInstanceAtDepth(depth))depth++;
return depth;
}
private static var MAX_DEPTH:Number = 1000;
private var tempDepth:Number = 0;
private var instance:MovieClip;
private function getNextHighestDepth():Number
{
var dp:Number = 0;
for (var i:Number = tempDepth + 1; i < MAX_DEPTH; i++)
{
if (instance.getInstanceAtDepth(i) === undefined)
{
dp = i;
break;
}
}
tempDepth = dp;
return dp;
}
если планируется что-то потом искать среди сотен клипов, то ООП здесь не причем вовсе..
все изначально должно быть организовано так чтоб не надо было ничего искать, иначе смысла в такой схеме нет, согласен
Ну я к тому что врядли испольовать регистрацию класов через библиотеку даже в FlashIDE удобней )
chingachgoog
06.02.2009, 10:24
Лучше наверное, классом оформить.
да, лучше классом
//-----------------------------
// File *.swf
//-----------------------------
Main.assign(this);
Не понял, ЧТО классом оформить?
Проблема у автора в том, что он не хочет писать код запуска на таймлайне. А она (проблема) только так и решается - что есть компонент в библиотеке (!) где прописан #initclip. Конечно, это тоже таймлайн мувика. Но этот мувик все же в библиотеке и о нем вообще не надо думать. Кстати сами классы по той же схеме с #initclip и работают.
...все основано на том же приеме, что показал dimarik - просто ставим мувик в цепочку наследования классу ...
в результате имеем возможность создавать (и аттачить тоже) мувики "своих" классов без прописывания класса в библиотеке
в общем получается работать с нормальной иерархией классов без особой оглядки на таймлайн (почти как AS3 :))
Ага - это именно то, о чем я так давно говорю.
http://flasher.ru/forum/blog.php?b=23
Не понял, ЧТО классом оформить?
Единственная строка на таймлайне - это Main.assign(this);
_root становится объетом класса Main. Сделайте Main extends MovieClip. Никаких приблуд вроде дополнительных мувиков не нужно.
Все остальное в файлах *.as
Проблема у автора в том, что он не хочет писать код запуска на таймлайне. А она (проблема) только так и решается - что есть компонент в библиотеке (!) где прописан #initclip. Конечно, это тоже таймлайн мувика. Но этот мувик все же в библиотеке и о нем вообще не надо думать. Кстати сами классы по той же схеме с #initclip и работают.
В этом случае обязательно нужно поместить на сцену этот "лишний" компонент.
chingachgoog
06.02.2009, 17:34
Единственная строка на таймлайне - это Main.assign(this);
Ну да, и вопрос автора "Как свести на нет код таймлайна?" выходит нерешенным.
В этом случае обязательно нужно поместить на сцену этот "лишний" компонент.
Вовсе нет. См. п.4 (http://flasher.ru/forum/showpost.php?p=795814&postcount=4)
chingachgoog, эээ... Получается, что код с рутового таймлайна перекочевал в таймлайн библиотечного мувика. Во-первых, появился "совершенно левый" символ. Во-вторых, фиг победишь навскидку где реально у флахи точка входа. Оно это автору надо?
имхо, абсолютно непринципиальный вопрос при том, что оба способа делают по сути одно и тоже
кому-то проще (милее?) написать код активации в библиотечном мувике
кому-то строчку в первом кадре рута
от этого что-то меняется ?
Для мтаска вообще ни то ни то ненадо)
Люди спасибо огромное!
Пользуюсь классом с точкой входа !
Назрел ещё один вопрос касающийся темы топика.
Как правельно спроектировать классы?
На данный момент у меня весь код на фреймах(работает,но смотриться убого),хочу теперь в классах описать, с чего начать?
По AS2 почитайте Колина Мука (http://www.moock.org/eas2/), например. Есть у него и по AS3 книжица, страниц так на 1к.
Доброго всем времени суток!
import ClassA;
class ClassB{
private var retData:String;
funcion getData():String{
retData = ClassA.getMetod();
return retData;
}
Поясните пожалуйста,мне обязательно надо наследовать ClassA,что бы воспользоваться его нужным мне статическим методом?
Добавлено через 1 минуту
Прости те за ошибки:rolleyes:
chingachgoog
12.02.2009, 14:46
Вы же сами написали код. Работает? А наследования там нет.
Статические методы и свойства не наследуются.
Понял!А могу ли я просто импортировав класс вообще и пользоваться?
Добавлено через 2 минуты
Мне же не нужно наследование,а только то что возрощает нужный мне метод,как быть?
Смотрите свой код выше, там все как надо.
Inils простите,но если не горите желанием обьяснить чайнику в чём его ошибка ,не бросайтесь отговорками(код не рабочий даже с соблюдением синтаксиса);
Добавлено через 3 минуты
There is no method with the name 'ClassA.'.
Добавлено через 3 минуты
There is no method with the name 'ClassA.'.
Добавлено через 5 минут
простите ЭВМ старенький
axiom, чайники на кухне. Здесь люди, одни думают, другим думать лень, поэтому они начинают говорить другим, что и как те должны делать.
Вы спросили
мне обязательно надо наследовать ClassA,что бы воспользоваться его нужным мне статическим методомвам сказали, что статические методы не наследуются и в вашем коде наследования тоже нет, а происходит вызов статического метода getMetod класса ClassA.
Об ошибке не слова. Так как какого вы мне пишите, про отговорки, вместо того чтобы подумать?
Если класс ClassA кривой, это не мои проблемы, что вы его не показали.
А теперь о внимательности. Мой ник iNils, а не Inils.
Извиниюсь за выше сказаное в ваш адрес.
class ClassA{
private var str:String;
static function getMetod():String {
str = new Date().toString();
return str;
}
}
Добавлено через 1 минуту
private static var str:String;//поправка
Переменные класса нужно создавать тогда, когда они используются в любом месте класса, иначе создавать локальные.
class ClassA{
static function getMetod():String {
var str:String = new Date().toString();
return str;
}
}
import ClassA;
class ClassB{
function getData():String{
var retData:String = ClassA.getMetod();
return retData;
}
}
а как же книжки ???Класс начинается с определения всех переменных(свойств)класса?
Ключевое слово - класса.
А локальные переменные, это вспомогательные переменные, которые к самому классу не относятся.
Вы когда пишите цикл
for (var i:Number = 0; i < 5; i++) {
}то используете вспомогательную переменную i. И таких циклов может быть много, причем вложенных. Вы их тоже будете определять в классе?
Кроме того, локальные переменные более быстрые, чем переменные класса.
Привет всем, тоже назрел вопрос по ООП
есть класс
class Ball extends MovieClip
{
var x:Number;//координаты
var y:Number;
var vx:Number;//скорости
var vy:Number;
....
}
Свойства vx,vy меняются запросто,
а как сделать чтобы менялись св-ва от MovieClipa (_rotate,_x)
почему-то из вне они не меняются(ball._rotate +=1;)
Это геттеры и сеттеры. Их нужно переопределять.
>>Это геттеры и сеттеры. Их нужно переопределять.
это если нужно от них что-то еще, а так-то зачем?
просто нет у MovieClip никакого _rotate..и у этого Ball тоже нет..
и чего хотим?
>>Это геттеры и сеттеры. Их нужно переопределять.
это если нужно от них что-то еще, а так-то зачем?
просто нет у MovieClip никакого _rotate..и у этого Ball тоже нет..
и чего хотим?
Извиняюсь, не так написал
надо было получить доступ к _rotation,_x и другим свойствам мувиклипа
Получилось так
public function set rotation(a:Number):Void
{
_rotation = a;
}
public function get rotation():Number
{
return _rotation;
}
так все работает,а если назвать get/set функции _rotation не работает
у Ball extends MovieClip должен быть совершенно нормальный доступ ко всем свойствам мувиклипа без всякого переопределения геттеров/сеттеров
в чем проблема непонятно.., попробуй сформулировать иначе или дай пример
Все уже разобрался, доступ есть, просто _rotation изменялся в onEnterFrame и небыло видно результата :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.