Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача свойства из abc.as в главную (http://www.flasher.ru/forum/showthread.php?t=185642)

bettyshort 17.10.2012 16:53

Передача свойства из abc.as в главную
 
Добрый вечер.

Идея заключается в следующем: есть главный код и внешний. Во внешнем создал новый класс Button_color с функцией. Эта функция сама создаёт кнопку "button" с координатами "corX" и "corY", при её нажатии работает функция fadeInClick которая должна вывести на сцену мувик "mc" из библиотеки

Проблема в следующем. Не хочет вопроизводить свойство "mc", а так как таких мувиков будет много и хотелось бы просто в основном файле при вызове класса указывать какой мувик мне нужен. Если подгружать мувик напрямую а не задавать его как свойство, то всё работает шикарно. Соответсвенно подозреваю что я его неправильно "преподаю" для главного кода .

Ошибка "1067: Implicit coercion of a value of type Class to an unrelated type String."

Код внешнего класса:

Код AS3:

package {
 
  import flash.display.MovieClip;
  import flash.events.MouseEvent;
  import flash.events.Event;
 
  public class Button_color extends MovieClip {
 
          public function Button_color
          (corX:Number = 200, corY:Number =200, color:uint = 0xffffff, mc:String){
                  var ex = new mc();
                  var button:MovieClip = new MovieClip();
                  button.graphics.beginFill(color);
          button.graphics.drawRoundRect(corX,corY,40,40,20,20);
          button.graphics.endFill();
          addChild(button);
 
                          button.addEventListener(MouseEvent.CLICK, fadeInClick);
                      function fadeInClick(e:MouseEvent):void{
                          ex.alpha = 0;
                          ex.x = 834,45;
                          ex.y = 265,45;
                          addEventListener(Event.ENTER_FRAME, fadeIn);
                          function fadeIn (e:Event): void {
                          ex.alpha += .05;
                          addChild(ex);
}
}
}
}
}

Код главный:

Код AS3:

var button_color:Button_color = new Button_color(30, 760, 0xf1d200, SignalYellow);
addChild(button_color);


FlashRus 17.10.2012 17:00

1. Для офрмления кода есть теги AS3
2. Касательно вашей проблемы. Вы передаёте обыкновенную строку, а хотите от неё экземпляра класса.
Решение:
1. Либо передавать класс в качестве аргумента (где у вас mc:String - сделать mc:Class)
2. Либо воспользоваться getDefinitionByName()


UPD:
Рекомендации в целом:
1. Типизируйте переменные. На это есть огромная масса причин.
Код AS3:

var ex

2. Button_color - не следует называть так класс, т.к. каждое слово в именах классов должно начинаться с заглавной буквы. Подчёркивания обычно используются в именах констант.
3. Имя этого класса толком ничего не говорит о его назначении... Лучше было-бы что-нибудь вроде: ColoredButton или ColorizedButton
4. Несмотря на то, что компилятор сам сделает метод fadeInClick приватным, всё же следует ручками наделяет его атрибутом private.
5. В чём смысл вложенности метода fadeIn?? О боже.. у вас там всё вложено...

PainKiller 17.10.2012 17:01

ОфОРМЛЯЙТЕ КОД ТЕГАМИ!!
А если по делу -
Код AS3:

var ex = new mc();

это что? Вы из переданной в функцию строки экземпляр класса хотите создать? Передавайте мувик как параметр, судя по всему для вас это будет проще всего.
То есть:
Код AS3:

(corX:Number = 200, corY:Number =200, color:uint = 0xffffff, mc:MovieClip){

и дальше делайте с ним все что хотите.

Добавлено через 47 секунд
опоздал (((

bettyshort 17.10.2012 17:37

Пробовал и mc:Class и mc:MovieClip еще до обращения сюда, проблема не исчезла.


Цитата:

5. В чём смысл вложенности метода fadeIn?? О боже.. у вас там всё вложено...
Обучаюсь по официальной книге Adobe, довольно недавно. Только начинаю вникать в AS3.
Обязательно обращу своё внимание на изучение данной проблемы, после того как решу эту, ибо боюсь сейчас что либо трогать в коде.

Isfet 17.10.2012 17:47

вот эта строка не понятна
Код AS3:

 var ex = new mc();

в конструктор передается экземпляр класса MovieClip
замените ее на
Код AS3:

 var ex:MovieClip = mc;

должно заработать.
а вообще переменную ex создавать не нужно, а работать сразу напрямую:
то есть заменить все ex на mc

bettyshort 18.10.2012 17:23

Цитата:

это что? Вы из переданной в функцию строки экземпляр класса хотите создать?
представьте что в библиотеке 200 мувиклипов (А, В, С, D, и т д), каждый в настройках, экспортировал для ЭкшнСкрипт, соответственно для каждого создались классы А, В, С, D, и т д.

Код AS3:

 var ex = new mc();

я думал так можно вызвать экземпляр классов (А, В, С, D, и т д), но с возможностью самому указывать какой именно мне нужен в данный момент, в главном коде подставив вместо mc название нужного класса.

Isfet 18.10.2012 17:49

в конструктор можно передавать только экземпляры класса, но никак ни сам класс.
тут убираем mc:String
Код AS3:

public function Button_color (corX:Number = 200, corY:Number =200, color:uint = 0xffffff){

так создаем экземпляр экспортированного мувиклипа, который находится в библиотеке
Код AS3:

  var ex:A = new A();    //new B(); new C(); смотря какой класс вас интересует  
                  var button:MovieClip = new MovieClip();
                  button.graphics.beginFill(color);
          button.graphics.drawRoundRect(corX,corY,40,40,20,20);
          button.graphics.endFill();
          addChild(button);

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

 public function Button_color (corX:Number = 200, corY:Number =200, color:uint = 0xffffff, className:String){
var ex:MovieClip;
    if(className=="classA"){
        ex = new A():
    }
    else if(className=="classB"){
        ex = new B():
    }
}

и так далее

AlexLucas 18.10.2012 17:56

Если вы хотите задать строку в конструктор, и получить ссылку на класс, используйте getDefinitionByName() (как вам уже написал FlashRus)
Вместо
Код AS3:

var ex = new mc();

Код AS3:

var ClassReference:Class = getDefinitionByName(mc) as Class;
var ex:Object = new ClassReference();


bettyshort 18.10.2012 18:45

Isfet ваши заметки понял. Единственное, думаю таким методом я получу внешний скрипт огромных размеров. Но всёравно сначала попробую так как вы посоветовали.

Ребята, спасибо что отозвались на мою проблему.

PainKiller 18.10.2012 18:58

зачем тут getDefinitionByName()??
Если мувики в библиотеке импортированы в AS, то все прекрасно работает и так:
Код AS3:

createExampleOfClass (MyName);
 
function createExampleOfClass (className:Class):void
{
        var probe = new className ();
        addChild (probe);
}

пример накидал в кадре, MyName - класс мувика в библиотеке. Все работает, мувик появляется на сцене.


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

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