PDA

Просмотр полной версии : Помогите с написанием первого класса, плиз..))


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
Всем спасибо за неоценимую помощь!!! :)