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

Stalin45 12.01.2012 18:11

Как обратиться к экземпляру класса из другого класса?
 
Здравствуйте! Есть 2 файла - класса .as. И 1 скрепляющий .fla.
Собственно, вопрос: как прописать в коде 1 из классов обращение к экземпляру второго класса (данный экземпляр находится на stage файла .fla)?

Код AS3:

var mDx = stage.hero.x - this.x;
var mDy = stage.hero.y - this.y;

Название "hero" он не понимает (оно и понятно ).
Раньше вместо hero вычислял положение мыши (ведь, по сути, тоже объект на сцене), у неё есть зарезервированное имя, а вот к другому объекту как...

Jewelz 12.01.2012 18:24

если у вас персонаж действительно на сцену добавлен, то так
Код AS3:

stage.getChildByName("hero")


Stalin45 12.01.2012 18:35

Сделал так, как вы предложили:
Код AS3:

var mDx = stage.getChildByName("hero").x - this.x;
var mDy = stage.getChildByName("hero").y - this.y;

Выдает ошибку (не видит этот объект...):
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at characters::turret/movement()
at characters/game()
Идентичность названия сверил.

Stitch512 12.01.2012 21:15

Значит его там и нет. Вообще он врятли лежит на stage. getChildByName вызывать нужно не у stage, а у того класса куда добавляются "2 файла - класса .as" (скорее всего это и есть класс 1).

goodguy 12.01.2012 21:44

Если класс 1 является документ классом, то да, объект добавляется в экземпляр этого класса, а не на сцену

Stalin45 12.01.2012 23:01

Stitch512, так в том-то и дело, что я добавляю два классовых файла не к третьему классу, а на сцену файла .fla.
Следовательно, не получается создать код типа:
Код AS3:

public static var hero:robot = new TRobot();
addChild(hero);

Ведь я пишу это не в классе :(

goodguy, не совсем понял, что такое документ-класс.

HardCoder 12.01.2012 23:11

Класс 1
Код AS3:

public class Class1 {
  public var class2Obj:Class2;
  public function Class1(obj:Class2){
      class2Obj = obj.
      //теперь через переменную class2Obj мы можем обращаться к экземпляру второго класса
  }
}

Класс 2
Код AS3:

public class Class2 {
  public function Class2(){
 
  }
}

fla файл:
Код AS3:

var class2Ins:Class2 = new Class2();
var class1Ins:Class1 = new Class1(class2Ins);


Stalin45 12.01.2012 23:42

HardCoder, классный способ! Мне все ясно, но у меня уже голова идет кругом...
В fla записал следующие строки:
Код AS3:

 var hero:robot = new robot();
 var turret1:turret = new turret(hero);

В результате выдает ошибку:
1136: Incorrect number of arguments. Expected 0. Почему 0 ожидалось, если в конструкторе прописал 1 аргумент???

Код AS3:

        public class turret extends Sprite
        {
                public var target_:robot;
                internal var armour, health, energy, rotationSpeed:uint;
                internal var energyRegen:Number;
                public function turret(obj:robot)
                {
                        target_ = obj;
                        armour = 500;
                        health = 250;
                        energy = 40;
                        energyRegen = 0,1;
                        rotationSpeed = 2;
                }

И странно то, что если в fla попытаться создать экземпляр без аргументов, он все же пишет:
1203: No default constructor found in base class characters:turret.

HardCoder 12.01.2012 23:50

А что такое characters?

Stalin45 12.01.2012 23:55

2 файла as находятся в папке characters и, соответственно, в таком пакете.
Fla лежит в 1 директории с папкой characters.

Parez 13.01.2012 00:02

Stalin45, а вы точно создаёте непосредственно объект класса turret, а не объект класса из библиотеки, расширяющий turret? Просто такая ошибка обычно поэтому возникает.

Stalin45 13.01.2012 01:13

Parez, я добавлял именно базовый класс, описанный в файле as, но да, действительно, спасибо, проблему обнаружил (даже после удаления всех экземпляров объектов turret и связей с ними он выдавал ошибку, но! мне же нужен именно библиотечный класс (он графически оформлен).
Так как же создать библиотечный класс (CS4), принимающий аргумент?? Или, если так нельзя, как тогда графически оформить экземпляр?

P.S. И отсюда ещё важный вопрос: так а разве можно будет в коде файла turret.as записать в obj ссылку на библиотечный экземпляр? Он его распознает?

HardCoder 13.01.2012 01:22

Да, все просто. Создаете мувиклип. В свойствах пишете где class: turret. А где base class ничего не пишете. По умолчанию base class должен быть мувиклип. Пишете свой класс turret, где он принимает параметры. И создаете экземпляр
Код AS3:

var tur:turret = new turret(hero);

Добавлено через 3 минуты
А если не подходит вам такое, то способов столько, что мама дорогая.
Класс 1
Код AS3:

public class Class1 {
  public var class2Obj:Class2;
  public function Class1(){
  }
  public function init(obj:Class1):void {     
      class2Obj = obj.
  }
}

fla файл:
Код AS3:

var class2Ins:Class2 = new Class2();
var class1Ins:Class1 = new Class1();
class1Ins.init(class2Ins);


Stalin45 13.01.2012 01:40

Ура! Ну, наконец-то...все заработало как надо! Спасибо, HardCoder!
Использовал второй предложенный вами вариант.
Но, если у вас будет время, ответьте пожалуйста на вопрос:
Если мы базовый класс turret'а сделаем обычным MC, то не могу понять, где же тогда описать сам класс turret, ведь он уже описан в пакете characters (связь с которым мы поменяли на связь с MC)?

HardCoder 13.01.2012 01:53

Пишем класс
Код AS3:

public class turret extends Sprite
        {
                public var target_:robot;
                internal var armour, health, energy, rotationSpeed:uint;
                internal var energyRegen:Number;
                public function turret(obj:robot)
                {
                        target_ = obj;
                        armour = 500;
                        health = 250;
                        energy = 40;
                        energyRegen = 0,1;
                        rotationSpeed = 2;
                }

Не надо забывать что в свойствах мувиклипа есть две графы: class и base class! В графе class мы пишем класс turret (код которого выше). В графе base class мы пишем MovieClip. Все! Теперь наш мувиклип из библиотеки будет привязан к классу turret (код которого выше). И что бы создать экземпляр этого мувиклипа из библиотеки, нам надо
Код AS3:

var tur:turret = new turret(hero);


Stalin45 13.01.2012 02:06

Вы не совсем поняли, так где именно хранится код, описанный вами (напр., base class раньше был в папке characters в файле turret, а код для графы class - ?)? В директории файла fla или где-то ещё?

booksmaster 13.01.2012 02:16

Вот мой способ поиска чего бы то ни было та сцене

Код AS3:

private function getObjectByName(n:String,par:DisplayObjectContainer):DisplayObject{
for (var i:int = 0;i<par.numChildren;i++)
{
if (par.getChildAt(i).name==n) {return par.getChildAt(i);} else {if (par.getChildAt(i) is DisplayObjectContainer) {
var t:DisplayObject = getObjectByName(n,DisplayObjectContainer(par.getChildAt(i)));
if (t!=null) {return t}}}
}
return null;
}

Вот только ты должен знать свойство name искомого объекта. Я, обычно, даю имена всему важному, чтоб потом можно было обратиться таким способом. Вторым параметром указываешь this или контейнер в котором лежит твой .фла. Ищет функция во всех вложеных потомках, так что, если имя знаешь, то найдет стопудово.

HardCoder 13.01.2012 02:20

Ваш мувиклип turret - это всего лишь "мультик". Для того чтобы этот мультик имел свое поведение, свои свойства мы пишем для него класс. Код выше
Код AS3:

public class turret extends Sprite........

Теперь этот класс надо подключить к вашему мультику. В свойствах этого мувиклипа(в библиотеке) в графе class надо написать имя созданного класса: "turret".
Теперь написанный вами класс turret имеет код actionscript но кроме того он имеет и графическое представление в виде вашего мувиклипа из библиотеки.
Графа base class указывает на базовый класс. Базовый класс = это класс от которого унаследован ваш класс turret. Эту графу можно оставить пустую. Флеш сама установит базовый класс.
Не умею более грамотно обьяснить :(

Добавлено через 4 минуты
booksmaster, можно пример, где такое может пригодится?

Parez 13.01.2012 13:09

Ещё есть неплохой вариант привязывать графику из библиотеки к кастом классу. Сначала экспортируете ваш мувик из библиотеки для ActionScript. А в классе делаете импорт этого класса из библиотеки.
Код AS3:

import TestSymbol;

Дальше в конструкторе вашего кастом класса (расширяющего MovieClip) создаёте экземпляр класса из библиотеки и добавляете его в список отображения.

получается что-то вроде этого:

Код AS3:

import TestSymbol;
 
public class CustomClass extends MovieClip
{
      public function CustomClass():void
      {
            var clip:TestSymbol = new TestSymbol();
            addChild(clip);
      }
}

Сам очень часто так делаю.

p.s.
Либо, как вариант, чтобы класс был более универсальным, можно одним из аргументов в конструкторе передавать класс из библиотеки.
Код AS3:

public class CustomClass extends MovieClip
{
      public function CustomClass(visual:Class):void
      {
            var clip:DisplayObject = new visual();
            addChild(clip);
      }
}


HardCoder 13.01.2012 13:52

Parez, а в чем преимущество использования композиции, вместо банальной привязки мувиклипа напрямую к классу?

Добавлено через 1 минуту
Все, понял. Преимущество в том что не обязательно наследовать класс от MovieClip или Sprite, а можно от другого класса, конструктор которого принимает обязательные параметры.

Parez 13.01.2012 14:29

Цитата:

Parez, а в чем преимущество использования композиции, вместо банальной привязки мувиклипа напрямую к классу?
Вы имеете в виду, чем второй описанный мной вариант лучше первого?
Например, тем, что в конструктор можно передать любой графический класс уже в рантайме. Благодаря этому он более универсален. Или вы о другом?


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

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