Форум 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)

udaaff 01.11.2007 13:40

Код находится в классе, он же не на кнопках написан =)

CrazyFlasher 01.11.2007 13:44

ну всё равно...для меня не удобно...мне кажется лучше сделать, по простому говоря, главный класс, который будет создавать объекты других классов, навешивать им события и т.д. Так проще работать, переходить от одного класса к другому...гибкая навигация и ошибку легче найти (опять таки всё это имхо, и я не утверждаю, что это правильнее...просто мне так удобнее)

Nirth 01.11.2007 13:49

Цитата:

Объясните мне пожалуйста. Зачем мне использовать различные фабрики или способ wvxvw для создания мувика или текстового поля, если просто напросто можно создать пустой мувик в библиотеке и связать его с классом? Только потому, что в других языках все обстоит по другому?
1) Классы по сути своей реюзабильны, тоесть при переносе классов из одного проекта в другой, нужно убедиться что все нужные пустые мувики существуют(а не нужных нету).
2) Чтобы не зависеть от FLA файла, и легко переходить на MTASC например(который компилирует раз в 50 быстрее флэша).

wvxvw 01.11.2007 15:44

Цитата:

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

А вот потому что я теперь ведущий (ну и замыкающий по совместительству) специалист =) И должен очень часто заниматься тем, что правлю чужие, а еще хуже доделываю/переделываю чьи-то творения перед тем, как их куда-то вывесить. И если заказов достаточно и работать не хочется (ну прям как сейчас, например %). То человека, который принесет мне ФЛА с парой-тройкой сотен лайбрари-айтемов, из которых несколько десятков экспортируются с привязкой к классу, и скажет, что у него что-то не работает... я просто элементарно откажусь этим заниматься - пусть идет и сам мучается с тем, что натворил. В больших проэктах этот способ не просто не удобный, он меганеудобный.

ЗЫ. Я тут ничего такого особенного не писал... какой-такой "мой" способ создания клипов? =)

Ostgur 01.11.2007 16:10

а чем принципиально отличается класс от функции? нелегче написать кучу функций и также импортировать их?

CrazyFlasher 01.11.2007 16:12

Цитата:

а чем принципиально отличается класс от функции? нелегче написать кучу функций и также импортировать их?
так многие утверждают, которые не хотят переходить на классы по тем или иным причинам...сам проходил через это...поверьте, не легче

D12 01.11.2007 19:50

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

Класс который рисует звёздочку:
Код:

class Star {
        static function _create(Obj:Object):MovieClip {
                //
                var Width_Stage:Number = 550;
                var Height_Stage:Number = 400;
                var COLOR_BOX:Array = [0x9999CC, 0x00CCFF, 0x66CCFF, 0xFF99CF, 0x0033CC];
                //
                var char:MovieClip = Obj.targ.createEmptyMovieClip("box", Obj.targ.getNextHighestDepth());
                char.beginFill(COLOR_BOX[int(Math.random()*(COLOR_BOX.length-1))]);
                char.moveTo(-5, -1);
                char.lineTo(-5, -1);
                char.lineTo(5, -1);
                char.lineTo(5, 1);
                char.lineTo(-5, 1);
                char.endFill();
                char._x=Width_Stage/2, char._y=Height_Stage/2;
                return char;
        }
}

Класс который приводит её в движение:
Код:

class Go {
        static function _move(mc:MovieClip):Void {
                //
                var go:Number = 5+int(Math.random()*18);
                var alf:Number = int(Math.random()*10);
                var rad:Number = Math.PI/180;
                var Rotation:Number = int(Math.random()*360);
                //
                mc.onEnterFrame = function():Void  {
                        this._x += Math.cos(Rotation*rad)*go;
                        this._y += Math.sin(Rotation*rad)*go;
                        this._rotation = Rotation;
                };
        }
        static function _stop(mc:MovieClip):Void {
                delete mc.onEnterFrame;
        }
}

Файл fr_star.as где следующий код:
Код:

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

Ну и на самой сцене в первом кадре:
Код:

#include "fr_star.as"
Эх... Для начала хотелось спросить, каким образом нужно правильно создовать переменные внутрение и общие :(
Можно ли создать класс "Go" таким что бы он работал для всех мувиклипов для которых его назначили независимо от их имён в нём самом:
что так работало:
Код:

Go._move(_mc1);
Go._move(_mc2);
Go._move(_mc3);

если нет то какие есть альтернативы?

Жуть а ведь говорили мне не лезь :wacko:
Но всё же увы отступать нельзя:umnik2:

Nirth 01.11.2007 20:31

Ужоснах

wvxvw 02.11.2007 00:23

Nirth:
Ну, млин. Человек что-то сделал, и это даже работает =)

D12:
Смотри... я как бы не думал, что ты будешь это копировать... Сорь, наверное не стоило меня слушать. Но я все равно попробую обьяснить =)

Создавать статические функции для твоей задачи - не лучшее решение. Ну, как бы это точно имеет мало общего с ООП. А вообще, лучше я напишу, как бы я это сделал, мб так будет понятнее, и проще обьяснить.
Код:

import mx.transitions.Tween;
import mx.transitions.easing.*;
//
class Star {
        private var __base:MovieClip;
        private var __gfx:MovieClip;
        private var __tw:Tween;
        private static var __count:Number = 0;
        function Star(mc:MovieClip){
                __base = mc;
                __draw();
                __count++;
        }
        //------- private ---------//
        private function __draw():Void {
                __tw.stop();
                __gfx.removeMovieClip();
                __gfx = __base.createEmptyMovieClip("__gfx",__base.getNextHighestDepth());
                __gfx.beginFill(0,100);
                __gfx.moveTo(0,0);
                __gfx.lineTo(100,0);
                __gfx.lineTo(100,100);
                __gfx.lineTo(0,100);
                __gfx.lineTo(0,0);
                __gfx.endFill();
        }
        //------- public -------------//
        public function __move(from:Number,to:Number,sec:Number):Void {
                __tw = new Tween(__gfx,"_x",Elastic.easeOut,from,to,sec,true);
        }
        public function __stop():Void {
                __tw.stop();
        }
        //------------ get/set -------//
        public function set x(n:Number):Void {
                __gfx._x = n;
        }
        public function get x():Number {
                return __gfx._x;
        }
        public function set y(n:Number):Void {
                __gfx._y = n;
        }
        public function get y():Number {
                return __gfx._y;
        }
        public function set w(n:Number):Void {
                __gfx._width = n;
        }
        public function get w():Number {
                return __gfx._width;
        }
        public function set h(n:Number):Void {
                __gfx._height = n;
        }
        public function get h():Number {
                return __gfx._height;
        }
        //-------- debugger --------//
        public function toString():String {
                return "[Star"+__count+"]";
        }
}

Код:

var s:Star = new Star(this);
s.__move(10,300,10);
trace(s);

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

Nirth 02.11.2007 00:47

Цитата:

Ну, млин. Человек что-то сделал, и это даже работает =)
Да не, у меня к нему притензий нету=) и я с тобой полностью согласен=)
Цитата:

Смотри... я как бы не думал, что ты будешь это копировать... Сорь, наверное не стоило меня слушать.
Блин был бы топик о АС3 я бы объяснил, а так даже редактора ас2 нету=)

CrazyFlasher 02.11.2007 00:59

всмысле нету? а flash develop? или ты не о том?

Nirth 02.11.2007 01:07

Цитата:

всмысле нету? а flash develop? или ты не о том?
У меня нету, и мне лень устанавливать.

CrazyFlasher 02.11.2007 01:43

так а чё там устанавливать...скачать да и всё...очень удобная штука
www.flashdevelop.org

Nirth 02.11.2007 02:52

CrazyFlasher я знаю, только она не идет под Mac OS X =)
Под Mac OS X есть редакторы AS2 но при всем моем уважении к d12 мне лень их скачивать, открывать сайты и тд =)

terbooter 02.11.2007 08:41

Цитата:

Сообщение от CrazyFlasher
так а чё там устанавливать...скачать да и всё...очень удобная штука
www.flashdevelop.org

Ага а потом скачать и установить NET 2.0 и JRE 1.6 -)

Если не сложно поделитесь опытом как его использовать
(ссылками ). А то мне пока флешевое окошко скриптов роднее всего -)))

to wvxvw, про UIObject не нашел такого в хелпе, это же вроде базовый класс для стандартных компонентов?

etc 02.11.2007 10:33

FDT рулит и педалит :D

terbooter 02.11.2007 12:07

Наверно, только 300$ нету

wvxvw 02.11.2007 13:53

Цитата:

Сообщение от terbooter
to wvxvw, про UIObject не нашел такого в хелпе, это же вроде базовый класс для стандартных компонентов?

Странно, вроде был... да, типа того. Ну, если считать стандартные = v.2 то базовый класс - это UIComponent, который наследуется от UIObject, который в свою очередь наследуется от MovieClip. Но это не мешает свои компоненты наследовать напрямую от MovieClip'а =) Вобщем-то, по большому счету, этот класс - не самая удачная попытка ММ "заставить" АС соответствовать требованиям ООП. (Несоответсвие заключалось в том, что нельзя создать клип с помощью оператора new).
Моя точка зрения по этому поводу отличается, от Nirth'а, например, в том, что я считаю этот класс избыточной структурой =) Но, ничего не поделаешь, програмирование в целом на любом языке стремится к определенной унификации и одинаковой логике, при этом часто жертвуя производительностью.

D12 02.11.2007 19:00

Wvxvw спасибо за пример =)
Но мне бы хотелось делать по принцмпу разделяй и властвуй :)

D12 03.11.2007 00:03

Импорт классов, броня крепка но танки наши быстры=)
 
Урррааа:yahoo: Заработало :victory:

Так класс звезда :
Код:

class Star {
        public static var Width_Stage:Number = 550;
        public static var Height_Stage:Number = 400;
        private static var COLOR_BOX:Array = [0x9999CC, 0x00CCFF, 0x66CCFF, 0xFF99CF, 0x0033CC];
        //
        static function _create(Obj:Object):MovieClip {
                var char:MovieClip = Obj.targ.createEmptyMovieClip("box", Obj.targ.getNextHighestDepth());
                char.beginFill(COLOR_BOX[int(Math.random()*(COLOR_BOX.length-1))]);
                char.moveTo(-5, -1);
                char.lineTo(-5, -1);
                char.lineTo(5, -1);
                char.lineTo(5, 1);
                char.lineTo(-5, 1);
                char.endFill();
                char._x=Width_Stage/2, char._y=Height_Stage/2;
                return char;
        }
}

Класс дающий движение :
Код:

class Go {
        public static var rad:Number = Math.PI/180;
        //
        private static var go:Number = 5+int(Math.random()*18);
        private static var alf:Number = int(Math.random()*10);
        private static var Rotation:Number = int(Math.random()*360);
        //
        static function _move(mc:MovieClip):Void {
                mc.onEnterFrame = function():Void  {
                        this._x += Math.cos(Rotation*rad)*go;
                        this._y += Math.sin(Rotation*rad)*go;
                        this._rotation = Rotation;
                };
        }
        static function _stop(mc:MovieClip):Void {
                delete mc.onEnterFrame;
        }
}

И класс который импортирует в себя звезду:
Код:

import Star;
class Double {
        static function _create(Staring:Object):MovieClip {
                //
                trace("Class open");
                //
                var _mc:MovieClip = Star._create({targ:_root});
                return _mc;
        }
}

ну и на сцене:
Код:

import Double;
var _mc:MovieClip = Double._create({targ:this});
Go._move(_mc);
setTimeout(Go._stop, 12000, _mc);

Я молодец :rolleyes: но еще многое предстоит сделать =) и без вас я бы ничего несделал, спасибо


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

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