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

tikhop 02.07.2008 06:26

Нумерование кнопок
 
Делаю первый проект на AS3, столкнулся с такой проблемой, есть массив, который хранит классы.
Код:

array[0]=new A()
array[1]=new B()
array[n]=new Z()

далее я создаю циклом кнопки и хочу сделать так, нажал 1ую кнопку, вызвали класс array[0] ну и в таком духе...

В AS2 я это реализовывал таким образом:
Код:

...................
for(var i:Number=0; i<15; i++){
    var btn:MovieClip=this.createEmptyMovieClip("btn"+i, this.getNextHighestDepth());
    btn.id=i
               
    var label:TextField = btn.createTextField("label", 1, 0, 0, 150, 20);
    label.text = "btn"+i;
               
    btn.onRelease=function(){
        trace(this.id)
        //array[this.id]
    }
}

...................

Может есть иные способы, чтоб при нажатии на кнопку создавался экземпляр нужного мне класса?:umnik2:

Alex Lexcuk 02.07.2008 12:39

Так не интересно когда 15 кнопок одна на другой. вот пример первого кадра. Библиотека чистая.
Код:

//создать текстовое поле
var my_txt:TextField = new TextField();
var my_sheet:StyleSheet = new StyleSheet();
my_txt.width=500;
my_txt.height=200;
my_sheet.parseCSS(".red_text {font-family: Comic Sans MS; font-size: 30; color: #FF00CC;}"+
                                  ".bluetext {color: #0000CC;}");
my_txt.styleSheet = my_sheet;
my_txt.multiline=true;//многострочность
my_txt.htmlText = "<span class='red_text'>Прикол</span><span class='bluetext'>Да уж прикол так прикол</span>";
//добавить текст на рабочее поле
addChild(my_txt);
//массив для кнопок мовиков
var mc_but_ar:Array = new Array();
//сделать табличку кнопок
var i,j,c:int;
c=0;
for (i=0;i<3;i++)
  {
  for (j=0;j<3;j++)
  {
    mc_but_ar.push(my_but(c,my_txt));//кнопку в массив и привязать к тексту
        mc_but_ar[c].x=i*200;//поставить координаты х для мувика в массиве
        mc_but_ar[c].y=j*50+200;//поставить координаты y для мувика в массиве       
        c++;                         
  }
}


function my_but(num:int,out_txt:TextField):MovieClip
{
//создать пустой мови
var in_mc = new MovieClip();
//добавить мови на рабочее поле
addChild(in_mc);
//начало текстового поля
var in_txt:TextField = new TextField();
in_txt.autoSize = TextFieldAutoSize.CENTER;
var sheet:StyleSheet = new StyleSheet();
sheet.parseCSS("my_s {font-family: Times New Roman, Times, _serif; font-size: 30;}");
in_txt.styleSheet = sheet;
in_txt.htmlText = "<my_s>Прикол"+num+"</my_s>";
//конец текстового поля
//нарисовать квадрат на мувике по размерам тестового поля
in_mc.graphics.lineStyle(1, 0x000000, 0.5 );
in_mc.graphics.beginFill( 0x990000, 0.5 );
in_mc.graphics.drawRect(in_txt.x, in_txt.y, in_txt.width, in_txt.height);
in_mc.graphics.endFill();
//конец нарисовать квадрат на мувике по размерам тестового поля

//добавить текстовое поле на мовиклип
in_mc.addChild(in_txt);
//убрать кликабельность текстового поля
in_txt.mouseEnabled = false;
//сделать палец на мови клипе
in_mc.buttonMode = true;
//создание подсветки
var b_filtr:Array = new Array(); var empty_filtr:Array = new Array();
var filter:BitmapFilter = new GlowFilter(0xFF0000,1,10,10,5,BitmapFilterQuality.HIGH,false,true);
b_filtr.push(filter);
//конец подсветки
in_mc.addEventListener(MouseEvent.MOUSE_MOVE,in_mc_m_move_func);//движение
function in_mc_m_move_func(MouseEvent)
{in_mc.filters = b_filtr;}

in_mc.addEventListener(MouseEvent.MOUSE_OUT,in_mc_out_func);//мышка выход за пределы
function in_mc_out_func(MouseEvent)
{in_mc.filters = empty_filtr;}

in_mc.addEventListener(MouseEvent.MOUSE_UP,in_mc_m_up_func);//мышка нажатие
function in_mc_m_up_func(MouseEvent)
{trace("HELLO");
out_txt.htmlText=out_txt.htmlText+
"<span class='red_text'>Фишка</span><span class='bluetext'>"+num+"</span><br>";
my_txt.scrollV=my_txt.maxScrollV;//промотать на конец внешнее текстовое поле
}

return in_mc;//Возвратить мови клип
}
//конец кода первого кадра


silin 02.07.2008 16:44

сори не вникал, что нарисовал Alex Lexcuk
но вопрос только в том, что тебе нужны кнопки у которых есть свойство id и/или ссылка на нужный класс
Код:

package 
{
        import fl.controls.Button;
       
        public class MyButton extends Button
        {
                public var id:int;
                public var cl:Class;
                public function MyButton(id:int, cl:Class)
                {
                        this.id = id;
                        this.cl = cl;
                }
               
        }
}

в цикле создаем кнопки, передав нужные значения
теперь по клику будем все знать, на кого нажали и что делать
Код:

package
{
        import flash.display.*;
        import flash.events.MouseEvent;
       
        public class Main extends Sprite
        {
                private var classArr:Array;
                public function Main():void
                {
                        classArr = [A, B, Z];
                        for (var i:int = 0; i < classArr.length; i++)
                        {
                                var but:MyButton = new MyButton(i, classArr[i]);
                                but.x = 10;
                                but.y = 10 + 30 * i;
                                but.label = "but" + i;
                                but.addEventListener(MouseEvent.CLICK, clickHandler);
                                addChild(but);
                        }
                }
               
                private function clickHandler(e:MouseEvent):void
                {
                        var but:MyButton = e.target as MyButton;
               
                        trace( "but.cl : " + but.cl );
                        //addChild(new but.cl());
                        trace( "but.id : " + but.id );
                }
        }
}


tikhop 10.07.2008 13:36

Возникла проблемма.
Создаю массив с классами:
Код:

partitionArray=[ChangeBg(bgPicArray), Contacts()];
Далешь делаю также как написал silin и мне при компиляции выскакивает ошибка, что не возможно отконвертировать partitionArray[i] в Class.
Подскажите с чем это может быть связанно?
Если что могу выложить исходник

silin 10.07.2008 14:22

ты создаешь не массив с классами, а непонятно что
вообще-то ругаться должен еще раньше, там где ты пишешь Contacts(), например..
если Contacts это класс, то Contacts() может использоваться только для приведения типа, выглядеть это должно как Contacts(someObj) и возвращать объект класса Contacts

Котяра 22.08.2008 11:02

Вопрос в тему. допустим я создал динамически объекты (10 тестфФилдов) в конструкторе в цикле. задал им свойство имя. как достучатся до них выйдя из цикла?
Код:

package ru.islandsworld
{
        import flash.display.Sprite;
        import flash.text.TextField;
       
        public class Main extends Sprite
        {
                public function Main():void
                {
                                for (var i:int = 0; i < 10; i++)
                                {
                                        var txt:TextField = new TextField();
                                        txt.name = "txt" + i;
                                        txt.x = 50;
                                        txt.y = i*20;       
                                        txt.text = String(txt.name);
                                        addChild(txt);
                                }
       
                               
                               
                }
               
        }
}

либо каким образам создать динамически объекты(методы или проперти) класса?
в AS2 MovieClip был наследником Object, соответственно динамическим и можно было получит доступ к текстфилдам как
Код:

                            for (var i= 0; i < 10; i++)
                                {
                                this["txt"+i"].text ="что-то там.."
                                }

Как быть в AS3?

Сам спросил, сам отвечу))
думаю пригодится . Помог :топик
Код:

package ru.islandsworld
{
        import flash.display.Sprite;
        import flash.text.TextField;
       
        dynamic        public class Main extends Sprite
        {
                public function Main():void
                {
                                for (var i:int = 0; i < 10; i++)
                                {
                                        var txt:TextField = new TextField();
                                        this["txt" + i] = txt;
                                        txt.name = "txt" + i;
                                        txt.x = 50;
                                        txt.y = i*20;       
                                        txt.text = String(txt.name);
                                        addChild(txt);
                                }
                              // Доступ к динамическому полю
                                this.txt3.text = "ddd";
                       
                               
                }
               
        }
}


Felicast 22.08.2008 17:45

Цитата:

Сам спросил, сам отвечу))
думаю пригодится .
плохой способ
гораздо лучше использовать:
Код:

(this.getChildByName("txt1") as TextField)
и убрать dynamic

ulik 22.08.2008 17:50

Цитата:

Сообщение от Felicast (Сообщение 759746)
плохой способ
гораздо лучше использовать:
Код:

(this.getChildByName("txt1") as TextField)
и убрать dynamic

Отнюдь.
Саый лучший способ это отключить автосоздание классов для инстансов на сцене и в классе объявить переменную, как Public. Вот это будет "грамотно"

Felicast 22.08.2008 18:34

Цитата:

Отнюдь.
Саый лучший способ это отключить автосоздание классов для инстансов на сцене и в классе объявить переменную, как Public. Вот это будет "грамотно"
здесь идет речь о динамически созданных объектах:
Цитата:

Код:

for (var i:int = 0; i < 10; i++)
{
        var txt:TextField = new TextField();
        txt.name = "txt" + i;
        txt.x = 50;
        txt.y = i*20;       
        txt.text = String(txt.name);
        addChild(txt);
}



Котяра 24.08.2008 20:08

Цитата:

Сообщение от Felicast (Сообщение 759746)
плохой способ
гораздо лучше использовать:
Код:

(this.getChildByName("txt1") as TextField)
и убрать dynamic

Спасибо, самое то,у меня не получилось через getChildByName без as.


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

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