Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сделать собственную кнопку (http://www.flasher.ru/forum/showthread.php?t=171265)

noobuser 12.11.2011 19:14

Сделать собственную кнопку
 
Чёрт, я весь на нервах. Замучали глупые непонятные нелогичные ошибки в этом проклятом AS3! Я нарисовал собственную кнопку, расширение SimpleButton. Задача до боли простая, нужно реализовать кроме самой картинки кнопки, надпись на ней по типу стандартного button.label="тралала"; Я пытаюсь это решить вставив в свой объект кнопки поверх картинки обычный textField, и потом с помощью собственного метода менять свойство text. и естесственно нихрена не получается!
Код AS3:

package  {
        import flash.display.SimpleButton;
        import flash.events.Event;
 
        public class btn extends SimpleButton {
                public var txt:String;
 
                public function btn() {
                        /*if (lbl) {
                                init(s);
                                } else this.addEventListener(Event.ADDED_TO_STAGE,init) */

                }
 
                public function setLabel(s:String){
                        lbl.text=s;
                        lbl2.text=s;
                        lbl3.text=s;
                }
 
                /*function init(s:String):void {
                        lbl.text=s;
                        lbl2.text=s;
                        lbl3.text=s;
                }*/

        }//end class
}

lbl, lbl2, lbl3 - это объекты textField на моей кнопке
тут некоторое закоментировано, это я уже испробовал 10001 способ, которые все не дали никакого результата. сами кнопки я руками размещаю на сцене, задача - просто сделать надпись на них. Поначалу вообще чтото непонятное творилось, я вписывал в textField кнопки какой то текст, а при запуске программы кнопка была пустая(без текста), сам не понял что я сделал, но когда в классе кнопки я написал пару методов, стандартный текст начал появляться при запуске, но изменить его никакими способами не получается. Может есть какой то более простой способ сделать надпись на моей кнопке? но желательно конечно сделать так, как я задумал, но ПОЧЕМУ не получается то ?

strangedk 12.11.2011 19:20

а что покажет trace(lbl);

у вас же эти TextField находятся как я понял, в разных кадрах?
вот он и будет null, вероятнее всего

Их нужно именно три штуки? или достаточно одного?

Bgg 12.11.2011 19:21

Выкиньте SimpleButton в мусорку. Наследуйте свою кнопку от Sprite.

noobuser 12.11.2011 19:29

да, они находятся в разных кадрах. lbl - в кадре UP, lbl2 - OVER, lbl3 - DOWN. Не обязательно 3 штуки. Просто в каждом кадре у этих текстовых полей разные стили и координаты. я иду по пути наименьшего сопротивления и что бы минимизировать кол-во строк кода максимум делаю на сцене. т.е. я не хочу писать лишних 20 строк что бы задавать стили для текста на кнопке для всех положений кнопки. поэтому я создать заранее 3 поля с разными стилями, задача просто поменять текст в этих полях. И поэтому я пока что хочу сделать всё при помощь SimpleButton а не Sprite, что бы было минимум кода. использование MovieClip и Sprite это уже самый последний безвыходный вариант.

strangedk 12.11.2011 19:33

Вы мне, а в результате и себе - так и не ответили:
Цитата:

а что покажет trace(lbl);
Из-за того что они в разных кадрах, они не могут быть инициализированы когда нужно.

пробуйте так:

[IMG]http://i28.***********/big/2011/1112/ed/37b28f0b984fe226089de0f79441eeed.png[/IMG]

Добавлено через 3 минуты
Если вам и так не устроит, тогда Bgg дело говорит, Sprite будет получше.

noobuser 12.11.2011 19:41

да, trace(lbl) выдаёт null. но в тоже время я не понимаю почему не работает эта конструкция
Код AS3:

if (lbl) { 
init(s);
} else this.addEventListener(Event.ADDED_TO_STAGE,init)

которая по идее должна дожидаться инициализации

strangedk 12.11.2011 19:42

Потому что иницализации не будет.

это кадры. А кадры зло.

Какой результат, если сделать текст одним кадром. Как на картинке выше?

noobuser 12.11.2011 19:49

теперь он ругается Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

strangedk 12.11.2011 19:55

а я надеюсь имя instance вы указали?

вообще, снова же. Разбираемся в догадках. Дайте код, там и посмотрим.

noobuser 12.11.2011 19:58

да, указал.
Код AS3:

package  {
 
        import flash.display.SimpleButton;
        import flash.events.Event;
 
 
        public class btn extends SimpleButton {
 
                public function btn() {
 
                }
 
                public function setLabel(s:String){
                        if (lbl) {
                                trace("существует");
                                init(s);
                                } else {
                                        trace("не сщуствует");
                                        this.addEventListener(Event.ADDED_TO_STAGE,init)
                                }
                }
 
                function init(s:String):void {
                        lbl.text=s;
                }
 
        }//end class
 
}

терзают сомнения по поводу this.addEventListener(Event.ADDED_TO_STAGE,init) тут не указывается аргумент функции. Как передать аргумент в данном случае?

strangedk 12.11.2011 20:03

омг, а я только и заметил, это что за ересь, откуда тут String ? ))

init (event:Event)

как вы собираетесь передавать параметр? и зачем? укажите для начала просто text="text";

noobuser 12.11.2011 20:12

*бьюсь головой об стол*
Код AS3:

function init(e:Event=null):void {
                        lbl.text="РАБОТАЙ!";
                }

по прежнему текст не изменяется. по прежнему 1009 ошибка. А параметр передать нужно что бы установить на кнопку необходимый текст.

Добавлено через 7 минут
на счёт параметра ладно, я думаю это через глобальную переменную можно сделать ничего не передавая. Но что с текстом =( сплошные глупые ошибки начались.

strangedk 12.11.2011 20:34

делайте через Sprite.

ON_MOUSE_OVER, ON_MOUSE_OUT и ON_MOUSE_DOWN вам в помощь

Добавлено через 10 минут
в SimpleButton много заморочек. Используйте обычный Sprite.

И по времени у вас, я чувствую, быстрее получится.

noobuser 12.11.2011 20:52

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

Добавлено через 15 минут
Да у меня походу всё наоборот. с SimpleButton уже делал, и всё отлично получалось за 2 минуты (там кнопки без текста были). А со спрайтом ниразу дела не имел, и понятия не имею как с его помощью сделать кнопку. я не могу представить как работать с графикой, не видя её. когда я чтото создаю на сцене, я это вижу, могу пощупать и могу делать с ним что угодно. а элементарно сделать какой то спрайт и запихнуть в него 3 картинки+текст... я понятия не имею как это сделать и гугл нифига не помогает. Ничего подобного найти не омгу.. бред какой то.. жутко взбешон что какая то кнопка у меня отняла ЦЕЛЫЙ день и результата 0

strangedk 12.11.2011 21:14

Растровые изображения можно подгружать Loader'ом, или в вашем случае лучше даже брать из библиотеки, при помощи Linkage

noobuser 12.11.2011 21:22

Спасибо за советы и подсказки. Завтра буду разбираться. Сегодня уже слишком взбешён на этот мир, пойду что-нибудь разобью! Будь проклят тот день когда я связался с этим недоязыком AS3

Добавлено через 3 минуты
и кстати, я правильно понял что этот Sprite выаолняет роль как бы контейнера, в который я буду тупо помещать теже самые мувиклипы с моими изображениями ?

Alex Lexcuk 12.11.2011 21:30

Посмотрите пример небольшой с надписями на кнопках
http://www.murmadillo.tut.su/html/me...tton-href.html

strangedk 12.11.2011 21:30

Вы просто не умеете его готовить

Да, Sprite может выступать как контейнером для других DisplayObject (Sprite, Shape, MovieClip, Loader), так и содержать собственную графику в свойстве graphics

expl 12.11.2011 22:09

Цитата:

Сообщение от Bgg (Сообщение 1045534)
Выкиньте SimpleButton в мусорку. Наследуйте свою кнопку от Sprite.

Я бы так категорично от неё не отказывался, все-таки очень надежное поведение при наведении-убирании/кликах мыши, не требующее задействования stage (политика безопасности может не позволить его использовать)

Да и в AS3 поведение кнопки более гуманоидное, чем было в AS2/AS1

strangedk 12.11.2011 22:17

За то минусы в доступе к instance, видите вон как человек голову ломал))

Простите, а зачем использовать stage?

Ookami 12.11.2011 22:30

Цитата:

Будь проклят тот день когда я связался с этим недоязыком AS3
Свяжитесь с 1С - полюбите АС3 за его логичность и удобство )

GBee 12.11.2011 22:31

Да у симплбаттона по большому счету один минус, он не контейнер.

Newred 12.11.2011 22:40

Код AS3:

extends SimpleButton

заменить на
Код AS3:

extends MovieClip


noobuser 12.11.2011 22:51

Цитата:

Сообщение от Ookami (Сообщение 1045582)
Свяжитесь с 1С - полюбите АС3 за его логичность и удобство )

Это пожалуй моё первое правило жизни - никогда и ни за что не буду связываться с 1С. Однажды пришлось увидеть сие "чудо" и зарёкся ни за что в жизни даже не смотреть в её сторону. Наверное поэтому сейчас проблемы с работой. У нас в городе 80% вакансий это 1С.

Добавлено через 4 минуты
Цитата:

Сообщение от Newred (Сообщение 1045588)
Код AS3:

extends SimpleButton

заменить на
Код AS3:

extends MovieClip


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

Ookami 12.11.2011 22:56

оффтоп пошел =)
А вообще я с эской 7 лет работал, 3 последних года с нее слезть пытался - не давали. Вот свершилось чудо наконец и занялся АС3 - ну прям счастье.

-De- 12.11.2011 23:04

Alex Lexcuk, в примере реально блондинистый код %)
AS3 - хороший язык, если следовать принципам "в кадрах кода нет, кадры используются только для анимаций и встроенного загрузчика". У меня кнопка от спрайта унаследована, если что. Up, Over, Down - спрайты, им выставляется visible когда надо.

noobuser 12.11.2011 23:19

-De- вот, чото более конкретное, это очень помогает для восприятия общей картины. Но как я уже в 3й раз повторюсь, я не могу понять наверное что такое спрайт. т.е. Up, Over, Down - спрайты я не опнимаю этой фразы. Я представляю спрайт как объект, в который можно зашить что-то (например растровое изображение) и потом им как то манипулровать. Но у спрайта нет никаких свойств которые позволили бы указать в качестве источника моё изображение. я привык к записям типа sprite.source="pic.png", у спрайта этого нет, и это сбивает меня с толку, отсюда всё непонимание. graphics не в счёт, в нём можно только программно рисовать примитивы как я понял. И как мне объясняли выше в итоге что бы засунуть в спрайт свою картинку, мне нужно создавать отдельный мувиклип в который засовывать картинку, а мувиклип в свою очередь засовывать в спрайт. т.е. только так. если я всё правильно понимаю и это так называемый простой способ то для меня это просто вынос мозга. я вообще тогда не понимаю смысла спрайта если в итоге всё равно используется мувиклип.

Bgg 12.11.2011 23:21

Цитата:

Сообщение от Ookami (Сообщение 1045597)
А вообще я с эской 7 лет работал.

Я думал после такого не выжывают.

Ookami 12.11.2011 23:22

Цитата:

я привык к записям типа sprite.source="pic.png", у спрайта этого нет
addChild()

Добавлено через 2 минуты
Цитата:

И как мне объясняли выше в итоге что бы засунуть в спрайт свою картинку, мне нужно создавать отдельный мувиклип в который засовывать картинку, а мувиклип в свою очередь засовывать в спрайт. т.е. только так. если я всё правильно понимаю и это так называемый простой способ то для меня это просто вынос мозга. я вообще тогда не понимаю смысла спрайта если в итоге всё равно используется мувиклип.
Создайте свой класс, наследуемый от Sprite, задайте ему 3 паблик переменных Sprite - ап, овер и даун, в которых будете хранить спрайты кнопки. И устанавливайте видимость одному из этих спрайтов в зависимости от положения кнопки

Bgg 12.11.2011 23:28

Цитата:

Сообщение от noobuser (Сообщение 1045607)
это просто вынос мозга. я вообще тогда не понимаю смысла спрайта если в итоге всё равно используется мувиклип.

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

Ookami 12.11.2011 23:31

Бгг ну зачем так сразу ) Какие-то моменты гораздо проще воспринимаются не на основе туториала а на живом примере с объяснениями.

noobuser 12.11.2011 23:41

Это воля случая, появилась необходимость в очень сжатые сроки написать приложение, и до этого (когда большинство работы уже сделано и реализована пожалуй самая сложная часть) всё разбиралось понималось и писалось на ходу. а тут такая мелочь как кнопка, создала столько проблем. В вашем примере (как и во всех) используется заливка фона спрайта в качестве картинки кнопки. А для меня непонятен именно способ засунуть в спрайт растровое изображение.

GBee 12.11.2011 23:43

Цитата:

graphics не в счёт, в нём можно только программно рисовать примитивы как я понял
graphics.beginBitmapFill ;о)

Ookami 12.11.2011 23:43

момент, щас дам пример

noobuser 12.11.2011 23:47

Код AS3:

                public function btn2(s:String){
                        var re=new URLRequest("pic/btn.png");
                        var l=new Loader;
                        l.load(re);
                        lbl.text=s;
                        lbl.selectable=false;
                        addChild(l);
                        addChild(lbl);
                        buttonMode=true;
 
                }

вот что получилось в итоге у меня. Вроде засунул, и вопрос для закрепления, т.е. напрямую связать спрайт с растровой картинкой невозможно, обязательно нужно использовать спрайт как контейнер для другого объекта (Loader) с картинкой ?

GBee 12.11.2011 23:49

Цитата:

и вопрос для закрепления, т.е. напрямую связать спрайт с растровой картинкой невозможно, обязательно нужно использовать спрайт как контейнер для другого объекта (Loader) с картинкой
graphics.beginBitmapFill ;о)

noobuser 12.11.2011 23:55

GBee спасибо, в данном случае помоему для меня проще использовать его как контейнер, посомтрел примеры с beginBitmapFill и там всё равно используется тотже Loader. Кода будет еще больше, ну да ладно, не суть, главное я понял принцип.

Ookami 12.11.2011 23:57

не успел (

GBee 13.11.2011 00:00

Цитата:

GBee спасибо, в данном случае помоему для меня проще использовать его как контейнер, посомтрел примеры с beginBitmapFill и там всё равно используется тотже Loader. Кода будет еще больше, ну да ладно, не суть, главное я понял принцип.
Про Embed еще поищите! Тогда грузить картинки не надо будет, но флэшка подрастет в размерах.

strangedk 13.11.2011 00:14

Embed не подойдет, он FlashIDE юзает

А вообще тема начинает улыбать :)

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

Не нужно не зная даже основ языка, твердить о том что это AS3 такой плохой.
Как я вам уже и писал, вы просто имеете недостаточно знаний, учитесь проявляйте терпение, и всё получится.


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

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