PDA

Просмотр полной версии : Несколько вопросов связанные с некоторыми моментами AS


zackscript
04.01.2016, 15:00
Здрава всем.
Народ я новичок а AS 3 и у меня возникли несколько вопросов которые мешают идти дальше , просто появились некоторые недопонимания в ходе обучения , и если Вы не против то разрешите изложиться.
1.
This, да банальное this, его я вижу часто но сам не использую.
Как я понимаю this – это ссылка на объект и смотря где он пишется .
Наверное я сам отвечу на вопрос ну или Вы меня поправите на примере:
То есть:
package
{
public class MyClass
{
private var Name:String = "hi";
public function MyClass()
{
this.x += 100;
this.Name;
addChild(this);
}
}
}

и
package
{
public class MyClass
{
private var Name:String = "hi";
public function MyClass()
{
MyClass.x += 100;
MyClass.Name;
addChild(MyClass);
}
}
}

http://cs629226.vk.me/v629226723/2fdbe/Fd_XlpB19dQ.jpg
это одно и тоже так ведь, если нет то поправьте меня.
2.
Теперь о «super ()» . Как пишется в helpe инструкция super - вызывает суперклассовую или родительскую версию метода или конструктора, например:

Super () // Вызывает родительскую версию конструктора;
Super.method(“HI”) // Вызывает родительскую версию метода;
Super.prop // Вызывает родительскую версию свойства или такого не бывает ?

Если все не так то поправьте меня.
3.
Оператор “as” – он меня больше всех пугает. Как я понимаю интерпретатор проверяет нет ли у первого операнда (тип: Sprite) таких же свойств и методов как у и второго операнда (тип: MovieClip) и если таковой есть то Sprite может быть как и MovieClip так и Sprite то есть я могу использовать некоторые методы и свойства MovieClip для объекта Sprite(который уже movieclip) и наоборот.
4.
Обращение к объектам и символам. Здесь я затрудняюсь разобраться , сейчас поясню на примере:
Допустим имеется класс “B” в конструкторе которой будет для примера Кнопка и Мувик.
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
public class B extends Sprite
{
public var _btn:SimpleButton = Btn; // Кнопка и мувик уже перенесенные из библиотеки на сцену
public var _star:MovieClip = Star; // в ручную , имена написал в свойствах не в свойтвах символа
public function B()
{
_btn.x += 100;
_btn.addEventListener(MouseEvent.CLICK,onBtn);
}
public function onBtn(e:MouseEvent)
{
trace("HI");
}
}
}

и класс “A” где и создается объект “B”
package
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.Sprite;
import flash.events.MouseEvent;
public class A extends Sprite
{
private var _A:B;
public function A();
{
_A = new B();
addChild(_A);
}
}
}

Выходит ошибка:
Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at B

А так робит корректно:
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
public class A extends Sprite
{
public var _btn:SimpleButton = Btn;
public var _star:MovieClip = Star;
public function A()
{
_btn.x += 100;
_btn.addEventListener(MouseEvent.CLICK,onBtn);
}
public function onBtn(e:MouseEvent)
{
trace("HI");
}
}
}

не пойму почему.

ZackMercury
04.01.2016, 15:53
zackscript, всё не так. Класс - это не объект.
this - обращение к объекту(экземпляру класса).
Экземпляр класса - это то, что создаётся через new.
Каждый раз, когда вы создаёте экземпляр класса Tank - это будет новый танк, не тот, что был раньше.
MyClass.smth - обращение к статическому свойству.
as - приведение типа, проверяет, есть ли в цепочке наследования определённый тип, и если есть, возвращает объект с таким типом, он не проверяет свойства, а лишь цепочку наследования.
this/super пишется лауэркейсом.
1)
package
{
public class MyClass extends Sprite//у вас ошибка, нет у вашего класса свойства свойства x, а вот так всё ок
{
private var Name:String = "hi";
public function MyClass()
{
this.x += 100;
this.Name;
//addChild(this); - это непонятная фигня, добавление себя в себя (идентично this.addChild(this))
}
}
}
идентично
package
{
public class MyClass extends Sprite
{
private var Name:String = "hi";
public function MyClass()
{
x += 100;
Name;
}
}
}

Приставки this. и super. - необязательны, их можно опустить.
2)
Неправильно. super всегда пишется лауэркейсом. Во-первых, так красиво, во-вторых, это работает.
super () // Вызывает родительскую версию конструктора;
super.method(“HI”) // Вызывает родительскую версию метода;
super.prop // Вызывает родительскую версию свойства или такого не бывает ?
3)
MovieClip as Sprite работает потому, что MovieClip наследуется от Sprite.
https://pp.vk.me/c631924/v631924943/88e4/WB192Bvns_c.jpg
Sprite as MovieClip работать не будет.

4)
Допустим имеется класс “B” в конструкторе которой будет для примера Кнопка и Мувик.
В вашем коде кнопка и мувик не в конструкторе, а в свойствах экземпляра.
public function B()
{
_btn.x += 100;
_btn.addEventListener(MouseEvent.CLICK,onBtn);
}
Вот это - конструктор, не путайте его ни с чем другим.
Выходит ошибка:
Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at useBtn
Не вижу в коде функции useBtn.

не пойму почему.
Вероятно, класс A присобачен к мувику, в котором расположены Btn и Star, а B - нет.

zackscript
04.01.2016, 17:17
ZackMercury, с this почти разобрался , то есть если он и в методе некоего класса то это звучит так "задать такие то координаты и зарегистрировать событие текущему методу "
public function func()
{
this.x += 100;
this.addEventListener(MouseEvent.CLICK,onFunc);
}

с super тоже понятно.
А вот если MovieClip as Sprite приведу в тип то он может быть как и Спрайт так и МувиКлип ?

в 4-ой проблеме я сохранил кнопку и мувик в переменных что здесь не так то ? а в конструкторе я к переменной _btn повесил событие .
Вопрос в том как мне обратится к ним как манипулировать ими непосредственно в классе "B".
Или создать экземпляры кнопки и мувиклипа в конструкторе класса "B" и добaвить в список отображения но тогда придется программно задать им координаты и другие т.п. свойства а этого делать я не хочу.

КорДум
04.01.2016, 17:19
с this почти разобрался , то есть если он и в методе некоего класса то это звучит так "задать такие то координаты и зарегистрировать событие текущему методу "
Нет, в вашем примере this ссылается на все тот же экземпляр класса.
Напишите trace(this); и узнайте, что именно в this находится. Не бойтесь экспериментировать.

zackscript
04.01.2016, 17:20
Вероятно, класс A присобачен к мувику, в котором расположены Btn и Star, а B - нет.
Вы имеете ввиду сто класс A привязан к документу ?

Добавлено через 1 минуту
КорДум понятно.

ZackMercury
04.01.2016, 17:41
Вы имеете ввиду сто класс A привязан к документу ?
Или так, или связан с мувиком, в котором лежат ваши объекты.
... Если не писать this вообще, то всё станет очевидным.
this не имеет никакого отношения к методам, он ссылается на текущий экземпляр класса, в котором вызывается.
this.x или super.x, или просто x - всё одинаково будет работать, так как обращение происходит к свойству экземпляра.
this пишут либо те, кто привык писать this, либо там, где он действительно нужен(чтобы, например, передать ссылку на экземпляр текущего класса в другой класс).

Давайте я вам пример напишу, чтобы более понятно было.
class Main extends Sprite
{
public function Main()
{
var bucket:Bucket = new Bucket();
for(var i:int = 0; i < 10; i ++)
var apple:Apple = new Apple(bucket);

trace(bucket); // выведет 10 раз Apple через запятую
}
}

class Bucket
{
private var content:Array;
public function Bucket()
{
content = [];
}

override public function toString():String
{
var str:String = "";
for(var i:int = 0; i < content.length; i ++)
str += content[i].toString() + ((i == content.length - 1)?".":", ");
return str;
}

public function put(elem:*):void
{
content.push(elem);
}
}

class Apple
{
public function Apple(bucket:Bucket)
{
bucket.put(this);
}

override public function toString():String
{
return "Apple";
}
}

zackscript
04.01.2016, 22:33
Ну с 3-мя вопросами я разобрался а вот с 4-ой затруднения, серьёзно.
Главный класс "А" привязан к документу к Вашему сведению , на сцене же кнопка с именем "Btn" и мувик "Star".

Wolsh
04.01.2016, 22:46
Ну так класс В-то ничего о них не знает, они же в экземпляре документ-класса А.

Добавлено через 10 минут
То, что Вы называете "на сцене" — это экземпляр Документ-класса, в вашем случае — экземпляр А.
При запуске флэшки он будет создан автоматически и добавлен на стейдж. Это главный класс приложения, обычно называемый Main. Все остальное содержимое является его детьми. В частности, экземпляр класса В, который Вы создаете в первом примере. Но дети ничего не знают друг о друге. Только Мейн знает, кого и зачем он породил.
Кнопка и клип, нарисованные Вами на сцене, являются детьми А, создаваемыми "автоматически". Ссылки на них уже есть в А — это их Вы используете, создавая дополнительные переменные (по сути ненужные). Но в экземпляре класса В, конечно же, нет никаких данных о детях класса А, с чего бы.

Добавлено через 25 минут
ZackMercury
this.x или super.x, или просто x - всё одинаково будет работать, так как обращение происходит к свойству экземпляра.
this пишут либо те, кто привык писать this, либо там, где он действительно нужен(чтобы, например, передать ссылку на экземпляр текущего класса в другой класс).Я надеюсь, Вы это несерьезно?

ZackMercury
04.01.2016, 23:40
Wolsh, вполне серьёзно.
Пример смешной, не спорю, но иногда бывает нужно делать и такое (http://www.ant-karlov.ru/towerdefence3-perviy-vrag.html).
Согласен, это пример плохой архитектуры, но бывает делать что-то более глобальное для мелких проектов просто нет никакого смысла.

Psycho Tiger
05.01.2016, 00:29
override public function toString():String
{
var str:String = "";
for(var i:int = 0; i < content.length; i ++)
str += content[i].toString() + ((i == content.length - 1)?".":", ");
return str;
}

Почему-то здесь очень напрашивается .join :D

ZackMercury
05.01.2016, 01:00
Psycho Tiger, они класса Apple, разве не нужны строки, или у объектов вызывается toString()?

Wolsh
05.01.2016, 01:41
ZackMercury
Wolsh, вполне серьёзно.Я вообще о другом. В данном топике не идет речь об архитектуре, помилуйте. Я о том, что this.x и super.x идентичны только в одном случае — когда х не оверрайдится. Забивать новичку голову упрощенной до неверности информацией не следует, это лишает человека шанса, что паззл сложится и наступит понимание.
Допустим, ваш класс наследует Sprite. Вызов методов через super. гарантированно вызывает методы класса Sprite. То есть, в таком виде, в каком они реализованы в классе Sprite. Все эти привычные x, y, width, height, addChild() и т.п. — все они относятся к super. А те методы, которые Вы описали в своем наследнике, допустим fuelAvailable — относятся только к this. Кроме того, на практике довольно часто приходится перекрывать (override) сеттеры и геттеры width и height, то есть реализовывать их в наследнике иначе, чем в супер-классе Sprite (чтобы при изменении ширины и высоты наследник самостоятельно решал, что именно у себя "внутри" растянуть, а что переместить без масштабирования — стандартная ситуация для контейнера). Соответственно, у экземпляра появляется ДВА варианта метода — родительский метод класса Sprite, и свой собственный. Первый доступен через super., а второй через this. Так что x (this.x) и super.x могут быть ну очень разными. Сорри за занудство.

ZackMercury
05.01.2016, 01:56
Wolsh, я посчитал это очевидным.
Так как автор темы под вторым пунктом спросил о обращении к свойствам/методам суперкласса, мне показалось, что он понимает, что значит суперкласс, а что значит текущий класс.
Но тем не менее, теперь уж безвариантно он поймёт чем похожи this и super, и чем они отличаются, спасибо.

zackscript
05.01.2016, 12:48
Прочитал главу 29 К.Мук: про документы класса, Связанные классы для символов , Обращение к созданным вручную экземплярам символов ну толком интересного ничего.
Wolsh, то есть класс "В" ничего не знает что находится(объекты) в документе который связан с классом "А" ?

GBee
05.01.2016, 19:04
Например Человек - это класс, а вы - объект, экземпляр класса Человек.
1) this - это ваше внутреннее "я"
таким образом this.Name - это вы говорите "Мое имя". А MyClass.Name - это абсурд в данном контексте Человек - Вы.
var zack:Человек = new Человек();

2) Усложним. Человек содержит общие понятия - 2 ноги, 2 руки. Вы же уникальны, у вас есть, например рентгеновское зрение . То есть вы по сути расширяете класс Человек. Назовем его Зак. Вы к тому же и синглтон, но это потом. Так вот у класса Зак есть описание как работает рентгеновское зрение. И вы теперь, как объект экземпляр класса Зак, а не Человек, можете смотреть им, через метод "посмотреть". Но иногда вам надоедает смотреть на скелеты, и вы используете обычное зрение, как у обычного человека, и делаете это через super.посмотреть().
var zack:Зак = new Зак();

3) Со временем о вас узнали, и теперь иногда просят поглядеть болячки (паблик метод посмотретьБолячки). И вот вас пригласили в клуб для Человеков. Но вы то экземпляр класса Зак, НО который расширяет класс Человек и вас пропустят. Но как человека вас не могут просить смотреть болячки. И вам придется раскрыться.

function club(чел:Человек):void
{
чел.посмотретьБолячки(); //нельзя
(чел as Зак).посмотретьБолячки(); //Зя!
}

Добавлено через 2 минуты
Но тем не менее, теперь уж безвариантно он поймёт чем похожи this и super, и чем они отличаются, спасибо.
А чем они похожи? Тем что они указатели и зарезервированные слова и в обоих есть буква s?

ZackMercury
05.01.2016, 19:31
А чем они похожи?
Напомню, что автор темы поначалу думал, что this - это ссылка на scope метода.

Wolsh
05.01.2016, 20:30
Wolsh, то есть класс "В" ничего не знает что находится(объекты) в документе который связан с классом "А" ?"в документе который связан с классом" — звучит псевдонаучно, но смысл теряется. Тут вся заморочка в том, что Flash автоматически создает в документ-классе (А) переменные/свойства с названиями, которые Вы дали объектам на таймлайне*. Из-за этого у Вас возникает непонимание, почему в другом классе Вы не можете к ним обратиться — ведь в классе А Вы ничего особого для этого не делали. Flash сделал это за Вас — создал переменные, инициировал их, создав новые экземпляры классов кнопки и звезды, и поместил их в список отображения (Display List) экземпляра документ-класса. Весь этот автоматизм больше вредит чем помогает новичку понять механизм. Гораздо эффективней было бы начать с чистого листа, без таймлайна, без рисованных клипов, чисто вручную написать документ-класс, в котором (например) создать текстфилд с Hello, world! и вывести его в отображение. А так, во Flash, когда параллельно с вашими действиями еще один участник пишет свой код в тот же класс (причем Вы этот код не видите вообще), это только запутывает.
Отвечая на вопрос — ну да, конечно же, экземпляр класса В ничего не знает об устройстве класса А. Так же, как кнопка и звезда ничего не знают об экземпляре класса В. Каждый знает только то, что у него "внутри", то что он САМ создал. Иерархия.

* А в случае с А – наследником МувиКлипа – еще и делает это на уровне фреймов, а не "в теле класса", из-за чего невозможно бывает в первом кадре обратиться к объектам, которые появятся на пятом кадре.

zackscript
06.01.2016, 10:35
Wolsh, может мне вообще отказаться от клипов, этих фреймов на таймлайне ?
Гораздо эффективней было бы начать с чистого листа, без таймлайна, без рисованных клипов, чисто вручную написать документ-класс, в котором (например) создать текстфилд с Hello, world! и вывести его в отображение.
ну да можно все это проделать и задать свойство этому "TextField" например координаты по осям программно ,(что не хочется делать в некоторых случаях) надеюсь Вы поняли о чем я ?

Добавлено через 8 минут
Gbee, спасибо конечно но у меня вопрос который я задал ранее ,это если при приведении чел в zack - человек может быть и как человек и как zack ?

Wolsh
06.01.2016, 12:27
Wolsh, может мне вообще отказаться от клипов, этих фреймов на таймлайне ?От фреймов — да, желательно избавиться и начинать мыслить не "пришли в такой-то кадр", а "произошло такое-то событие". Но отказаться от клипов возможно только если они не нужны))) Если у Вас игра и куча анимаций врагов, взрывов, транспорта или порхающих сердечек и пукающих бабочками единорогов, возможно рановато отказываться от нарисованных во Flash мувиклипов.
при приведении чел в zack - человек может быть и как человек и как zack ?Не путайте только приведение и кастинг as. Кастинг это "проверка на пригодность", именно проверка, которая не меняет Тип (Класс) экземпляра. Здесь еще важно понять, что обычно компилятор проверяет Тип переменной, в которую записывается ссылка на экземпляр, а не Тип самого экземпляра. Компилятор оперирует Типом переменной, когда Вы ставите точку и видите список свойств и методов, доступных у данного Типа. Если Вы создадите переменную с Типом :Человек и запишите в нее ссылку на экземпляр подкласса Zack, Вы не сможете вызывать свойства и методы Zack, обращаясь к экземпляру через эту переменную. Но кастинг проверяет не переменную, а экземпляр, и может определить, что ссылка ведет на экземпляр именно Zack, и позволит Вам либо записать эту ссылку в новую переменную с Типом Zack, либо просто воспользоваться результатом кастинга
var man:Man = new Zack();
man.viewXRay(); // -> ERROR
(man as Zack).viewXRay(); // -> OK
var zack:Zack = man as Zack;
zack.viewXRay(); // -> OK
Приведение типов это совсем другое. Это преобразование одного типа в другой, даже если нет общей цепочки наследования — например строки в XML, массива в Vector, или числа в строку. Неявное приведение происходит всюду в вашем коде автоматически, когда Вы складываете строки и числа например, или пишете if(stage) {...}. В скобках после if должен быть Тип Boolean (true или false), а stage это совсем не Boolean, это визуальный класс Stage. И происходит автоматическое вычисление Boolean по принципу "null преобразуется в false, иначе true".
Формальное приведение осуществляется вызовом глобальной функции класса без оператора new, например
var xml:XML = XML(string);
var s:String = String(568);
Кастинг является "безопасной" операцией, так как не генерит исключение (Error) в случае неудачи. Если экземпляр не проходит кастинг, то кастинг "молча" возвращает null.
Приведение же в случае неудачи сгенерирует ошибку. Очень мало типов на самом деле могут быть преобразованы друг в друга. Мало того, результат такого преобразования не всегда очевиден и предсказуем))

Azrael
06.01.2016, 14:33
var man:Man = new Zack();
man.viewXRay(); // -> ERROR
(man as Zack).viewXRay(); // -> OK
var zack:Zack = man as Zack;
zack.viewXRay(); // -> OK


А восходящее преобразование тут не сработает?

Wolsh
06.01.2016, 20:49
А чего там преобразовывать, Zack уже содержит в себе Man.
То есть он Man и "кое что еще". В этом, простите, СМЫСЛ наследования.

zackscript
06.01.2016, 21:09
"в документе который связан с классом" — звучит псевдонаучно, но смысл теряется. Тут вся заморочка в том, что Flash автоматически создает в документ-классе (А) переменные/свойства с названиями, которые Вы дали объектам на таймлайне*. Из-за этого у Вас возникает непонимание, почему в другом классе Вы не можете к ним обратиться — ведь в классе А Вы ничего особого для этого не делали. Flash сделал это за Вас — создал переменные, инициировал их, создав новые экземпляры классов кнопки и звезды, и поместил их в список отображения (Display List) экземпляра документ-класса. Весь этот автоматизм больше вредит чем помогает новичку понять механизм.
Я кое где покопался ну так и ничего удовлетворительного не нашел , ладно, теперь осмелюсь спросить - как это можно реализовать ? (без добавление абджekтов в список отображения непосредственно в классе В )

Wolsh
06.01.2016, 21:30
"Можно" по-разному, а "нужно" — создавать детей в том классе, который ими управляет, в котором логика управления жизнью этих объектов. Какой смысл создавать объекты в одном классе и помещать их в его Список Отображения, а управлять ими из другого?
Есть еще другой вариант "взгляда" на иерархию, это концепция не "родители и дети", а "инструмент". Кнопка и Звезда у Вас это инструменты для решения какой то задачи класса В, который в свою очередь — инструмент класса А. То есть А создает В, чтобы тот выполнял какую-то определенную задачу, функцию. Создатель знает, какую именно и для чего, и что делать с событиями и данными, поступающими от экземпляра В. Знает, что они означают и на что влияют в текущем контексте задачи. Сам В этого не знает, этого контекста. У него есть заложенная в него ответственность — создать то-то и то-то, отобразить, слушать события от своих детей-инструментов и что-то важное диспатчить событиями наверх классу А. Для решения этой своей задачки он создает свои инструменты — кнопки и прочее. Кнопки, на самом деле, тоже создают в себе экземпляры графики, картинки или векторные шейпы, и тоже слушают нажатия на них и прочее. Уровень ответственности все ниже и ниже, чем дальше мы уходим от центра логики приложения — Документ-класса — тем меньше знают о происходящем инструменты. Конечный шейп или картиночка в кнопке уже вообще ничего не делает и никакого кода не содержит, кнопка только слушает мышиные события над собой и показывает/скрывает состояния (картинки), В слушает нажатия на кнопки и в зависимости от них что-то посылает классу А.
Важный момент Иерархии — объекты одного уровня не могут приказывать что-то друг другу в обход более старшего. Это он, старший, знает, зачем вообще они живут и что должны делать. Каждый воспитывает только своих детей и несет ответственность только за них.

zackscript
07.01.2016, 09:18
Фууух, можно пожалуйста ссылки на 4-ю проблему (реальные примеры).

Какой смысл создавать объекты в одном классе и помещать их в его Список Отображения, а управлять ими из другого?
нет я создал объекты в одном классе и поместил их в его Список Отображения, и создал объект этого класса в другом где в свою очередь поместил в С/О

Wolsh
07.01.2016, 13:09
Кнопка и Звезда у Вас создаются в Документ-классе.
Вы Документ-класс что ли поместили в список отображения класса В? :)

Добавлено через 37 минут
public var _btn:SimpleButton = Btn;
public var _star:MovieClip = Star;
Это не создание объектов. Это создание переменных _btn и _star.
Которые Вы пытаетесь инициализировать другими переменными Btn и Star, которых НЕТ в этом классе, они в классе А. Они созданы там автоматически программой Flash и инициализированы теми экземплярами, что Вы нарисовали на таймлайне и задали им имена, которые и стали автоматически названиями переменных класса А.

zackscript
07.01.2016, 17:17
Вы Документ-класс что ли поместили в список отображения класса В?
Вовсе нет.
Я просто хотел красиво структурировать классы, думал что если в Мэин-классе создать объект BClass(пример ниже) то BClass мог бы манипулировать объектами , кнопками, битмапы, звуки и т.д. ну как видите нечего не получается.:(
А вот если я привязал бы документ с классом BClass - робит.

Main
package
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
public class Main extends Sprite
{
private var _bclass:BClass;
public function Main();
{
_bclass = new BClass ();
addChild(_bclass);
}
}
}

BClass
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
public class BClass extends MovieClip
{
public function BClass()
{
Star.x += 200;
Btn.addEventListener(MouseEvent.CLICK,onBtn);
}
public function onBtn(e:MouseEvent)
{
trace("HI");
}
}
}

КорДум
08.01.2016, 01:47
Нужно передать в экземпляр BClass ссылки на объекты Star и Btn. То, что Вы хотите сделать — не разделение по классам, а разбиение кода по файлам с последующим инклюдом. Такого в AS3 нет (хотя, скажу честно, существует) и не принято. И да, переменные принято называть с маленькой буквы — исправьте instance name у Star и Btn.

zackscript
08.01.2016, 15:24
Нужно передать в экземпляр BClass ссылки на объекты Star и Btn.
Это как ? мне нужно star и btn сохранить в переменных и использовать так: объектВ.переменнаяstar(в конструкторе класса Main) ? только сильно бейте по рукам если написал глупость.
И еще у меня в Main такая ошибка, раньше не было такого но или я запутался пока копался в поисках ответа.
В строгом режиме:

1120: Обращение несуществующего свойства bclass.
1180: Вызов предположительно неопределенного метода addChild.
1120: Обращение несуществующего свойства bclass.


простой режим:

ReferenceError: Error #1065: Переменная star не определена.
at BClass()
at Main$cinit()
at global$init()

Wolsh
08.01.2016, 15:39
Простейший вариант:
— объявить в BClass публичные переменные public var btn:SimpleButton и public var star:MovieClip;
— в мейне создать экземпляр bclass:BClass;
— в мейне передать его переменным ссылки на объекты, bclass.btn = btn; bclass.star = star;

Второй вариант:
— в конструкторе BClass принимать параметры
public function BClass(btn:SimpleButton, star:MovieClip) {///}

Третий вариант — создать сеттеры — Вам наверное рановато.

ZackMercury
08.01.2016, 16:02
zackscript. Так не делается. Классы для другого, если вы не знали.

zackscript
09.01.2016, 13:31
Ok, соглашусь с Wolsh-ом и все же почему такая ошибка выскакивает , ведь у меня есть такой же похожий проект но там без ошибок.
ZackMercury, да знаю я для чего классы .

zackscript
17.01.2016, 14:22
Простейший вариант:
— объявить в BClass публичные переменные public var btn:SimpleButton и public var star:MovieClip;
— в мейне создать экземпляр bclass:BClass;
— в мейне передать его переменным ссылки на объекты, bclass.btn = btn; bclass.star = star;
Сделал так - как Вы написали, выходит такая ошибка:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at BClass()
at Main()

Wolsh
17.01.2016, 17:07
я должен что-то угадать? ОК, первая попытка: Вы используете переменные btn и star в конструкторе BClass, хотя они еще не инициализированы ссылками из Мейна.