Войти
ПрограммированиеФорумОбщее

ActionScript 3.0 Динамическое создание обьектов

#0
22:33, 27 янв. 2010

Хочу создать объект, например кнопку... пишу

var MyBtn:SimpleButton = new SimpleButton( );
MyBtn.name = "Btn";
this.addChild( MyBtn );

А кнопки нет... выводил trace( ) дабы проверить вызывается ли метод... вызывается...
Что я делаю не так?

package {
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.text.TextField;

public class Main extends Sprite
{

public function Main( ):void
{
this.f( );
};

public function f( ):void
{
var MyBtn:SimpleButton = new SimpleButton( );
MyBtn.name = "!!!!";
this.addChild( MyBtn );

trace( "!!!!!!!!!!!!!!!!" );
};
};
};


#1
0:39, 28 янв. 2010

flash.display.SimpleButton
Кури эти доки.
Внизу экзампл.
Тебе не хватает ещё ряда графических объектов, которые отображают визуальные состояния кнопки. Так ты создал только логику кнопки без контента, так как не скормил ничего конструктору при инициализации инстанса.

#2
0:48, 28 янв. 2010

Сам класс SimpleButton не имеет отображения.
Этот класс имеет все свойства присущие кнопки: upState, downState и т.д.
Тип этих свойств DisplayObject, поэтому к ним можно (да и нужно) подцепить графические объекты. Проще говоря задаешь вид какой кнопка будет иметь в нажатом виде, в каком не нажатом, в каком когда курсор над кнопкой и т.д.
А в остальном все правильно.

#3
11:33, 28 янв. 2010

Советую тебе не делать на сцене кнопок с помощью SimpleButton. Лучше делай следующим образом:

Любую кнопку создавай как MovieClip. При рисовании самой кнопки (клипа), создай несколько слоёв. Предположим их будет пока четыре (описываю сверху вниз):
- Label;
- ActionScript;
- Text;
- Object.

Делаешь дальше следующим образом...выделяешь, предположим, 20 кадр для каждого из слоёв и создаёшь там пустой кадр. Затем тоже самое для 40, 60 и так далее. Сколько нужно, заранее решишь. Потом для каждой группы таких кадров: 1-ая группа 1-19, 2-ая группа 20-39, 3-я группа 40-59 и так далее...вот в каждой группе, на их первом кадре (то есть: 1, 20, 40, ...) именно на слое Label делаешь метку. Это делается на панели свойств (Properties). Начало первой группы называешь как MouseOut (мышка не на кнопке), начало следующей группы MouseOver (пришли на кнопку курсором) и так сколько нужно дальше...MouseDown, MouseUp, isEnable, isActive...

Далее, создаёшь пустой кадр уже для слоя ActionScript, только не на первом кадре каждой группы, а на последней. И для каждого такого последнего кадра группы, открываешь ввод скрипта с помощью F9 и пишешь:

stop();

Далее, в остальных слоях рисуешь что тебе нужно для каждой группы. Художник потом сделает анимацию (или ты сам). А уже потом в коде, когда у тебя произошло наведение на на кнопку:

package my.ResScrolling 
{
  import flash.events.MouseEvent;  
  import flash.display.MovieClip;
  
  public class Pointer extends MovieClip 
  {
    private var isEnable:Boolean=false;

    // Конструктор
    public function Pointer()
    {
      EventListener_Add();
    }
    
    // Возвращает активен ли указатель
    public function GetEnable():Boolean
    {
      return isEnable;
    }
    
    // Добавить слушателей
    public function EventListener_Add():void
    {
      if(isEnable) return;
      
      addEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
      addEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
      addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
      addEventListener(MouseEvent.MOUSE_UP,onMouseUpHandler);
      
      buttonMode=true;
      isEnable=true;
    }

    // Удалить слушателей
    public function EventListener_Del():void
    {
      if(!isEnable) return;
      
      removeEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
      removeEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
      removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
      removeEventListener(MouseEvent.MOUSE_UP,onMouseUpHandler);
      
      buttonMode=false;
      isEnable=false;
    }
    
    // Увод мышки
    private function onMouseOutHandler(event:MouseEvent):void
    {
      gotoAndPlay('MouseOut');
    }
    
    // Навод мышки
    private function onMouseOverHandler(event:MouseEvent):void
    {
      gotoAndPlay('MouseOver');
    }
    
    // Нажатие мышки
    private function onMouseDownHandler(event:MouseEvent):void
    {
      gotoAndPlay('MouseDown');
    }
    
    // Отпускание мышки
    private function onMouseUpHandler(event:MouseEvent):void
    {
      gotoAndPlay('MouseOver');
    }
    
  }
}

Если не понял ничего, вот тебе скриншот:

Временная шкала | ActionScript 3.0 Динамическое создание обьектов

А если нужно чтобы курсор мыши был такой же, как и был бы если это была бы кнопка, то можешь написать так:

buttonMode=true;

Если будут вопросы, обращайся!

#4
17:11, 28 янв. 2010

2 ALL Спасибо.
2 s3dworld А вам отдельно спасибо! :) Приеду домой буду ковырять :)

#5
17:41, 28 янв. 2010

Не за что))

#6
21:29, 28 янв. 2010

s3dworld
Странная кнопка. Придется всегда запоминать инстанс такой кнопки, чтобы вручную вызывать EventListener_Del, чтобы gc ее убил, иначе приложение будет течь. При этом никаких преимуществ перед SimpleButton я не вижу.

#7
10:18, 29 янв. 2010

Нужно, делай не вручную. Тут зависит всё от того, что нужно. Хочешь, размещай их на клипе с любым id и потом все легко считаешь и будешь обрабатывать, нужно, задай id и чисто по ним, а если не нужно так, делай динамически. Ты на код особо не смотри, это я для примера написал, в основном чтобы показать переход на метки.

#8
17:26, 29 янв. 2010

s3dworld
Дело в том, что этот код не нужен совсем, он тупо лишний. Гугли buttonMode + _up, _over, _down.

#9
22:41, 3 фев. 2010

Ну вот загрузил я в компонент Image swf файл, как мне теперь его скастаить к MovieClip чтобы кадрами манипулировать?
( AddobeFlexBuilder )

#10
2:14, 4 фев. 2010

От класса ресурса создавай класс Bitmap. Bitmap можно через addChild к наследникам DisplayObjectContainer добавлять. А можно взять поле BitmapData и нарисовать ей в graphics на спрайте каком-нибудь.
Типа так:

[Embed(source = '../resources/interface/player/play1.png')]
public static var res_play1:Class;
public static var bmp_play1:Bitmap = new res_play1();
#11
11:06, 4 фев. 2010

те типа var MyMovie:MovieClip = new эеземпляр Image класса?

#12
16:56, 4 фев. 2010

Не знаю, что за класс Image такой. Это точно AS3? Я через flash.display.Bitmap всегда делал. Создаётся класс для ембед ресурса, потом от этого класса создаётся экземпляр класса Bitmap. Точно так же для звуков, только создаётся экземпляр класса Sound. Для шрифтов экземпляры не создаются.

ПрограммированиеФорумОбщее

Тема в архиве.