|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Custom Buttons. Кастомные кнопки. Как сделать?
Есть собранный интерфейс игры во Flash. Много кнопок(будущих, то есть просто png картинки), все стоит на своих местах.
Мне же необходимо применить к каждой из всех кнопок пару различный эффектов (tween scaleX + scaleY + ColorTransform + добавить небольшой клип (щелчка) в месте нажатия и это все для разный состояний кнопки) Я бы сделал каждую кнопку во Flash но, кнопок слишком много, слишком долго и муторно выйдет + все уже стоит на своих местах (вручную потом ставить координаты это не вариант) Как это сделать программно (по умному )? Вот парочка идей пришедших мне в голову: 1) Это создать класс например MyCustomButton, в нем создать слушатели для состояний и применять все манипуляции к this. Далее когда оборачиваем изображение в клип, в поле "Главный класс" вместо "flash.display.MovieClip" указать наш com.name.MyCustomButton. Вот и вся работа, изменил один класс для всех кнопок, прописал базовый класс клипу и все работает. Но у меня почему то (черт знает почему), именно при таком раскладе tween не воспринимает функцию onComplete. Например: В функции меняются свойства клипа, и есть trace(). Трейс работает а свойства остаются такими же (короче ничего не происходит, прям чертовщина какая то). Не знаю на сколько такой вариант был бы правильным для кастомизации кнопок. 2) Сделать класс с статистическими функциями, и инициализировать каждую нужную кнопку с клипа интерфейса, а потом уничтожать слушатели, тоже для каждого клипа отдельно. InitClipListeners(gui.shop); InitClipListeners(gui.achives); InitClipListeners(gui.photo); и т.д. InitClipListeners(clip:MovieClip):void { clip.addEventListener(MouseEvent.ROLL_OVER, onRollOver); clip.addEventListener(MouseEvent.ROLL_OUT, onRollOut); clip.addEventListener(MouseEvent.CLICK, clickHandler); } DestroyClipListeners(clip:MovieClip):void { clip.removeEventListener(MouseEvent.ROLL_OVER, onRollOver); clip.removeEventListener(MouseEvent.ROLL_OUT, onRollOut); clip.removeEventListener(MouseEvent.CLICK, clickHandler); } Последний раз редактировалось zCHESNOKz; 28.10.2015 в 22:28. |
|
|||||
Кнопки ваши в мувиклипах содержаться? Можно запустить поиск по всем дочерним объектам и снимать с них высоту, ширину и позицию. И заменять на свои кнопки.
|
|
|||||
Регистрация: Jul 2014
Сообщений: 42
|
Попробуй создавать кнопки через функцию, в которой кнопка будет подписана на слушатели мыши и обработчики нажатия-наведения будут вызывать анимацию. В качестве аргумента передаёшь функцию, которая будет обрабатывать нажатие кнопки.
private function createButton(clickHandler:Function):Button{ var btn:Button = new Button(); btn.addEventListener(MouseEvent.ROLL_OVER, onRollOver); btn.addEventListener(MouseEvent.ROLL_OUT, onRollOut); btn.addEventListener(MouseEvent.CLICK, clickHandler); return btn; } private function onRollOver(e:MouseEvent):void{ // тут идут манипуляции по наведению, например, скейлинг var btn:Button = e.currentTarget as Button; btn.scaleX=1.2; btn.scaleY=1.2; } private function onRollOut(e:MouseEvent):void{ // тут идут манипуляции по убиранию мыши с кнопки, например, восстановление масштаба var btn:Button = e.currentTarget as Button; btn.scaleX=1; btn.scaleY=1; } |
|
|||||
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Цитата:
дам имя в свойствах. "И заменять на свои кнопки" - так в этом и суть, можно по всякому сделать "свои" кнопки. Последний раз редактировалось zCHESNOKz; 28.10.2015 в 22:28. |
|
|||||
Регистрация: Nov 2005
Сообщений: 149
|
возможно, в качестве идеи подойдет нечто подобное?
1. все картинки (будущие кнопки) поместить в отдельный контейнер 2. специальному методу передать этот контейнер (чтоб из картинок сделал кнопки) 3. можно использовать и не SimpleButton, а обыкновенный Button, тогда разные состояния для кнопок (rollOver, rollOut) просто надо будет задавать через Button.setStyle() 4. картинкам придется давать имена - иначе как обрабатывать клики? 5. В конструктор SimpleButton передаются DisplayObject-ы, которые и будут отображаться (т.е. - с картинками при инициализации можно сделать что угодно, наложить необходимые эффекты) псевдокод! function initializeButtons(container:Sprite):void { for(var i:int=0; i<container.numChildren; i++) { var image:DisplayObject = container.removeChildAt(i); var simpleButton:SimpleButton = new SimpleButton(image, image, image); simpleButton.name = image.name simpleButton.x = image.x; simpleButton.y = image.y; container.addChildAt(simpleButton, i); } container.addEventListener(MouseEvent.CLICK, handleButtonsClick, true); } function handleButtonsClick(e:MouseEvent):void { switch(e.target.name) { case "someName": doSomeThing(); break; } } Касательно цитаты: "(Была проблема с Stage.mouseX в статической функции, и решил узнать у более опытных ребят) Помогите пожалуйста)" Если правильно понимаю проблему, то к Stage.mouseX нельзя обратиться подобным образом - это не статическая функция. Можно получить stage через соотв. свойство DisplayObject ПРИАТТАЧЕННОГО к stage. Т,е. - если на сцене есть "ВИДИМАЯ" кнопка (явное свидетельство, что она на сцене), то можно обратиться через нее btn.stage.mouseX. Т.е. - свойство stage есть У ВСЕХ DisplayObject. Но у тех, что не приаттачены stage==null. Кстати, если координаты мыши надо узнать при обработке мышиного события, то их можно узнать из из самого объекта события - http://help.adobe.com/ru_RU/FlashPla...nt.html#stageX |
|
|||||
Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
|
Спасибо за идейку и советы! Добра тебе)
Цитата:
Все та же чертовщина) У меня функция с добавлением слушателей статическая, и функция обработчик тоже статическая получилась, увы мои скудные (пока что) знания AS3, не совсем помогают понять как это связано. Но! Из за чего то я не мог обратиться к свойствам события event кроме как к e.target и e.currentTarget |
|
|||||
Регистрация: Nov 2005
Сообщений: 149
|
1. Статические - нестатические слушатели или обработчики - дело вкуса (лично я не люблю статические классы и методы).
2. "Из за чего то я не мог обратиться к свойствам события event кроме как к e.target и e.currentTarget" - Евенты разные - у них разные наборы свойств. Без примера кода обработчика сложно что-либо понять и рекомендовать. |
|
|||||
[+4 06.05.14]
|
Если кнопки - картиночные, то есть у каждой своя фото. Удобнее делать типа того
ButtonsFactory.define(photo, id*/string,int*/); var cust:CustomBtn = ButtonsFactory.createButtonByID("15"); По поводу функционала, стоит создать отдельный класс CustomBtn в котором и описать весь стандратный функционал оверов и аутов
__________________
Марк Tween |
Часовой пояс GMT +4, время: 19:11. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|