PDA

Просмотр полной версии : Как правильно связать символ с классом AS?


Praetorian
15.11.2009, 23:11
День добрый. Поискал по форуму но не нашел ответ на свой вопрос:
Ситуация следующая: есть символ типа кнопка, в нем текстовое поле с заданным идентификатором.
Задача в том, что текст в поле должен меняться динамически.
Как получить доступ к нему? я пробовал связать кнопку с классом на as, но чтобы я не делал, вылезает ошибка, что класс не найден и будет сгенерирован, что мне совершенно не подходит.

в мануале от adobe не нашел возможных причин того, почему класс не находится.
файл с классом лежит в той же директории, что и fla, включен в проект.
код файлика:

package
{
public class textButton extends flash.display.SimpleButton
{
}
}

laliqui
15.11.2009, 23:38
package
{
//импортировать расширяюший класс
import flash.display.SimpleButton
//классы называть с большой буквы, расширяющего класса - просто имя
public class TextButton extends SimpleButton
{
//метод-конструктор класса, вызывается автоматически
public function TextButton() {
//в вашей кнопке текстовое поле textField
textField.text = "Просто текст"
}
}
}

и не забыть в самой кнопке прописать этот класс в linkage как TextButton

Praetorian
16.11.2009, 20:30
Ок. Спасибо:)
Проблема все равно оставалась, но разрешилась, когда я заново создал файл и заново написал в нем код...
Вроде как класс он нашел.
Но, когда в диалоге linkage я нажимаю зеленую галочку "подтвердить описание класса",
выдается сообщение: определение класса не найдено в файле "C:\....\TextButton.as"
Имя файла относительно .fla main\TextButton.as
package main
{
import flash.display.SimpleButton;
public class TextButton extends flash.display.SimpleButton
{
public function TextButton()
{
//txtClub.text = "asdasd";
}
}
}

В linkage он прописан как main.TextButton.
Подскажите, что еще я не так сделал?:))
и кстати, видимо по этой же причине (что flash не смог связать символ с объектом)
при раскомментаривании закомментаренной строчки, при запуске компилятор ругается, что поле не объявлено - хотя в символе оно есть, и именно с таким ид.

Psycho Tiger
16.11.2009, 20:33
getChildByName

laliqui
16.11.2009, 20:39
Пакет можно и не обзывать, а то тогда он обязан у вас лежать в папке майн, как-то так...

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

import flash.text.TextField;

лучше всего, чтобы не было путаницы, создать папку Classes и туда складывать свои классы, а в свойствах документа (ActionScript3.0->Settings) прописать classpath путь к этой папке: ./Classes
пакеты тогда обзывать не нужно

Praetorian
16.11.2009, 20:39
небольшой апдейт: переписал код как
package main
{
import flash.display.SimpleButton;
dynamic public class TextButton extends SimpleButton
{
public function TextButton()
{
this.txtClub.text = "asdasd";
}
}
}
теперь компилируется но во время выполнения выдает следующее:
ypeError: Error #1010: A term is undefined and has no properties.
at main::TextButton$iinit()[D:\..\main\TextButton.as:8]
at flash.display::Sprite/flash.display:Sprite::constructChildren()

Добавлено через 17 минут
Пакет можно и не обзывать, а то тогда он обязан у вас лежать в папке майн, как-то так...

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

import flash.text.TextField;

лучше всего, чтобы не было путаницы, создать папку Classes и туда складывать свои классы, а в свойствах документа (ActionScript3.0->Settings) прописать classpath путь к этой папке: ./Classes
пакеты тогда обзывать не нужно

Сделал. Спасибо за ценный совет:) но ошибка не исчезла. варианты:
1) если написано
txtClub.text = "";
Ругается на Undefined Property
2) this.txtClub.text = "";
Падает, потому что найти не может
3) this.getChildByName("txtClub") выдает ошибку времени выполнения:
Error #1006: getChildByName is not a function.

wvxvw
16.11.2009, 21:00
Отключтиь автоматическое объявление переменных для объектов добаленных на таймлайн - в настройках побликации.
Самому объявить нужную переменную (она должна быть public var с таким же именем, как и то, что вы прописали в instance name).

Praetorian
16.11.2009, 21:00
кстати, txtClub - это просто динамический текст внутри символа "TextButton"

wvxvw
16.11.2009, 21:04
>> выдает ошибку времени выполнения:
Error #1006: getChildByName is not a function.

Ох, не обратил внимаия... SimpleButton не является DisplayObjectContainer поэтому этого метода у нее нет.
Кроме того, доступа к таймлайну SimpleButton из AS3 нету, вы можете только оперировать стейтами. T.e. скорее всего ваше текстовое поле добавлено к одному из стейтов - трейсите, смотрите, куда вы его добавили :)

Alex Lexcuk
16.11.2009, 21:08
Зацените исходники с xml menu на simplebutton как нахождение TextFiled в simplebutton и изменение их
http://www.murmadillo.tut.su/html/xml_menu.swf
http://www.murmadillo.tut.su/html/XML_MENU.rar
http://www.murmadillo.tut.su/html/menu-SimpleButton-href.xml

и тутор небольшой то-же самое делает
http://www.murmadillo.tut.su/html/menu-SimpleButton-href.html
должен изменит текст если он на уровне 1 в кнопке, те. над чем-то одном нарисованном

private function changeLabel(sim:SimpleButton,_str:String):void{
((sim.upState as DisplayObjectContainer).getChildAt(1) as TextField).text = _str;
((sim.downState as DisplayObjectContainer).getChildAt(1) as TextField).text = _str;
((sim.overState as DisplayObjectContainer).getChildAt(1) as TextField).text = _str;
}

Praetorian
16.11.2009, 21:25
За примеры спасибо!
Наверное надо было сразу сказать, что у меня в символе кроме текстового поля пока ничего и нет..
собственно, сам пример не работал в моем случае.
Но, слегка празмыслив, я его немного изменил:

public function TextButton()
{
var mystate:TextField = this.upState as TextField;
mystate.text = "asdddd";
}
И все заработало:) Всем большое спасибо!