PDA

Просмотр полной версии : ооп во ActionScript


axiom
05.02.2009, 15:29
Здравствуй народ!
У меня всё хорошо,вот только надоело код на кадры лепить.Решил для себя ООП освоить(по книжке Колин Мука).Но обьекты классов всё равно на временной создаю.Нужен инициализирующий класс не такли?Как свести на нет код таймлайна?
P.S.Не судите строго картина всего пока размыта.

vrem
05.02.2009, 15:32
Если ты еще только начинаешь учить, то лучше сразу переходи на ActionScript3. Там для ооп больше инструментария

qazwsx
05.02.2009, 16:06
Можно сделать класс например назвать его Main. Он будет наследоватся от MovieClip и атачится в таймлайне. Это будет единственный код написанный в таймлайне. Далее использовать этот Main как основной класс-контейнер для других т.е будет как аналог _root или DocumentClass в AS3

chingachgoog
05.02.2009, 16:22
Можно хранить в библиотеке пустой мувик, который экспортируется в 1-й кадр для скрипта.
В мувике

#initclip
// Активация главного класса
#endinitclip

axiom
05.02.2009, 16:42
Vrem немогу себе такое позволить!
Всем спасибо,за советы.И такой вопрос:литературу какую посоветуете?

Wolsh
05.02.2009, 18:55
Колин Мук. "ActionScript 3.0 для Flash. Подробное руководство"

Psycho Tiger
05.02.2009, 21:03
Можно хранить в библиотеке пустой мувик, который экспортируется в 1-й кадр для скрипта.
В мувике

#initclip
// Активация главного класса
#endinitclip

Лучше наверное, классом оформить.

dimarik
05.02.2009, 22:03
да, лучше классом
//-----------------------------
// 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();
// точка входа
}
}

qazwsx
05.02.2009, 22:26
Всеравно лучше было бы если бы этот класс работал с клипом какимто основным как бы, но сам бы им не являлся)

Хотя я вообще не пойму зачем так сделано)

silin
05.02.2009, 22:55
я в свое время довольно плотно пользовал (и сейчас пользуюсь если надо что-то в AS2 делать) такую схему (http://silin.fatal.ru/AS2/manager):
все основано на том же приеме, что показал dimarik - просто ставим мувик в цепочку наследования классу (походу вызываем конструктор, если надо)
в результате имеем возможность создавать (и аттачить тоже) мувики "своих" классов без прописывания класса в библиотеке
в общем получается работать с нормальной иерархией классов без особой оглядки на таймлайн (почти как AS3 :))

реально экономит время если работать в схеме типа FD-mtasc-swfmill, IDE здесь получается почти не при делах (только сгенерить графику)
если же писать/компилить в IDE, то не думаю что от такого подхода будет выгода - тогда наверное удобнее все же в библиотеке класс прописать

qazwsx
06.02.2009, 00:17
Ага и искать его среди сотен клипов. Я не понимаю почему оно будет работаеть если 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;
}

silin
06.02.2009, 01:16
если планируется что-то потом искать среди сотен клипов, то ООП здесь не причем вовсе..
все изначально должно быть организовано так чтоб не надо было ничего искать, иначе смысла в такой схеме нет, согласен

qazwsx
06.02.2009, 01:21
Ну я к тому что врядли испольовать регистрацию класов через библиотеку даже в FlashIDE удобней )

chingachgoog
06.02.2009, 10:24
Лучше наверное, классом оформить.



да, лучше классом

//-----------------------------
// File *.swf
//-----------------------------

Main.assign(this);



Не понял, ЧТО классом оформить?
Проблема у автора в том, что он не хочет писать код запуска на таймлайне. А она (проблема) только так и решается - что есть компонент в библиотеке (!) где прописан #initclip. Конечно, это тоже таймлайн мувика. Но этот мувик все же в библиотеке и о нем вообще не надо думать. Кстати сами классы по той же схеме с #initclip и работают.


...все основано на том же приеме, что показал dimarik - просто ставим мувик в цепочку наследования классу ...
в результате имеем возможность создавать (и аттачить тоже) мувики "своих" классов без прописывания класса в библиотеке
в общем получается работать с нормальной иерархией классов без особой оглядки на таймлайн (почти как AS3 :))


Ага - это именно то, о чем я так давно говорю.
http://flasher.ru/forum/blog.php?b=23

dimarik
06.02.2009, 11:48
Не понял, ЧТО классом оформить?

Единственная строка на таймлайне - это 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)

dimarik
06.02.2009, 17:56
chingachgoog, эээ... Получается, что код с рутового таймлайна перекочевал в таймлайн библиотечного мувика. Во-первых, появился "совершенно левый" символ. Во-вторых, фиг победишь навскидку где реально у флахи точка входа. Оно это автору надо?

silin
06.02.2009, 17:56
имхо, абсолютно непринципиальный вопрос при том, что оба способа делают по сути одно и тоже
кому-то проще (милее?) написать код активации в библиотечном мувике
кому-то строчку в первом кадре рута
от этого что-то меняется ?

qazwsx
06.02.2009, 18:02
Для мтаска вообще ни то ни то ненадо)

axiom
09.02.2009, 20:48
Люди спасибо огромное!
Пользуюсь классом с точкой входа !
Назрел ещё один вопрос касающийся темы топика.
Как правельно спроектировать классы?
На данный момент у меня весь код на фреймах(работает,но смотриться убого),хочу теперь в классах описать, с чего начать?

dimarik
10.02.2009, 11:35
По AS2 почитайте Колина Мука (http://www.moock.org/eas2/), например. Есть у него и по AS3 книжица, страниц так на 1к.

axiom
12.02.2009, 14:04
Доброго всем времени суток!

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
Вы же сами написали код. Работает? А наследования там нет.

iNils
12.02.2009, 14:51
Статические методы и свойства не наследуются.

axiom
12.02.2009, 14:53
Понял!А могу ли я просто импортировав класс вообще и пользоваться?

Добавлено через 2 минуты
Мне же не нужно наследование,а только то что возрощает нужный мне метод,как быть?

iNils
12.02.2009, 15:02
Смотрите свой код выше, там все как надо.

axiom
12.02.2009, 15:19
Inils простите,но если не горите желанием обьяснить чайнику в чём его ошибка ,не бросайтесь отговорками(код не рабочий даже с соблюдением синтаксиса);

Добавлено через 3 минуты
There is no method with the name 'ClassA.'.

Добавлено через 3 минуты
There is no method with the name 'ClassA.'.

Добавлено через 5 минут
простите ЭВМ старенький

iNils
12.02.2009, 15:29
axiom, чайники на кухне. Здесь люди, одни думают, другим думать лень, поэтому они начинают говорить другим, что и как те должны делать.
Вы спросили
мне обязательно надо наследовать ClassA,что бы воспользоваться его нужным мне статическим методомвам сказали, что статические методы не наследуются и в вашем коде наследования тоже нет, а происходит вызов статического метода getMetod класса ClassA.
Об ошибке не слова. Так как какого вы мне пишите, про отговорки, вместо того чтобы подумать?
Если класс ClassA кривой, это не мои проблемы, что вы его не показали.

А теперь о внимательности. Мой ник iNils, а не Inils.

axiom
12.02.2009, 16:03
Извиниюсь за выше сказаное в ваш адрес.

class ClassA{
private var str:String;
static function getMetod():String {
str = new Date().toString();
return str;
}
}


Добавлено через 1 минуту
private static var str:String;//поправка

iNils
12.02.2009, 16:15
Переменные класса нужно создавать тогда, когда они используются в любом месте класса, иначе создавать локальные.
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;
}
}

axiom
12.02.2009, 16:20
а как же книжки ???Класс начинается с определения всех переменных(свойств)класса?

iNils
12.02.2009, 16:51
Ключевое слово - класса.
А локальные переменные, это вспомогательные переменные, которые к самому классу не относятся.
Вы когда пишите цикл
for (var i:Number = 0; i < 5; i++) {
}то используете вспомогательную переменную i. И таких циклов может быть много, причем вложенных. Вы их тоже будете определять в классе?
Кроме того, локальные переменные более быстрые, чем переменные класса.

Buble
04.03.2009, 22:29
Привет всем, тоже назрел вопрос по ООП
есть класс

class Ball extends MovieClip
{
var x:Number;//координаты
var y:Number;
var vx:Number;//скорости
var vy:Number;
....
}

Свойства vx,vy меняются запросто,
а как сделать чтобы менялись св-ва от MovieClipa (_rotate,_x)
почему-то из вне они не меняются(ball._rotate +=1;)

etc
04.03.2009, 22:48
Это геттеры и сеттеры. Их нужно переопределять.

silin
04.03.2009, 23:13
>>Это геттеры и сеттеры. Их нужно переопределять.
это если нужно от них что-то еще, а так-то зачем?

просто нет у MovieClip никакого _rotate..и у этого Ball тоже нет..
и чего хотим?

Buble
07.03.2009, 17:51
>>Это геттеры и сеттеры. Их нужно переопределять.
это если нужно от них что-то еще, а так-то зачем?

просто нет у MovieClip никакого _rotate..и у этого Ball тоже нет..
и чего хотим?
Извиняюсь, не так написал
надо было получить доступ к _rotation,_x и другим свойствам мувиклипа
Получилось так
public function set rotation(a:Number):Void
{
_rotation = a;
}
public function get rotation():Number
{
return _rotation;
}

так все работает,а если назвать get/set функции _rotation не работает

silin
07.03.2009, 18:20
у Ball extends MovieClip должен быть совершенно нормальный доступ ко всем свойствам мувиклипа без всякого переопределения геттеров/сеттеров
в чем проблема непонятно.., попробуй сформулировать иначе или дай пример

Buble
07.03.2009, 18:31
Все уже разобрался, доступ есть, просто _rotation изменялся в onEnterFrame и небыло видно результата :)