Форум 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=148322)

zhoran 27.12.2010 22:38

Помогите разобраться с кнопкой
 
Привет всем!
Мне нужна панель из пяти одинаково выглядящих нестандартного вида кнопок с разными текстами: "min", "2 x min", "3 x min", "pot", "all-in".

Так как я сугубый нуб в флеше, я сначала решил, что надо распотрошить стандартную кнопку компонент и привести ее к нужному виду. Я вставил кнопку на сцену и дважды кликнул на нее, и она "распалась" на ряд изображений ее отдельных фаз, но мне показалось сложным править их все, и потом я не знал как их собрать обратно, и что еще надо будет допилить, поэтому я пошел другим путем - путем создания кнопки с нуля. И столкнулся с проблемами. Прошу помочь.

Свою кнопку я сделал так:
Создал в Flash CS4 новый символ типа Button, создал изображения для up, down, over кадров. Проверил, что кнопка нажимается. Далее т.к. мне нужна была панель из одинаково выглядящих кнопок, но с разными надписями, я создал новый символ типа MovieClip - панель кнопок и разместил на ней пять моих одинаковых кнопок.

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

Я указал имена экземпляров для кнопок, для панели кнопок, и для динамик текстов на кнопках.

Тут столкнулся с проблемами.
1) поскольку кнопка в кадрах up и down имеет различное положение (утапливается), то и текст на кнопке тоже должен утапливаться. Значит надо делать несколько Dynamic Text объектов сообразно кол-ву кадров? Правильно рассуждаю или надо как-то по-другому?
2) Если да, то значить им надо давать уникальные имена (Instance name), получается как-то избыточно что-ли.
3) Несмотря на то, что переменные, которые автоматом создаются если назначишь объекту Instance name, выбирались из списка автоподстановки после нажатия "." значение переменной title (динамик текст на кнопке) оказалось null. Почему?
Вот мой код в конструкторе лейаута флешки:

Код AS3:

// Поменять текст на кнопках рейз панели
var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup
var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок
var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
for (var i:int = 0;  i < btn_array.length; i++) {
  //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null
  trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null???
}

ps
Dynamic Text с именем экземпляра title я создал для проверки идеи только на кадре up, может в этом дело?

dimarik 28.12.2010 00:44

Вспоминаю себя во времена Flash 4. Такие же проблемы с пониманием отношений класс - экземпляр были.

Dukobpa3 28.12.2010 06:19

1. если кнопки все одинаковые и отличаются только текстом - достаточно нарисовать одну кнопку.
2. Чтобы текст при нажатии сделать "утопленным" - можно на текстовое поле навесить парочку пост-эффектов типа блюров или теней. Ну и чтоб они отличались на этих 4-х кадрах кнопки.

Теперь собственно что надо сделать:
1. почитать документацию:) хотя бы официальную справку адоба.
2. у тайтла в символе кнопки сделать инстанс нейм.
3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск)
4. ну и далее по тексту.

Код AS3:

// Поменять текст на кнопках рейз панели
var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup
var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок
var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
for (var i:int = 0;  i < btn_array.length; i++) {
    //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null
    //Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием
 
    //trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null???
    //null у нас тут по той же причине
 
    btn_array[i].title.text = btn_names[i];
    trace(btn_array[i].title.text); //пробуйте так;)
}


zhoran 28.12.2010 23:29

Спасибо за ответы. Не получается.

Теперь собственно что надо сделать:
1. почитать документацию хотя бы официальную справку адоба. - Пока не нашел в ней ответ, но читаю.
2. у тайтла в символе кнопки сделать инстанс нейм. - это я сделал когда писал, иначе имя title не автоподставилось бы в редакторе.
3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск) - ну вроде в коде видно что я так и делаю, а рисовать пять почти одинаковых кнопок не хочу потому что не красиво.
4. ну и далее по тексту.
trace(btn_array[\i].title.text); //пробуйте так;)

- я же пишу, что btn_array[i].title == null, соответственно btn_array[i].title.text прекращает выполнение по причине вызова метода у null


Уточняю, у меня в редакторе, когда я после btn_array[i] ставлю точку, появляется список, в котором есть свойство title, а когда я ставлю точку после btn_array[i].title в списке есть методы и свойства title, но в процессе выполнения почему-то title == null, хотя в кнопках текст есть.

Не понимаю (
Может кто-нить сампл код привести который работает, чтобы у кнопки Dynamic Text поменялся?

Dukobpa3 28.12.2010 23:52

В своем ответе я объяснил почему там null и исправил код.

Так тоже не работает?

zhoran 29.12.2010 13:06

//Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием
Нет, вылетает не поэтому, он пишет: [Fault] exception, information=TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

Переделал немного, чтобы не было явного приведения типа:
Код AS3:

for (var i:int = 0;  i < btn_array.length; i++) {
  var btn:RaisePanelButtonDesign =  btn_array[i];
  trace(btn.title); // тут выводит null
  trace(btn.title.text); // а так выводит "[Fault] ... как в сообщении выше
}

Ваш код не нработает - тоже пишет null.

зы
А рабочий короткий пример можете выложить?

zhoran 29.12.2010 14:07

Вложений: 1
Прикладываю StrangeButton.fla, StrangeButton.swc - в них только моя кнопка с Dynamic Text
а Main.as для примера вот:

Код AS3:

package 
{
        import flash.display.MovieClip;
        import poker.view.RaisePanelButtonView;
        import flash.events.Event;
 
        public class Main extends MovieClip
        {
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        var button:RaisePanelButtonView = new RaisePanelButtonView();
                        this.addChild(button);
                        trace(button.title); // почему null???
                }
 
        }
 
}


Dukobpa3 29.12.2010 18:37

Хз, короче:) У меня собственно тоже тайтл у кнопки поменять не получилось.
Но получилось его поменять, если делать кнопку не SimpleButton'ом а MovieClip'ом. Видимо батон не умеет с чилдами работать, мож кто более опытный подскажет.
Единственное что если делать мувиклипом - то самому надо следить за событиями и менять визуальный образ. К тому же следует помнить что тайтл в кажддом кадре свой. И его надо менять во всех кадрах, если динамически ставить. С этим думаю разберетесь.

Ну а я обычно вот так подобные вопросы решаю (тут курсор пальчиком не становится если на текст наводишь, не стал играться. Вообще по правильному надо поверху натянуть какую-то прозрачную плашку):
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.filters.DropShadowFilter;
        import flash.text.TextField;
 
/**
 * @author Dukobpa3
 */

        public class Main extends Sprite
        {
                private var btn_array:Array = [];
                private var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
 
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        for (var i:int = 0; i < 5 ; i++)
                        {
                                var btn:Sprite = new Sprite();
                                btn.name = String(i);
                                btn_array[i] = btn;
 
                                btn.graphics.beginFill(0x666666);
                                btn.graphics.drawRoundRect(0, 0, 70, 30, 4, 4);
                                btn.graphics.endFill();
 
                                var title:TextField = new TextField();
                                title.width = 60;
                                title.height = 20;
                                title.x = 5;
                                title.y = 5;
                                title.text = btn_names[i];
                                title.selectable = false;
                                title.autoSize = "center";
                                title.textColor = 0xffffff;
                                btn.addChild(title);
 
                                btn.x = i * 100;
 
                                btn.buttonMode = true;
 
                                this.addChild(btn);
 
                                btn.addEventListener(MouseEvent.CLICK, onClick);
                                btn.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
                                btn.addEventListener(MouseEvent.MOUSE_UP, onUp);
                                btn.addEventListener(MouseEvent.ROLL_OVER, onOver);
                                btn.addEventListener(MouseEvent.ROLL_OUT, onOut);
                        }
 
                }
 
                private function onDown(e:MouseEvent):void
                {
                        var but:Sprite = e.currentTarget as Sprite;
 
                        but.y += 2;
                }
 
                private function onUp(e:MouseEvent):void
                {
                        var but:Sprite = e.currentTarget as Sprite;
 
                        but.y -= 2;
                }
 
                private function onOut(e:MouseEvent):void
                {
                        var but:Sprite = e.currentTarget as Sprite;
 
                        but.filters = [];
                }
 
                private function onOver(e:MouseEvent):void
                {
                        var filter:DropShadowFilter = new DropShadowFilter();
                        var but:Sprite = e.currentTarget as Sprite;
 
                        but.filters = [filter];
                }
 
                private function onClick(e:MouseEvent):void
                {
                        /***************
                        Do Something
                        //****************/

                        trace("click: " + e.currentTarget.name);
                }       
 
        }
 
}


zhoran 29.12.2010 20:03

Ок, буду изучать.
Кстати, да припоминаю, вроде читал, что батон отличается от мувика тем, что не может содержать другие мувики, кажется. Если не путаю.
Спасибо за помощь!


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

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