Форум 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)
-   -   Помогите с написанием первого класса, плиз..)) (http://www.flasher.ru/forum/showthread.php?t=112776)

orcpochta 07.06.2008 13:49

Помогите с написанием первого класса, плиз..))
 
Захотел написать свой первый класс гибко-настраиваемых всплывающих подсказок. Посмотрел, классы Hint, которые выкладывали здесь и на silin.fatal.ru - не смог разобраться и порвал себе мозг.
Моя идея - следующая:
в конструктор класса передается объект с настройками (если какие-то настройки не определены в объекте, то используются стандартные), а дальше я столкнулся с трудностями, когда попытался описать в классе функцию, создающую муви-клип, в котором создается текстовое поле.

пока есть только это для пары настроек (остальные будут добавляться по-ходу - сейчас не в них суть):
Код:

class Hint {
        function Hint(oParams:Object) {               
                for(var sKey:String in oParams) {
                        switch (sKey) {
                                case "text":
                                        if (typeof(oParams[sKey]) != "string") {
                                                trace('Error value of "text"-parameter in Hint Data-Object!');
                                                break;
                                        }
                                        text = oParams[sKey];
                                        break;
                                case "textColor":
                                        if (typeof(oParams[sKey]) != "number") {
                                                trace('Error value of "textColor"-parameter in Hint Data-Object!');
                                                break;
                                        }
                                        textColor = oParams[sKey];
                                        break;
                        }
                }
        }
       
        private var _text:String = "text not input";
        public function get text():String {
                return _text;
        }
        public function set text(sText:String):Void {
                _text = sText;
        }
       
        private var _textColor:Number = 0;
        public function get textColor():Number {
                return _textColor;
        }
        public function set textColor(nTextColor:Number):Void {
                _textColor = nTextColor;
        }       
}

P.S. Ох! Жестко при копи-пасте табуляторы растянулись.

Wolsh 07.06.2008 14:19

orcpochta, не нашел, где ты
Цитата:

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

orcpochta 07.06.2008 14:24

трудность, что я просто не смог создать ни одного муви-клипа или текст-филда, потому, как не знаю, как сделать это из класса (не знаю как по другому объяснить)

Alex_beginner 07.06.2008 14:50

orcpochta!

Цитата:

когда попытался описать в классе функцию, создающую муви-клип, в котором создается текстовое поле.
Покажите где реализована функция, создающая мувиклип? Если ее нет в представленном выше коде (а ее нет), то выложите.

Wolsh 07.06.2008 15:05

Показывать хинты ты будешь при наведении мыши на какой-то объект, то есть по событию онРоллОвер. Следовательно, в обработчике этого события для тех объектов, которые ты прокомментировал, должен вызываться метод, показывающий хинт.
Следовательно, тебе нужно создать в классе этот метод, public function buildhint() к примеру. В этом методе ты создаешь пустой мувиклип с тестфилдом выше всех (а можно и просто текстфилд с бэкграундом), задаешь ему формат (его лучше заготовить заранее и сохранить как свойство класса, ну или обеспечить его "скинабельность"), и тут самое интересное - пишешь в нем текст. Чтобы знать, что писать, тебе надо чтобы метод получил ссылку на вызвавший его объект - или, как вариант, прямой текст хинта прямо от обработчика онРоллОвер, что значительно проще. Ну и на онРоллАут ты вызываешь метод closeHint(), который этот хинт удаляет.

Мне кажется так юзабельнее. Один экземпляр и методы для управления созданием/удалением хинтов на сцене.
При создании экземпляра НЕ ЗАДАВАТЬ ему текст, а задавать только скин - цвета и размеры текста и фона. А текст передавать из обработчика наведения мыши на объект.
У тебя же получается что в обработчике создается объект со скином и текстом, потом создается экземпляр класса Хинт, и если я правильно понял, при создании экземпляра, прямо из конструктора, ты хочешь создавать на сцене текстфилд. Мне такой подход кажется неудобным, но тут может дело вкуса)))

Волгоградец 07.06.2008 16:15

Создать клип и текстфилд - легко - почти также как если бы писал на таймлайне
Код:

private function createMovieAndText ():Void{
  clip = _mc.createEmptyMovieClip ("hint", _mc.getNextHighestDepth());
  txt = clip.createTextField("hintTxt", 1, 0, 0, 300, 100);
}

В теле класса нужно объявить переменные clip и txt:
Код:

private var _mc:MovieClip;
private var clip:MovieClip;
private var txt:TextField;

Переменную _mc надо либо в конструктор передавать, либо назначить в конструкторе

orcpochta 07.06.2008 16:27

Что-то стало получаться! видимо, ночью намудрил с адресацией.

Код:

class Hint {
        function Hint(oParams:Object) {               
                setParams(oParams);
        }
       
        private function setParams(oParams:Object):Void {
                for(var sKey:String in oParams) {
                        switch (sKey) {
                                case "text":
                                        if (typeof(oParams[sKey]) != "string") {
                                                trace('Error value of "text"-parameter in Hint Data-Object!');
                                                break;
                                        }
                                        text = oParams[sKey];
                                        break;
                                case "textColor":
                                        if (typeof(oParams[sKey]) != "number") {
                                                trace('Error value of "textColor"-parameter in Hint Data-Object!');
                                                break;
                                        }
                                        textColor = oParams[sKey];
                                        break;
                        }
                }
        }
       
        private var _text:String = "text not input";
        public function get text():String {
                return _text;
        }
        public function set text(sText:String):Void {
                _text = sText;
        }
       
        private var _textColor:Number = 0;
        public function get textColor():Number {
                return _textColor;
        }
        public function set textColor(nTextColor:Number):Void {
                _textColor = nTextColor;
        }       
       
        public function makeHint(oParams):Void {               
                setParams(oParams);
                _root.createTextField("tHintField", _root.getNextHighestDepth(), _xmouse, _ymouse, 0, 0);
                var tLink:TextField = _root.tHintField;
                tLink.selectable = false;
                tLink.background = true;
                tLink.backgroundColor = 0xFFFF99;
                tLink.autoSize = true;
                tLink.text = text;
                tLink.textColor = textColor;
                tLink.moveHint = function():Void {
                        tLink._x = _xmouse - tLink._width;
                        tLink._y = _ymouse - tLink._height;
                        updateAfterEvent();
                };
                tLink.nInterval = setInterval(tLink, "moveHint", 10);
        }
       
        public function delHint():Void {               
                clearInterval(_root.tHintField.nInterval);
                _root.tHintField.removeTextField();               
        }
       
}


Wolsh 07.06.2008 16:30

Ну вот так работает вариант с созданием текстфилда в конструкторе)))
Код:

class Hint {
   
    private var hint_txt:TextField;
    private var text:String = "text not input";
    private var textColor:Number = 0;
   
   
    public function Hint(oParams:Object) {       
        for(var sKey:String in oParams) {
            switch (sKey) {
                case "text":
                    if (typeof(oParams[sKey]) != "string") {
                        trace('Error value of "text"-parameter in Hint Data-Object!');
                        break;
                    }
                    text = oParams[sKey];
                    break;
                case "textColor":
                    if (typeof(oParams[sKey]) != "number") {
                        trace('Error value of "textColor"-parameter in Hint Data-Object!');
                        break;
                    }
                    textColor = oParams[sKey];
                    break;
            }
        }
       
        hint_txt = _root.createTextField("hint_txt",_root.getNextHighestDepth(),_xmouse+5,_ymouse+5,200,50);
        hint_txt.autoSize = true;
        hint_txt.border = true;
        hint_txt.borderColor = 0x000000;
        hint_txt.background = true;
        hint_txt.backgroundColor = 0xffffdd;
        hint_txt.text = text;
        hint_txt.textColor = textColor;
       
       
    }
   
    public function removeHint():Void {
        hint_txt.removeTextField();
    }
   
    public function get _text():String {
        return hint_txt.text;
    }
    public function set _text(sText:String):Void {
        hint_txt.text = sText;
    }
   
    public function get _textColor():Number {
        return hint_txt.textColor;
    }
    public function set _textColor(nTextColor:Number):Void {
        hint_txt.textColor = nTextColor;
    }   
   
    public function set _backColor(bColor:Number):Void {
        hint_txt.backgroundColor = bColor;
    }
   
    public function get _backColor():Number {
        return hint_txt.backgroundColor;
    }
   
}

Обратите внимание, что созданный в обработчике онРоллОвер экземпляр класса Хинт не будет виден из обработчика онРоллАут)))) Приходится сохранять ссылку на него в руте или объекте, который коментируем. Неудобно.
Код во фла:
Код:

my_mc.onRollOver = function () {
    var myHint:Object = {text:"Понятия не имею,\rчто это такое", textColor:0x000000}
    var hintik:Hint = new Hint(myHint);
    hintik._text="Кажется, я знаю что это!"
    this.hintik = hintik;
}
my_mc.onPress = function  () {
    this.hintik._textColor = 0xffffff
    this.hintik._backColor = 0x000000
}

my_mc.onRollOut = function () {
    this.hintik.removeHint()
}


orcpochta 07.06.2008 16:35

Всем спасибо за неоценимую помощь!!! :)


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

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