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

Killer_13 03.12.2009 02:39

Добавление двох кнопок в контейнер - добавляется только одна :(
 
Прошу сильно не ругать за такой код, я только учусь...

Хотел бы попросить, если у кого-то есть минутка чуток оптимизировать его...

Мне нужно создать две одинаковые кнопки, но с разными именами и размещением
Подскажите как оптимизировать код на создание нескольких кнопок с разными именами и размещением, но с одинаковым поведением - пробовал вызывать функцию из мейн класса и передавать ей параметры, че т не получилось.. :(

Делаю это таким "макаром"
buttons.as
Код AS3:

package{
 
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.text.*;
 
        public class buttons extends Sprite {
 
                public var b:SimpleButton = new SimpleButton();
                public var btn1:SimpleButton = new SimpleButton();
                public var btn2:SimpleButton = new SimpleButton();
 
 
                public function buttons () {
 
                        b.upState = createRect(0x999999,1.0);
                        b.overState = createRect(0x999980,1.0);
                        b.downState = createRect(0x9999980,0.95);
                        b.hitTestState = b.upState;
                        trace("dsfsdssssss");
                        Next();
                        Prev();
 
                }
 
                function createRect(color:uint,alph:Number) {
                        var shape:Shape = new Shape();
                                shape.graphics.beginFill(color,alph);
                                shape.graphics.drawRoundRect(0,0,80,25,20,20);
                                shape.graphics.endFill();
                        return shape;
                }
 
                function Prev(){
                        var lab:TextField = new TextField();
                                btn1=b;
                                btn1.x = 10;
                                btn1.y = 320;
                        trace("prev");
                                lab.width = 50;
                                lab.text = "They call";
                                lab.x = 10;
                        trace("next");
                                lab.y = 320;
                        addChild(btn1);
                        addChild(lab);
                }
 
                function Next(){
                                btn2=b;
                                btn2.x = 100;
                                btn2.y = 100;
                        trace("next");
                        addChild(btn2);
                }
        }
}

вызываю в мейн и соваю в контейнер
main.as
Код AS3:

package {
 
        import flash.display.*;
        import buttons;
 
        public class main extends Sprite{
 
                public var cButt:Sprite = new Sprite();
 
                public function main(){
 
                        var bt:buttons = new buttons;
 
                        this.addChild(cButt);
                        cButt.addChild(bt.btn1);
                        cButt.addChild(bt.btn2);
                }
        }
 
 
}

добавляет только next кнопку, лейбл не добавляет и не добавляет prev кнопку.

Jewelz 03.12.2009 10:45

напишите класс кнопки Button

в нем вы рисуете кнопку, текстовое поле и требуемые методы для ее поведения(поменять состояние при over/out)

в основном классе создаете новый экземпляр класса Button, и только тут указываете его координаты, имя здесь же задаете btn1.name = 'btn1'...

Killer_13 03.12.2009 12:46

Методы для поведения (поменять состояние при over/out) тоже в основном классе?
Тоисть этот код должен находится в мейн?
Код AS3:

public function buttons () {
 
                        b.upState = createRect(0x999999,1.0);
                        b.overState = createRect(0x999980,1.0);
                        b.downState = createRect(0x9999980,0.95);
                        b.hitTestState = b.upState;
                        trace("dsfsdssssss");
                        Next();
                        Prev();
 
                }
 
 
 
 
        function Prev(){
                        var lab:TextField = new TextField();
                                btn1=b;
                                btn1.x = 10;
                                btn1.y = 320;
                        trace("prev");
                                lab.width = 50;
                                lab.text = "They call";
                                lab.x = 10;
                        trace("next");
                                lab.y = 320;
                        addChild(btn1);
                        addChild(lab);
                }
 
                function Next(){
                                btn2=b;
                                btn2.x = 100;
                                btn2.y = 100;
                        trace("next");
                        addChild(btn2);
                }


Jewelz 03.12.2009 16:13

вот что я имел в виду

основной класс
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author Jewelz
        */

        public class Main extends Sprite
        {
 
                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 btn1:Button = new Button('Кнопка 1');
                        btn1.name = 'btn1';
                        btn1.x = 100;
                        btn1.y = 100;
 
                        var btn2:Button = new Button('Кнопка 2');
                        btn2.name = 'btn2';
                        btn2.x = 250;
                        btn2.y = 100;
 
                        addChild(btn1);
                        addChild(btn2);
                }
 
        }
 
}

класс кнопки
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        /**
        * ...
        * @author Jewelz
        */

        public class Button extends Sprite
        {
                private var labelFld:TextField;
 
                public function Button(label:String)
                {
                        labelFld = new TextField();
                        labelFld.selectable = false;
                        labelFld.width = 80;
                        labelFld.height = 20;
                        labelFld.x = 10;
                        labelFld.y = 0;
                        labelFld.text = label;
                        addChild(labelFld);
 
                        addEventListener(MouseEvent.ROLL_OVER, onOver);
                        addEventListener(MouseEvent.ROLL_OUT, onOut);
 
                        onOut(null);
                }
 
                private function onOut(e:MouseEvent):void
                {
                        this.graphics.clear();
                        this.graphics.beginFill(0xff0000);
                        this.graphics.drawRoundRect(0, 0, 100, 20, 10, 10);
                        this.graphics.endFill();
                }
 
                private function onOver(e:MouseEvent):void
                {
                        this.graphics.clear();
                        this.graphics.beginFill(0xffff00);
                        this.graphics.drawRoundRect(0, 0, 100, 20, 10, 10);
                        this.graphics.endFill();
                }
 
        }
 
}


Killer_13 04.12.2009 02:31

Понятненьео, приблизительно так я себе и думал..

Спасибо.
Постал еще один вопрос.
А лучше, удобней, писать состояния кнопки функциями?
Ведь у класса SimpleButton есть свойства upState,overState и так д..

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

Код AS3:

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


Jewelz 04.12.2009 09:50

тут ждем пока флешка загрузится, то есть когда появится stage

Цитата:

Сообщение от Killer_13 (Сообщение 870172)
Ведь у класса SimpleButton есть свойства upState,overState и так д..

если используете SimpleButton то думаю логично использовать его готовые методы, но советую позже написать свой класс

Killer_13 05.12.2009 01:20

Цитата:

но советую позже написать свой класс
- эт как понять? :)
Я прошу подсказать как начинать писать КОД правильно!?, чтоб он был расшыряемым и так д...

Jewelz 05.12.2009 15:07

Цитата:

Сообщение от Killer_13 (Сообщение 870362)
- эт как понять? :)


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

пример я вам привел, все зависит от ваших конкретных целей

Цитата:

Сообщение от Killer_13 (Сообщение 870362)
Я прошу подсказать как начинать писать КОД правильно!?, чтоб он был расшыряемым и так д...

если класс не final то его можно расширить

SamFR 05.12.2009 16:10

Цитата:

Сообщение от Killer_13 (Сообщение 870362)
Я прошу подсказать как начинать писать КОД правильно!?, чтоб он был расшыряемым и так д...

Цитата:

Сообщение от Jewelz (Сообщение 870410)
если класс не final то его можно расширить

Возможность расширения на уровне языка ещё не значит возможность реального расширения. Чтобы класс был действительно расширяемым, его нужно правильно спроектировать, чётко определив для себя, какое поведение нужно позволять изменять, а какое – нет. Но эта тема отдельной большой статьи (или даже книги). И, к счастью, таких книг и статей немало.
Killer_13, это я вам :) Здесь вам вряд ли кто-то станет подробно такие вещи излагать, это не формат форума. Почитайте литературу, и обязательно попробуйте написать что-то своё. А потом отнаследуйтесь от него, и постарайтесь изменить поведение базового класса. После написания десятка-другого своих классов всё станет намного понятнее. Ибо умение, как вы говорите, писать код правильно, приходит только с опытом. Одних теоретических знаний тут недостаточно.

Я бы даже сказал, это умение не приходит никогда. Но ведь возможность в любой момент научиться чему-то новому – это ведь здорово, правда? =)

Killer_13 05.12.2009 16:50

Правда. :)
Сечас читаю, - учусь по книгам
Лотт, Шалл, Питерс - Сборник рецептов ActionScript 3.0
Колин Мук - ActionScript 3.0

flash_as3_programming.pdf
flash_as3_components_help.pdf
flash_cs4_help.pdf

Может еще кто подскажет интересные статьи и литературу о AS 3 ... :)

Знаю, что чуток не в тему вопроса, - но все же.. :)


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

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