Просмотр полной версии : Пользовательский класс
jagzburn
25.03.2013, 15:39
Пытался создать свой класс кнопки, но туплю походу где-то, подскажите чтиво полезное по этому вопросу (подобного обсуждения на форуме не нашел к сожалению, гугл тоже какую то хрень показывает).
Покажите, что вы пытались создать?
Похоже вам нужно разобраться что есть ООП и как с ним быть.
Создать, в данном случае кнопку, можно разными подходами.
Например можно создать класс - где в нем будет рисоваться кнопка, например при создании объекта
на основе этого класса, а после извне добавить этот объект в список отображения.
А можно накидать в класс статических методов для отрисовки кнопки и один из методов
будет отдавать уже объект кнопки.
Но сначала разберитесь с тем, что я написал в первой строчке, без этого никак.
ZergMaster
25.03.2013, 21:43
да уж, вы бы вопрос хотя бы конкретно сформулировали)) а то класс кнопки может быть разным))
вот самый простой класс кнопки
тут класс екстендится как мувик с названием Button_in_library, который лежит непосредственно в библиотеке fla файла
package {
import flash.events.Event;
import flash.events.MouseEvent;
public class myButt extends Button_in_library {
public function myButt() {
this.useHandCursor = true;
this.buttonMode = true;
this.addEventListener(Event.ADDED_TO_STAGE, addThis);
this.addEventListener(MouseEvent.CLICK, thisHand);
this.addEventListener(MouseEvent.MOUSE_OVER, thisHand);
this.addEventListener(MouseEvent.MOUSE_OUT, thisHand);
}
private function addThis(e:Event):void {
this.gotoAndStop(1);
}
private function thisHand(e:MouseEvent):void {
if(e.type == 'click') {
trace('hello, im click');
}
if(e.type == 'mouseOver') {
trace('hello, im Over');
}
if(e.type == 'mouseOut') {
trace('hello, im Out');
}
}
}
}
ZergMaster, плохой пример.
ZergMaster, плохой пример. Чем ?
caseyryan
25.03.2013, 23:10
Чем ?
Хотя бы тем, что абсолютно не соответствует конвенциям
myButt
Чем ?
:о)) я даже не могу ничего добавить.
mikhailk
26.03.2013, 00:02
Не, ну причесать-то данный класс можно (хотя он мне и не нравится). Только все равно не понятно, что ТС-то нужно было.
package
{
import flash.events.Event;
import flash.events.MouseEvent;
public class MyButt extends Button_in_library
{
public function MyButt()
{
addEventListener(Event.ADDED_TO_STAGE, addThis);
}
private function addThis(e:Event) : void
{
removeEventListener(Event.ADDED_TO_STAGE, addThis);
gotoAndStop(1);
useHandCursor = true;
buttonMode = true;
addEventListener(MouseEvent.CLICK, thisHand, false, 0, true);
addEventListener(MouseEvent.MOUSE_OVER, thisHand, false, 0, true);
addEventListener(MouseEvent.MOUSE_OUT, thisHand, false, 0, true);
}
private function thisHand(e:MouseEvent) : void
{
switch (e.type)
{
case MouseEvent.CLICK :
trace('hello, im click');
break;
case MouseEvent.MOUSE_OVER :
trace('hello, im Over');
break;
case MouseEvent.MOUSE_OUT :
trace('hello, im Out');
break;
}
}
}
}
Кстати, мне кажется, наследоваться от класса из библиотеки - это неудобно и вообще непонятно, зачем.
наследоваться от класса из библиотеки - это неудобно и вообще непонятно, зачем. Так приходится делать для переопределения. Смотри, например у тебя все кнопки в приложении принадлежат классу SuperButton , и ты создавая их в IDE кастуешь к нему, это понятно. Однако в какой то момент, ты понимаешь, что не все кнопки одинаково себя ведут, есть 5% отщепенцев. Но их поведение такое же, как и у остальных, свойства немного разные, например цвет текста при наведении меняется. Так вот создаешь обертку с переопределенным хендлером.
Хотя бы тем, что абсолютно не соответствует конвенциям Причем тут конвенции ? ТС задал вопрос о конвенциях, или о том , как профессиональнее писать MouseEvent.CLICK или "click" ? Нет ? А пример вполне рабочий, ошибок нет, чупакаброкодерства тоже, - ну да наплевал на конвенции, бывает xD
mikhailk
26.03.2013, 00:37
Так приходится делать для переопределения. Смотри, например у тебя все кнопки в приложении принадлежат классу SuperButton , и ты создавая их в IDE кастуешь к нему, это понятно.
Мне как раз и непонятно.
Это же чертовски неудобно.
Я просто сам для себя выработал другой способ работы с кнопками, который на порядок комфортнее и мне и тем, кто собирает объекты в IDE.
ну да наплевал на конвенции, бывает xD
Для примера новичкам - это плохо.
Ну и, вообще, плохо.
caseyryan
26.03.2013, 08:18
Причем тут конвенции ? ТС задал вопрос о конвенциях, или о том , как профессиональнее писать MouseEvent.CLICK или "click" ? Нет ? А пример вполне рабочий, ошибок нет, чупакаброкодерства тоже, - ну да наплевал на конвенции, бывает xD
Если пример учит чему-то неправильному, то он уже не хороший )
п.с. Название myButt переведется скорее не как мояКнопка, а как мояЗадница ))
jagzburn
26.03.2013, 12:21
Я действительно плохо сформулировал вопрос.
У меня есть несколько кнопок на stage, для этих кнопок создается куча слушателей, которые по сути идентичны, различен только слушатель MOUSE_UP, соответственно хочется вынести остальные слушатели в отдельный файл. Проблема в том, что объявляя переменную не мувиклипом а своим классом myButt и привязке к нему гетчайлдом объекта со стейджа переменная == null.
Надеюсь понятно объяснил.
mikhailk
26.03.2013, 13:03
Не очень.
И про getChild() не понятно.
jagzburn
26.03.2013, 13:13
Не очень.
И про getChild() не понятно.
У меня есть fla файл, на котором тупо два мувиклипа с именами "_button1" и "_button2".
В этих мувиклипах по три кадра(1 состояние покоя, 2 наведено, 3 нажато).
Я хочу вынести слушатели на OVER и OUT для этих кнопок в другой as файл отличный от базового класса т.к. иначе это получается тупое копирование.
public class Main extends MovieClip
{
public var but1:MovieClip = new MovieClip;
public var but2:MovieClip = new MovieClip;
public function Main():void {
// ** Присвоение переменным объектов со Stage'a
but1 = getChildByName("_button1") as MovieClip;
but2 = getChildByName("_button2") as MovieClip;
// ** Проверка переменных на null
if (but1 != null) {
but1.stop();
but1.addEventListener(MouseEvent.MOUSE_OUT, but1mout);
but1.addEventListener(MouseEvent.MOUSE_OVER, but1mover);
but1.addEventListener(MouseEvent.MOUSE_DOWN, but1mdown);
but1.addEventListener(MouseEvent.MOUSE_UP, but1mup);
trace("but1 != null");
}
else {
trace("but1 == null");
}
if (but2 != null) {
but2.stop();
but2.addEventListener(MouseEvent.MOUSE_OUT, but2mout);
but2.addEventListener(MouseEvent.MOUSE_OVER, but2mover);
but2.addEventListener(MouseEvent.MOUSE_DOWN, but2mdown);
but2.addEventListener(MouseEvent.MOUSE_UP, but2mup);
trace("but2 != null");
}
else {
trace("but2 == null");
}
}
public function but1mout (e:MouseEvent) {
but1.gotoAndStop(1);
}
public function but1mover (e:MouseEvent) {
but1.gotoAndStop(2);
}
public function but1mdown (e:MouseEvent) {
but1.gotoAndStop(3);
but1.y += 1;
}
public function but1mup (e:MouseEvent) {
but1.gotoAndStop(2);
but1.y -= 1;
}
public function but2mout (e:MouseEvent) {
but2.gotoAndStop(1);
}
public function but2mover (e:MouseEvent) {
but2.gotoAndStop(2);
}
public function but2mdown (e:MouseEvent) {
but2.gotoAndStop(3);
}
public function but2mup (e:MouseEvent) {
but2.gotoAndStop(2);
}
}
mikhailk
26.03.2013, 13:40
Ну вот, как вариант (сейчас его тут раскритикуют, но он вполне себе рабочий):
public class ControlButtonSimple extends EventDispatcher
{
public static const BUTTON_PRESSED:String = "buttonPressed";
private var buttonMC:MovieClip;
public function ControlButtonSimple(buttonMC:MovieClip)
{
if (!buttonMC) return;
this.buttonMC = buttonMC;
buttonMC.mouseChildren = false;
buttonMC.gotoAndStop(1);
setListeners();
}
private function setListeners() : void
{
buttonMC.addEventListener(MouseEvent.ROLL_OVER, onMouseOver, false, 0, true);
buttonMC.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut, false, 0, true);
buttonMC.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
}
private function onMouseOver(e:MouseEvent) : void
{
buttonMC.gotoAndStop(2);
}
private function onMouseOut(e:MouseEvent) : void
{
buttonMC.gotoAndStop(1);
}
private function onMouseDown(e:MouseEvent) : void
{
buttonMC.gotoAndStop(3);
dispatchEvent(new Event(BUTTON_PRESSED));
}
}
Соответственно, использование такое:
var ctrlBtn1:ControlButtonSimple = new ControlButtonSimple(getChildByName("_button1") as MovieClip);
ctrlBtn1.addEventListener(ControlButtonSimple.BUTTON_PRESSED, onButtonPressed, false, 0, true);
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.