Форум 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)
-   -   Class'ы их создание и работа с ними (http://www.flasher.ru/forum/showthread.php?t=103206)

D12 31.10.2007 19:30

Class'ы их создание и работа с ними
 
Вложений: 1
Прошу обьясните мне на простых примерах как они создаются, как ими управлять, что можно с их помощью создовать

CrazyFlasher 31.10.2007 20:06

вам для начала лучше поискать общую лит-ру про ООП..не важно, AS, не AS...просто чтобы понять саму суть

udaaff 31.10.2007 20:17

Советую Мука почитать. Основы ActionScript 2.0

Fl00r 31.10.2007 20:21

Честно говоря ну прочитал я Мука. И остался в еще большем недоумении. Когда начал сам что-то писать - стало легче. Когда Nirth угрожал расстрелом за нечеловеческий код, то я совсем просветлел и понял, что такое конструктор, метод и фигурные скобочки в loop actions =).
Юмор юмором, но для меня лучшая школа - практическая.
Но помочь D12 не смогу, так как не считаю себя компетентным человеком в вопросах ООП.

udaaff, напугал по началу =) Цена: 36080 руб.

wvxvw 31.10.2007 20:30

Код:

class DemoClass {
        public static function main() {
                var my_txt:TextField = _root.createTextField("my_txt", 1, 100, 100, 300, 100);
                my_txt.multiline = true;
                my_txt.wordWrap = true;
                var my_fmt:TextFormat = new TextFormat();
                my_fmt.color = 0xFF0000;
                my_fmt.underline = true;
                my_txt.text = "This is my first test field object text.";
                my_txt.setTextFormat(my_fmt);
        }
}
//------- calling the function somewhere furthe in the code ----//
// DemoClass.main();
//--------------------------------------------------------------//

Это что касается твоего кода. Лучше задавай конкретные вопросы - на них легче овечать =)

D12 31.10.2007 21:17

Хорошо :)
Как её с места столкнуть ?
Код:

class Star extends MovieClip {
        //
        var Go:Number = 3;
        //
        function Star() {
                var star:MovieClip = _root.createEmptyMovieClip("star", star.getNextHighestDepth());
                star.beginFill(0xFFFFFF);
                star.moveTo(-5, -1);
                star.lineTo(-5, -1);
                star.lineTo(5, -1);
                star.lineTo(5, 1);
                star.lineTo(-5, 1);
                star.endFill();
                star.endFill();
                star._x = 275;
                star._y = 200;
                star._alpha = 100;
        }
        //
        public function onEnterFrame():Void {
                _root.star._y += Go;
        }
        //
}


udaaff 31.10.2007 21:25

Класс, расширяющий мувик, надо связывать с символом мувика в библиотеке.
Код:

class Star extends MovieClip {
       
        private var _go:Number
        private var _i:Number
        // если массив явл. константой, то можно и тут ему значение присвоить,
        // если же значение массива будет меняться runtime, то надо значение
        // присваивать в конструкторе или в onLoad
        private var COLOR_BOX:Array = [0x9999CC, 0x00CCFF, 0x66CCFF, 0xFF99CF, 0x0033CC];
        //
        public function onLoad():Void {
                // инициализация начальных свойств
                _go = 3;
                _i = 0;
                __drawStar;
        }
       
        private function __drawStar():Void{               
                // выражения
        }
       
        public function onEnterFrame():Void {
                // выражения
        }
}


D12 31.10.2007 21:34

Программно в классе можно рисовать ?

udaaff 31.10.2007 21:50

Код:

//в кадре
//var mc = attachMovie("id", "mc", getNextHighestDepth(), {w: 100, h: 50})

class Star extends MovieClip {
       
        private var _w:Number
        private var _h:Number
       
        public function onLoad():Void {
                __drawRect(_w, _h);
        }
       
        private function __drawRect(w:Number, h:Number):Void{               
                beginFill(0x00FF00);
                lineStyle(0);
                lineTo(w, 0);
                lineTo(w, h);
                lineTo(0, h);
                lineTo(0, 0);
                endFill();
        }
       
        public function set w (value:Number):Void {
                _w = value;
        }
       
        public function set h (value:Number):Void {
                _h = value;
        }
}


D12 31.10.2007 21:59

теперь к полученному результату можно дополнить подобное действие ?
_x += 1;

Нарисованный программно в классе обьект можно ли в этом же классе позиционировать, или может нужен еще для этого класс ?

D12 31.10.2007 23:03

Эх... =) вас трудно понять :) то спорите за кадры, а тут выходит что-бы работал класс на главной сцене (.fla) должен находится клип созданный не программно с указанием в lingage имени нужного класса, для того что бы спихнуть созданный к примеру выше в классе програмно какой небудь обьект, я правильно понял :)

P.S. Мазахисты :)
Прорвёмся ...

wvxvw 31.10.2007 23:19

Цитата:

Сообщение от udaaff
Класс, расширяющий мувик, надо связывать с символом

Не учи людей нехорошему... нормальный способ - создавать клипы внутри класса, а не присваивать класс зааттаченому мувику...
С наследованием от МувиКлипа есть определенные неприятности - тут же на этой странице есть тема... у человека вполне нормальный код не компилися из за этого.
Код:

class MyClass {
        //---------- var declaration -------//
        private var __mc:MovieClip;
        //---------- constructor -----------//
        function MyClass(mc:MovieClip){
                __mc = mc.createEmptyMovieClip("__mc",mc.getNextHighestDepth());
                __mc.beginFill(0,100);
                __mc.moveTo(0,0);
                __mc.lineTo(100,0);
                __mc.lineTo(100,100);
                __mc.lineTo(0,100);
                __mc.lineTo(0,0);
                __mc.endFill();
        }
        //-------- get/set props --------//
        public function set x(n:Number){
                __mc._x = n;
        }
        public function get x():Number {
                return __mc._x;
        }
}

И делайте со своим клипом что хотите, создавайте где угодно и т.д.

Поправил, сорри, опечатался

udaaff 31.10.2007 23:30

Цитата:

Сообщение от wvxvw
Не учи людей нехорошему... нормальный способ - создавать клипы внутри класса, а не присваивать класс зааттаченому мувику...

Раз уж такие заявления делаете, объясняете почему. Я лично считаю ваш способ ненормальным. И, если класс наследуется от муклипа, его всегда нужно с симоволом связывать.

D12 31.10.2007 23:34

Пример выше неработает =(

etc 31.10.2007 23:34

udaaff, тотальное наследование от MovieClip не есть хорошая практика. Создавать клипы в классы — хорошо, только делать это нужно так, как написал wvxvw и нужно обязательно забыть, что существует клип _root.

D12 31.10.2007 23:58

При попытке запуска выше стоящего класса, вообщем вот:

Цитата:

20: Instance variables cannot be accessed in static functions.
return __mc._x;

Total ActionScript Errors: 1 Reported Errors: 1

etc 01.11.2007 00:04

Надо убрать static из геттера.

D12 01.11.2007 00:15

Это конечно понятно, но ничего непроисходит и при этом нет ошибки :(

udaaff 01.11.2007 01:22

Цитата:

Сообщение от __etc
udaaff, тотальное наследование от MovieClip не есть хорошая практика. Создавать клипы в классы — хорошо, только делать это нужно так, как написал wvxvw и нужно обязательно забыть, что существует клип _root.

А какой смысл в тотальном применении композиции для создания мувика? И что преступного в моем примере, я так и не понял.

D12 01.11.2007 01:37

1:0 пока версия пользователя Udaaff работаспособна но увы не юзабельная в маштабах.
Тем немение версия пользователя Wvxvw вселяет надежду, в сети натыкаюсь на весьма похожие мысли, правда у них работает, у меня неполучается :)

udaaff 01.11.2007 01:49

К примеру, в кадре:
new MyClass(mc) // В качестве параметра мувик передаешь.

etc 01.11.2007 01:56

Цитата:

Сообщение от udaaff
А какой смысл в тотальном применении композиции для создания мувика? И что преступного в моем примере, я так и не понял.

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

lowka 01.11.2007 02:21

Цитата:

Сообщение от udaaff
А какой смысл в тотальном применении композиции для создания мувика?

Можно спокойно переопределять нужные свойства. С MovieClip-ом все несколько сложнее (не сложнее, а просто тупее).

D12 01.11.2007 02:50

Что могу сказать, сегодня я размазался об эту стену...
судя по всему классы мне не рады...
но нужно учиться...:)

Что у меня есть на данный момент:
вот коробочка все рисуется все хорошо, код в .as файле
Код:

class Star {
        static function create(Obj:Object):Void {
                var char:MovieClip = Obj.targ.createEmptyMovieClip("box", Obj.targ.getNextHighestDepth());
                char.beginFill(0xFFFFFF);
                char.moveTo(-50, -10);
                char.lineTo(-50, -10);
                char.lineTo(50, -10);
                char.lineTo(50, 10);
                char.lineTo(-50, 10);
                char.endFill();
                char._x=200, char._y=200;
        }
}

далее стена, немогу я сдвинуть эту коробочку с места :eek:
класс на движение .as файл
Код:

class Go {
        public var n:Number = 200;
        function onEnterFrame():Void {
                _root.mc._x += 1;
        }
        //public function set x(n:Number) {
                //_root.mc._x = n;
        //}
        //public function get x():Number {
                //return _root.mc._x;
        //}
}

код в .fla файле
Код:

var __go:Go = new Go();
import Star;
var Obj:Object = {};
Obj.targ = this.createEmptyMovieClip("mc", 0);
Star.create(Obj);
delete Obj;

Всё пошёл себя собирать сегодня классы меня разорвали:wacko:

Nirth 01.11.2007 02:55

D12 заведи себе гугл талк, стукни меня на furzahad@gmail.com(писать сюда безсмысленно, я не проверяю эту почту она прото для IM)

Nirth 01.11.2007 03:01

Цитата:

Визуальные элементы не должны содержать в себе логику. Принцип отделения визуальной информации от логической.
Ой только не надо, в SWING (один из самых крутых GUI фреймворков) Логика и Вид как раз сильно завязаны. в .NET Framework логика и вид завязаны в Flex Framework логика и вид завязаны в Cocoa(Mac OSX) логика и вид завязаны.

Update
кстати в Win32 логика и вид тоже завязаны.

Update
Единственная причина почему в ActionScript используеться композиция, это потому что так легче. Не нужно мучаться с фабриками и тд, Колин Мук пишет книжки для начинающих, именно поэтому он решил заюзать композицию, она менее багнутая. На деле подход с фабриками лично мне больше нравится.

wvxvw 01.11.2007 03:52

2 udaaff:
Причина гораздо банальнее. В сторону все войны о том, как правильно, и как в теории синтезируется сферический конь в вакууме =)
Метод аттача и последующего объявления клипа объектом класса работает хреново. Факт, в том коде о котором я говорю была следующая неувязка: было 2 класса последовательно наследуемых от мувиКлипа, так вот второй почему-то по вызову конструктора суперкласса пытался обратится к клипу на сцене... Почему - надо спрашивать у Адоби =)

И мое сугубо личное мнение... 90% кода который пишется на флеше реализует элементы интерфейса. При чем, как правило проще и техничнее сразу же писать и контроллеры и их внешний вид, чем создавать десятки библиотек для того, чтобы в итоге сваять какой-нибудь комбо-бокс... Элементарно меньше работы, да и понятнее в итоге.

2 D12:
Код:

class Star {
        static function _create(Obj:Object):MovieClip {
                var char:MovieClip = Obj.targ.createEmptyMovieClip("box", Obj.targ.getNextHighestDepth());
                char.beginFill(0xFF00FF);
                char.moveTo(-50, -10);
                char.lineTo(-50, -10);
                char.lineTo(50, -10);
                char.lineTo(50, 10);
                char.lineTo(-50, 10);
                char.endFill();
                char._x=200, char._y=200;
                return char;
        }
        static function _move(mc:MovieClip):Void {
                mc.onEnterFrame = function():Void {
                        this._x++;
                }
        }
        static function _stop(mc:MovieClip):Void {
                delete mc.onEnterFrame;
        }
}

Код:

var _mc:MovieClip = Star._create({targ:this});
Star._move(_mc);
setTimeout(Star._stop,1000,_mc);

немножко непонятно назначение такой конструкции, но в учебных целях покатит =)

Nirth 01.11.2007 04:11

2 D12 не слушай wvxvw

2 wvxvw Без обид, и прошу прощение но мое имхо, это бред.

wvxvw 01.11.2007 04:37

Код бредовый? Ну, я тут спорить не буду... я просто взял то, что было и слепил так, чтобы хоть что-то похожее делало =)
Я не думаю, что цель проекта заключается в том, чтобы двигать прямоугольник по экрану =) А чтобы просто посмотреть, а что получится, если сделать так.

А если бред - это то, что было написано до кода - ну, на то оно и ИМХО =)

ЗЫ. http://flasher.ru/forum/showthread.php?t=103055 вот тут этот пример, о котором я раньше говорил.

Nirth 01.11.2007 04:44

Вложений: 1
Вот пример Вложение 18130.
Создается фабрика. Далее кажому классу наследнику TextField/MovieClip создаеться статический метод create (в моем случае был метод addChild который принимал в качестве параметра прототип или функцию-класс желаемого класса).


Цитата:

Код бредовый? Ну, я тут спорить не буду... я просто взял то, что было и слепил так, чтобы хоть что-то похожее делало =)
Я не думаю, что цель проекта заключается в том, чтобы двигать прямоугольник по экрану =) А чтобы просто посмотреть, а что получится, если сделать так.

А если бред - это то, что было написано до кода - ну, на то оно и ИМХО =)

ЗЫ. http://flasher.ru/forum/showthread.php?t=103055 вот тут этот пример, о котором я раньше говорил.
Угу, оно самое то что написано до кода имхо бред, поэтому и имхо.

terbooter 01.11.2007 07:59

То есть фабрика это то же как у wvxvw, только добавляется строчка

Код:

                        result.__proto__ = generator.prototype;
                        generator.apply(result);

То есть мувик это объект суперкласса Object, но с помощью стандартного
new его не создать, поэтому создается статическая функция, которой передается ссылка и создается пустой мувик, а затем задается __proto__
и вызывается конструктор, то есть по сути те же действия выполняет new.

http://flasher.ru/forum/showthread.php?t=102420
http://flasher.ru/forum/showthread.php?t=79179

etc 01.11.2007 08:06

Nirth, ну ооочень сильно напоминает мой McFactory :)

wvxvw 01.11.2007 11:21

Эм... еще одна попытка создать UIObject? %) Мне оч понравилось объяснение в хелпе полезности этого класса =) Не дословно:
"в принципе этот класс не нужен, просто создан для удобства тех, кто привык программировать на чем-то отличном от АС" =)
Ну, я смогу придумать еще надцать череззаборногузадерических способово вызвать .createEmptyMovieClip() а толку? =)))

Nirth 01.11.2007 12:19

Цитата:

Nirth, ну ооочень сильно напоминает мой McFactory
Этот код я увидел далеко в 2003 году. Он не мой вроде принадлежит руке Piter Hall'а. Хотя с тех пор изменялся раз десять. Это упрощенная версия.
Так же этот прием используеться в фреймворках AsStep, ASWing, Flex Framework 1.0, 1.5, Vegas. Это вообще единственный оптимальный способ создавать мувики, поэтому твое удивление совершенно напрасно=)))

etc 01.11.2007 13:06

А я и не удивляюсь, собственно :)

CrazyFlasher 01.11.2007 13:22

привязываение класса к клипу в библиотеке - порно (имхо)

udaaff 01.11.2007 13:26

Объясните мне пожалуйста. Зачем мне использовать различные фабрики или способ wvxvw для создания мувика или текстового поля, если просто напросто можно создать пустой мувик в библиотеке и связать его с классом? Только потому, что в других языках все обстоит по другому?

upd: CrazyFlasher, почему порно?

CrazyFlasher 01.11.2007 13:29

ну теряется логическая модель программы. это тоже самое, что писать код внутри клипа

udaaff 01.11.2007 13:33

логическая модель находится в классе. И какова разница: или мы будем мувик создавать при помощи attachMovie или при помощи createEmtpyMovieClip и потом через фабрику его пропускать?

CrazyFlasher 01.11.2007 13:36

программа должна быть единным целым, а не по кускам присобачена к клипам (имхо)


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

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