PDA

Просмотр полной версии : Custom Buttons. Кастомные кнопки. Как сделать?


zCHESNOKz
27.10.2015, 22:59
Есть собранный интерфейс игры во Flash. Много кнопок(будущих, то есть просто png картинки), все стоит на своих местах.

Мне же необходимо применить к каждой из всех кнопок пару различный эффектов (tween scaleX + scaleY + ColorTransform + добавить небольшой клип (щелчка) в месте нажатия и это все для разный состояний кнопки)

Я бы сделал каждую кнопку во Flash но, кнопок слишком много, слишком долго и муторно выйдет + все уже стоит на своих местах (вручную потом ставить координаты это не вариант)

Как это сделать программно (по умному :D)?

Вот парочка идей пришедших мне в голову:

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);
}

Но как такой вариант, правильный или нет я не знаю. (Была проблема с Stage.mouseX в статической функции, и решил узнать у более опытных ребят) Помогите пожалуйста)

alexandrratush
27.10.2015, 23:42
Кнопки ваши в мувиклипах содержаться? Можно запустить поиск по всем дочерним объектам и снимать с них высоту, ширину и позицию. И заменять на свои кнопки.

DEVORON
27.10.2015, 23:47
Попробуй создавать кнопки через функцию, в которой кнопка будет подписана на слушатели мыши и обработчики нажатия-наведения будут вызывать анимацию. В качестве аргумента передаёшь функцию, которая будет обрабатывать нажатие кнопки.
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;
}

zCHESNOKz
28.10.2015, 20:33
Кнопки ваши в мувиклипах содержаться? Можно запустить поиск по всем дочерним
объектам и снимать с них высоту, ширину и позицию. И заменять на свои кнопки.
Не совсем тебя понял. Потенциальные кнопки это - просто растровые изображения. Я их оберну в MovieClip (каждый) и
дам имя в свойствах. "И заменять на свои кнопки" - так в этом и суть, можно по всякому сделать "свои" кнопки.

meiciuc
29.10.2015, 19:41
возможно, в качестве идеи подойдет нечто подобное?
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/FlashPlatform/reference/actionscript/3/flash/events/MouseEvent.html#stageX

zCHESNOKz
29.10.2015, 22:21
Спасибо за идейку и советы! Добра тебе)

Кстати, если координаты мыши надо узнать при обработке мышиного события, то их можно узнать из из самого объекта события - http://help.adobe.com/ru_RU/FlashPla...nt.html#stageX



Все та же чертовщина) У меня функция с добавлением слушателей статическая, и функция обработчик тоже статическая получилась, увы мои скудные (пока что) знания AS3, не совсем помогают понять как это связано. Но! Из за чего то я не мог обратиться к свойствам события event кроме как к e.target и e.currentTarget

meiciuc
30.10.2015, 02:03
1. Статические - нестатические слушатели или обработчики - дело вкуса (лично я не люблю статические классы и методы).

2. "Из за чего то я не мог обратиться к свойствам события event кроме как к e.target и e.currentTarget" - Евенты разные - у них разные наборы свойств. Без примера кода обработчика сложно что-либо понять и рекомендовать.

in4core
02.11.2015, 18:59
Если кнопки - картиночные, то есть у каждой своя фото. Удобнее делать типа того

ButtonsFactory.define(photo, id*/string,int*/);
var cust:CustomBtn = ButtonsFactory.createButtonByID("15");
То есть сначала создаем списочек, а потом из списка нужное тянем. Аналогично работа со звуком, когда их много, хотя там лучше вообще чистым статиком обойтись
По поводу функционала, стоит создать отдельный класс CustomBtn в котором и описать весь стандратный функционал оверов и аутов