Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   ооп во ActionScript (http://www.flasher.ru/forum/showthread.php?t=121017)

axiom 05.02.2009 15:29

ооп во ActionScript
 
Здравствуй народ!
У меня всё хорошо,вот только надоело код на кадры лепить.Решил для себя ООП освоить(по книжке Колин Мука).Но обьекты классов всё равно на временной создаю.Нужен инициализирующий класс не такли?Как свести на нет код таймлайна?
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

Цитата:

Сообщение от chingachgoog (Сообщение 795814)
Можно хранить в библиотеке пустой мувик, который экспортируется в 1-й кадр для скрипта.
В мувике
Код:

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


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

dimarik 05.02.2009 22:03

да, лучше классом
Код AS1/AS2:

//-----------------------------
// 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 делать) такую схему:
все основано на том же приеме, что показал dimarik - просто ставим мувик в цепочку наследования классу (походу вызываем конструктор, если надо)
в результате имеем возможность создавать (и аттачить тоже) мувики "своих" классов без прописывания класса в библиотеке
в общем получается работать с нормальной иерархией классов без особой оглядки на таймлайн (почти как AS3 :))

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

qazwsx 06.02.2009 00:17

Ага и искать его среди сотен клипов. Я не понимаю почему оно будет работаеть если Main не MovieClip :/

Код AS1/AS2:

static function getFreeDepth(parent:MovieClip):Number{
                var depth:Number=0;
                while(parent.getInstanceAtDepth(depth))depth++;
                return depth;
        }

Код AS1/AS2:

        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

Цитата:

Сообщение от Psycho Tiger (Сообщение 795899)
Лучше наверное, классом оформить.

Цитата:

Сообщение от dimarik (Сообщение 795925)
да, лучше классом
Код AS1/AS2:

//-----------------------------
// File *.swf
//-----------------------------
 
Main.assign(this);


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

Цитата:

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

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

dimarik 06.02.2009 11:48

Цитата:

Сообщение от chingachgoog (Сообщение 796053)
Не понял, ЧТО классом оформить?

Единственная строка на таймлайне - это Main.assign(this);
_root становится объетом класса Main. Сделайте Main extends MovieClip. Никаких приблуд вроде дополнительных мувиков не нужно.
Все остальное в файлах *.as

Цитата:

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

В этом случае обязательно нужно поместить на сцену этот "лишний" компонент.

chingachgoog 06.02.2009 17:34

Цитата:

Сообщение от dimarik (Сообщение 796070)
Единственная строка на таймлайне - это Main.assign(this);

Ну да, и вопрос автора "Как свести на нет код таймлайна?" выходит нерешенным.

Цитата:

Сообщение от dimarik (Сообщение 796070)
В этом случае обязательно нужно поместить на сцену этот "лишний" компонент.

Вовсе нет. См. п.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 почитайте Колина Мука, например. Есть у него и по AS3 книжица, страниц так на 1к.

axiom 12.02.2009 14:04

Доброго всем времени суток!
Код AS1/AS2:

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

Извиниюсь за выше сказаное в ваш адрес.
Код AS1/AS2:

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

Переменные класса нужно создавать тогда, когда они используются в любом месте класса, иначе создавать локальные.
Код AS1/AS2:

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

Код AS1/AS2:

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

Ключевое слово - класса.
А локальные переменные, это вспомогательные переменные, которые к самому классу не относятся.
Вы когда пишите цикл
Код AS1/AS2:

for (var i:Number = 0; i < 5; i++) {
}

то используете вспомогательную переменную i. И таких циклов может быть много, причем вложенных. Вы их тоже будете определять в классе?
Кроме того, локальные переменные более быстрые, чем переменные класса.

Buble 04.03.2009 22:29

Привет всем, тоже назрел вопрос по ООП
есть класс
Код AS1/AS2:

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

Цитата:

Сообщение от silin (Сообщение 803137)
>>Это геттеры и сеттеры. Их нужно переопределять.
это если нужно от них что-то еще, а так-то зачем?

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

Извиняюсь, не так написал
надо было получить доступ к _rotation,_x и другим свойствам мувиклипа
Получилось так
Код AS1/AS2:

        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 и небыло видно результата :)


Часовой пояс GMT +4, время: 05:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.