PDA

Просмотр полной версии : замена upState у кнопки


zxcv
10.06.2011, 11:36
собственно, можно ли подменить upState или downState у кнопки картинкой, подгруженной из вне?
делал што-то типа:

var button_up:Loader = new Loader();
button_up.load(new URLRequest("C:\\images\\button_up.png"));
nextButton.upState = Sprite(button_up);

съедает, но upState пропадает вообще.

КорДум
10.06.2011, 11:39
Я так понимаю, вы пользуетесь ужасным родным классом SimpleButton? Напишите свою кнопку, где это будет возможно.
А есть еще поиск, где можно найти это: http://www.flasher.ru/forum/showthread.php?t=153625&highlight=%F1%EC%E5%ED%E8%F2%FC+simplebutton+%F1%F2%E5%E9%F2

zxcv
10.06.2011, 12:40
я не понимаю этой строчки и getDefinitionByName в частности))
arr_btn[0].upState = new (getDefinitionByName("new_button") as Class)();
попробовал по аналогии

bmp = button_up as Bitmap;
nextButton.upState = new (getDefinitionByName("Bitmap") as Class)();

но эффект тот же (

КорДум
10.06.2011, 12:46
Ну во-первых, есть хелп. Во-вторых, говорю вам, пишите свою кнопку.
nextButton.upState = new (getDefinitionByName("Bitmap") as Class)();
Эта строчка создала новый пустой экземпляр класса Bitmap и поместила его в качестве upState у кнопки.

zxcv
10.06.2011, 12:59
так а просто new Bitmap() не попрет?

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

КорДум
10.06.2011, 13:02
так а просто new Bitmap() не попрет?
Естественно пойдет.
В своей кнопке сделайте upState контейнером и грузите в него, что хотите.

zxcv
10.06.2011, 13:09
бррр... так зачем же тогда так... эммм... извращаться?? или различия все же есть? и почему в таком случае мой первый вариант не работает? как туда непустой Bitmap поместить?

КорДум
10.06.2011, 13:13
Это не извращения, это обычная практика. Контейнер - это Sprite, к примеру.
По идее надо просто так:
nextButton.upState = loader.content as DisplayObject;
Вообще адобовцы сделали непонятный класс. Если это не пройдет, пишите свою кнопку.
КОнечно же, нужно сначала дожидаться, когда картинка скачается.

zxcv
10.06.2011, 15:06
не прошло) вообще говорит, што контент пустой.

не пойму, как мне сделать upState спрайтом.
мне нужно сделать спрайтом фон кнопки? т.е. я создаю кнопку, в ней на upState помещаю фон, который является наследником Sprite? и менять тогда не upState, а его ребенка, т.е. фон?

GBee
10.06.2011, 15:10
Загрузки то дождались?

КорДум
10.06.2011, 15:15
Загрузки то дождались?
Судя по всему нет, меня проигнорировали =(

мне нужно сделать спрайтом фон кнопки? т.е. я создаю кнопку, в ней на upState помещаю фон, который является наследником Sprite? и менять тогда не upState, а его ребенка, т.е. фон?
Сделайте, как сказал я и не мучайтесь.
upState — ссылка на ваш DisplayObject. Так и пихайте в него DisplayObject.

zxcv
10.06.2011, 15:35
ммм... да, пардоньте, исправился, теперь контент не пустой, но все же upState просто пропадает и все.

КорДум
10.06.2011, 15:36
Пишите свою кнопку. Помнится, год назад пытался сделать то же, плюнул и переписал все, накрутив наворотов.

Добавлено через 1 минуту
Хотя... попробуйте вот так:
(btn.upState as DisplayObjectContainer).addChild(loader.content as DisplayObject);
Если получится, перед добавлением очищайте содержимое контейнера. Ну и, конечно же, вы сначала в upState должны поместить потомок DisplayObjectContainer, иначе вылетит RTE, что будет логичным.

zxcv
10.06.2011, 15:37
Сделайте, как сказал я и не мучайтесь.

так в том и дело, что я никак не пойму, как ((

КорДум
10.06.2011, 15:39
Мы наверно опять разминулись. Я выложил пример еще один.

zxcv
10.06.2011, 15:40
попробовал, но это внешне вообще никак не проявилось ) может этого ребенка на передний план как-то вынести надо?

КорДум
10.06.2011, 15:40
Он и так будет на переднем плане.
Сейчас наваяю простенький пример и вам покажу.

Добавлено через 12 минут
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;

/**
* @author KorDum
*/

public class Main extends Sprite {
[Embed(source = '../bin/state.gif')] private var State:Class;
private var _loader:Loader;
private var _button:SimpleButton;

public function Main():void {
_loader = new Loader();
_loader.load(new URLRequest('1.gif'));
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onCompleteHandler);

var state:Bitmap = new State() as Bitmap;
_button = new SimpleButton(state, state, state);

addChild(_button);
}

private function _onCompleteHandler(e:Event):void {
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _onCompleteHandler);
_button.upState = _loader.content;
}
}
}
Простой, насколько смог.

zxcv
10.06.2011, 16:24
ога, спасибо большое! в принципе, ничего нового, но работает... я кнопки создавал визуально, а тут в коде - может поэтому?

State.gif в этом примере - што-то типа заглушки? в смысле можно же заменить пустыми битмапами?

КорДум
10.06.2011, 16:43
Чем угодно, хоть другими кнопками ;)
Там вот кнопочка-весы справа есть =)

zxcv
10.06.2011, 16:50
гм, upState заменился успешно, по аналогии заменил downState (ждал загрузок, все дела :) ), но на щелчок мышью кнопка не реагирует

КорДум
10.06.2011, 16:57
Покажите код.

zxcv
10.06.2011, 17:08
var button_up:Loader = new Loader();
var button_down:Loader = new Loader();
var btn:SimpleButton;

public function Main()
{
button_up.contentLoaderInfo.addEventListener(Event.COMPLETE, compUp);
button_up.load(new URLRequest("C:\\images\\button_up.png"));
button_down.contentLoaderInfo.addEventListener(Event.COMPLETE, compDown);
button_down.load(new URLRequest("C:\\images\\button_down.png"));


var bmp:Bitmap = new Bitmap();
btn = new SimpleButton(bmp,bmp,bmp);
addChild(btn);
}


function compUp(event:Event)
{
trace("!!");
btn.upState = button_up.content;
}


function compDown(event:Event)
{
trace("@@");
btn.downState = button_down.content;
}


вроде так

КорДум
10.06.2011, 17:11
А где вы присоединили слушатель кнопке? ;)

zxcv
10.06.2011, 17:37
а ей разве нужен слушатель для проигрывания анимации? т.е. для перехода с upState на downState.

КорДум
10.06.2011, 17:47
Так проверьте.

zxcv
10.06.2011, 17:49
неужели дело в слушателе?! сейчас... )

Добавлено через 1 минуту
аха... дело не в слушателе, наверн... щелчок мыши просто не доходит до кнопки...

Добавлено через 4 минуты
btn.addEventListener(MouseEvent.CLICK, paymentType);

все верно же? )) мне к кнопке обращаться по имени btn (исходя из того, што я выложил выше)?

КорДум
10.06.2011, 17:54
А, вот в чем дело. Задайте ей hitTestState. Или вручную, или в конструктор передайте.

DaFive
10.06.2011, 17:58
Знатное колдовство. Главное, чтобы дальше класс расширять не пришлось.

КорДум
10.06.2011, 17:59
Главное, чтобы дальше класс расширять не пришлось.
Это каким надо быть изв...ергом, чтобы такое сделать? ;)

DaFive
10.06.2011, 18:03
Это каким надо быть изв...ергом, чтобы такое сделать? ;)

Ну я не имею в виду сам SimpleButton :) Просто в 2 раза легче было бы написать свой батон с блэкджеком и распущенными девицами, чем впихивать все это в кривой симплбатон :away:

zxcv
10.06.2011, 18:04
О, премного благодарен! )

КорДум
10.06.2011, 18:05
Ну я не имею в виду сам SimpleButton Просто в 2 раза легче было бы написать свой батон с блэкджеком и распущенными девицами, чем впихивать все это в кривой симплбатон
Я три страницы темы это говорил =)

DaFive
10.06.2011, 18:16
Ну человеку надо ж было помочь:quiet:

КорДум
10.06.2011, 18:18
Хорошо, напишу и тут:
пишите свою кнопку и не будет никаких проблем!
:D
Да, нужно прекращать флудить - наругаются =)

zxcv
10.06.2011, 18:21
так а как ее писать? ) создавать свой мувиклип с четырьмя кадрами, цеплять к нему класс-наследник от мувиклипа и т.п.?

DaFive
10.06.2011, 18:22
так а как ее писать? ) создавать свой мувиклип с четырьмя кадрами, цеплять к нему класс-наследник от мувиклипа и т.п.?

Конечно.

КорДум
10.06.2011, 18:25
Фу. Сделайте спрайт и стейты меняйте по событиям.

DaFive
10.06.2011, 18:35
Ну кому что, короче. Главное от симплбатона избавьтесь.

zxcv
20.06.2011, 12:07
В общем я попробовал создать свою кнопку. Тут по ходу пьесы еще выяснилось, што необходимо наличие затяжного нажатия, так сказать, что в основном меня и спровоцировало перейти к мувиклипу. Вот мои попытки:

создал MovieClip с тремя ключевыми кадрами (так сказать upState, начало downState и окончание downState), причем кадры пустые.
создал класс MyButton:
package {

import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.net.URLRequest;
import flash.display.LoaderInfo;

public class MyButton extends MovieClip
{
public var upState:Bitmap;
public var downState:Bitmap;
public var currState:Bitmap;

public function MyButton(_upState:Bitmap, _downState:Bitmap)
{
upState = _upState;
downState = _downState;
currState = upState;

gotoAndStop(1);
addChild(currState);
}

public function pressed()
{
gotoAndStop(2);
removeChild(currState);
currState = downState;
addChild(currState);
play();
}

public function unpressed()
{
gotoAndStop(1);
removeChild(currState);
currState = upState;
addChild(currState);
}

}

}

тут, в принципе, можно убрать currState, походу... ну эт ладно )

в основном классе пишу:

package my
{
//всякие импорты
public class Main extends MovieClip
{
//всякие переменные )
var button_up:Loader = new Loader();
var button_down:Loader = new Loader();
var up : Boolean = false;
var down : Boolean = false;
var btn : MyButton;

public function Main()
{
button_up.contentLoaderInfo.addEventListener(Event.COMPLETE, compUp);
button_up.load(new URLRequest("C:\\images\\back_up.png"));
button_down.contentLoaderInfo.addEventListener(Event.COMPLETE, compDown);
button_down.load(new URLRequest("C:\\images\\back_down.png"));
}

function compUp(event:Event)
{
trace("!!");
up = true;
if (up && down)
{
btn = new MyButton(Bitmap(button_up.content), Bitmap(button_down.content));
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, my);
}
}


function compDown(event:Event)
{
trace("@@");
down = true;
if (up && down)
{
btn = new MyButton(Bitmap(button_up.content), Bitmap(button_down.content));
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, my);
}
}


function my(event:MouseEvent)
{
btn.pressed();
//всякий код )
}
}
}


и в последнем третьем ключевом кадре моей кнопки я вызываю unpressed();
В принципе, все вроде работает как надо, но понимаю, што сделано через *опу )
так вот, может кто-нибудь што-нибудь присоветовать ценного? ) в частности, как в моем случае избавиться от кода в кадре? )

КорДум
21.06.2011, 12:45
Нет, у вас сам подход неверный (хотя его можно допилить, но лучше сделать сразу, как надо). Смысл такой: мы передаем в конструктор кнопки хэш/по отдельности каждый стейт/словарь, все, что надо, словом. Стейт с нажатием у вас будет либо отдельным спрайтом со своими контроллером анимации, либо отдельным мувиклипом со stop() в конце - я бы выбрал первый вариант, ибо давно уже к FlashIDE не прикасаюсь вообще, предпочитая писать на чистом as3.
Теперь сама кнопка. Сначала мы создаем upState, по наведению мы удаляем вообще upState, на его место приходит overState. Он создается с нуля, так же, как и downState. Удяляются стейты тоже с концами, то есть со всеми отписками, занулениями. Вот так, все просто.

zxcv
21.06.2011, 13:05
Большое спасибо за ответ! но возникло еще больше вопросов! ))

Меня вообще overState не интересует, поэтому остаются только up & down, которые я и передаю в качестве параметров (просто картинки, которые сменяются одна другой). Так што тут все верно же? ) храню я все это дело в свойствах класса, так?
А почему нажатие должно быть отдельным мувиклипом? и stop() в конце - это на кадре? А што за контроллер анимации у спрайта? я вообще не в теме ) и если я остановлю свой выбор таки на мувиклипе - ничего особо плохого не случится? ))
И если сама кнопка мувиклипом будет - тоже ничего ужасного? )
И я неверно сменял стейты? што значит, удалять с отписками и занулениями? они у меня вроде ни в чем не участвуют, а мышь слушает сама кнопка, не ее стейт же, правильно?

КорДум
21.06.2011, 13:11
А. Меня смутило это:
public function pressed() {
gotoAndStop(2);
removeChild(currState);
currState = downState;
addChild(currState);
play();
}
У вас примитивная кнопка, получается. Тут либо клип с двумя кадрами, либо спрайт с динамической сменой стейтов. Для того, чтобы они не висели в памяти, так как кнопок может быть очень много, лучше всего ненужный стейт вообще удалять, отписывать от событий (если таковые имеются, но в вашем случае оно не надо), а затем занулять.

И да, не "што", а "что".

zxcv
21.06.2011, 14:19
Тут либо клип с двумя кадрами
Для затяжного нажатия же нужно три, нет? Или картинки менять в первом?

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

В итоге, получается, мне конструкцию оставить такой, какая она есть?

И да, не "што", а "что".
В таком случае уж и не "вас", а "Вас" ;)

КорДум
21.06.2011, 14:35
Для затяжного нажатия же нужно три, нет?
Что значит "зятяжное нажатие"?
опять грузить с жесткого
Это как так у вас оно грузится, что с винта?
это будет занимать время...
Поверьте, если у вас кнопка не 8000*8000, то вы даже не заметите разницу по времени. И то, с нынешними компьютерами, кажется, и 8000 на 800 точек не проблема быстро отрисовать.
В таком случае уж и не "вас", а "Вас"
"Вас" - для документов ;)

zxcv
21.06.2011, 14:59
"Затяжное нажатие" - это не один кадр, который проигрывается, пока нажата кнопка мыши, а несколько кадров, содержащих одно и то же, но проигрывающихся, не зависимо от длины клика.

Ну пока с винта, в дальнейшем - с какого-нибудь места в сети. Вообще, грубо говоря, все ресурсы компа будут направлены на данное приложение, так што хранить десяток кнопок в памяти - не проблема, я думаю. В связи с этим возникает вопрос: можно ли как-то дождаться подгрузки всех состояний кнопок и только потом запускать основное приложение?

"Вас" - для документов
для любого обращения к конкретному лицу, в данном случае ко мне, хотя я и не филолог, конечно... В общем, думаю, не стОит развивать эту тему, согласны? )

КорДум
21.06.2011, 15:33
"Затяжное нажатие" - это не один кадр, который проигрывается, пока нажата кнопка мыши, а несколько кадров, содержащих одно и то же, но проигрывающихся, не зависимо от длины клика.
Таймер поможет.

zxcv
21.06.2011, 15:40
Я тоже думал об этом, но это ли не лишний наворот?

И, скажите, Вас приведенный класс устраивает, если исходить из поставленных целей?

КорДум
21.06.2011, 15:43
Нет, не устраивает, я не люблю мувиклипы :D
И не использую FlashIDE. Могу поделиться своей кнопкой в личку.