Просмотр полной версии : После присвоения Stage класса Main не видно публичных методов Main
Хотел вообще знать как правильно обходиться со stage, покопавшись в нескольких исходниках понял что ей надо в свойствах присваивать класс, но после присвоения у меня в классе Main перестали видиться публичные методы, неужели такая манипуляция (в свойствах stage присваивать класс) делает этот класс статичным?
Если да, то как вызывать методы класса Main? делать их статичными и обращаться через класс?
Покажите каким образом вы присвоили stage класс Main (через Document class?). И где теперь не видно публичных методов Main?
вот таким макаром в свойтвах stage прописываем класс
28473
потом допустим
package classes{
import classes.timeScale.TimeScale;
}
public class Main extends Sprite {
public function Main() {
drawTimeScale();
}
private function drawTimeScale ():void {
var timeScale:TimeScale= new TimeScale(this);
}
public function tracer ():void {
trace("функция класса Main");
}
}
}
package classes.timeScale {
import classes.Main;
public class TimeScale extends TimeScaleDragger {
public function TimeScale(main:Main) {
main.addChild(this);
main.tracer(); //тут ничего не выводит
}
}
}
strangedk
20.09.2012, 00:42
Вот всё в точности до наоборот - будет работать :)
Главный класс на то и главный, что он должен всё решать и всем руководить.
Что вам мешает сделать так:
package classes {
public class Main extends Sprite {
public function Main() {
drawTimeScale();
}
private function drawTimeScale ():void {
var timeScale:TimeScale= new TimeScale();
addChild(timeScale);
tracer();
}
public function tracer ():void {
trace("функция класса Main");
}
}
}
Добавлено через 1 минуту
Речь о том, что это одно и то же по факту
addChild(timeScale); в классе Main, и
main.addChild(this); в классе TimeScale
Только это ОЧЕНЬ плохая практика, когда объект сам себя добавляет куда-то
package classes{
import classes.timeScale.TimeScale;
import classes.dateScale.DateScale;
public class Main extends Sprite {
private var dateScale:DateScale;
public function Main() {
drawTimeScale();
drawDateScale();
}
private function drawTimeScale ():void {
var timeScale:TimeScale= new TimeScale();
addChild(timeScale);
}
private function drawDateScale ():void {
this.dateScale = new DateScale();
addChild(dateScale);
}
public function getVarFromDateScale ():void {
this.dateScale.getValue();
}
}
}
package classes.timeScale {
import classes.Main;
public class TimeScale extends TimeScaleDragger {
public function TimeScale() {
var obj1:Obj1 = new Obj1();
this.addChild(obj1);
}
}
}
package classes.timeScale {
public class Obj1 extends Sprite {
public function Obj1() {
var obj2:Obj2 = new Obj2();
this.addChild(obj2);
}
}
}
package classes.timeScale {
public class Obj2 extends Sprite {
public function Obj2() {
this.addEventListener(MouseEvent.CLICK,onMClick);
}
public function onMClick(e:MouseEvent) {
(this.root as Main).getVarFromDateScale();//здесь не видно функции getVarFromDateScale()
}
}
}
//то есть изначально все делалось для того чтобы я из класса в глубине мог обратиться сразу к Main(чтобы root указывал на Main, а не на Stage), мне нужно из класса, который лежит в Main вытащить какое-либо значение. Как такое осуществляется? Читал где то что нужно ссылку на Main передавать напрямую в конструкторы, и не обращатся через root. Пдскажите как по правильному?
В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен null, то есть его фактически не существует. Инициализация объекта заканчивается тогда когда выполнится конструктор,и методы указанные в конструкторе ( а если в нем указана инициализация нижележащих объектов то и их конструкторы и методы указанные в них ). После этого можно обратиться уже к Майн, как к объекту.
По поводу второго примера strangedk вам уже подсказал, что обращаться из дочерних классов в родительские не корректно. Это создает проблемы при импорте в другие проекты и при отладке.
Чаще всего это решается диспатчем события из дочернего объекта о том, что его сост. изменилось. Родительский объект получает это событие и решает что в связи с этим он должен делать как и чье состояние он должен изменить и т.д.
а можете поправить мой код,чтобы было понятно, как нужно диспатчить клик Child-а, и как потом вызывать функцию Main класса?
В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен null, то есть его фактически не существует. Инициализация объекта заканчивается тогда когда выполнится конструктор,и методы указанные в конструкторе ( а если в нем указана инициализация нижележащих объектов то и их конструкторы и методы указанные в них ). После этого можно обратиться уже к Майн, как к объекту.
однако небольшой эксперимент показывает, что это не так
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main():void
{
var timeScale:TimeScale = new TimeScale(this);
}
public function tracer():void
{
trace( "Main.tracer" );
}
}
}
import flash.display.Sprite;
class TimeScale extends Sprite
{
public function TimeScale(main:Main)
{
graphics.beginFill(0xC0C0C0);
graphics.drawRect(0, 0, 50, 50);
main.addChild(this);
main.tracer(); //Main.tracer
}
}
в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)
в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)
ну суть в том, как обращаться к this.parent.perent.perent.parent as Main например, как доставать этот класc? Не хочется во всех детей передавать его.
Хранить статический метод, который вытаскивает ссылку на Main класс? Стоит ли Stage присваивать класс Main?
Как в таком случае оращаться к Main из детей(можно обращаться this.root as Main но не знаю правильно ли это)? Как я понял что когда Document class ставишь Main он становится статичным, и как тогда к нему обращаться из детей?
однако небольшой эксперимент показывает, что это не так
да, а я то иначе считал (http://www.flasher.ru/forum/showthread.php?t=173074&page=3)
ну суть в том, как обращаться к this.parent.perent.perent.parent as Main например, как доставать этот класc? Не хочется во всех детей передавать его.
Хранить статический метод, который вытаскивает ссылку на Main класс? Стоит ли Stage присваивать класс Main?
Как в таком случае оращаться к Main из детей(можно обращаться this.root as Main но не знаю правильно ли это)? Как я понял что когда Document class ставишь Main он становится статичным, и как тогда к нему обращаться из детей?
root и есть ссылка на экземпляр документ класса флешки, так и обращаться
нет в AS статичных классов, как нет никаких хитрых чудес при определении документ класса (по сути он всегда есть, только когда он явно не определен IDE\компилятор генерят его сами)
да, а я то иначе считал (http://www.flasher.ru/forum/showthread.php?t=173074&page=3)
в лом перечитывать все, но в той ветке немного о другом вроде бы
вот смотри
package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
public class Main extends Sprite
{
public var timeScale:TimeScale;
public function Main():void
{
timeScale = new TimeScale(this);
}
public function tracer():void
{
trace( "Main.tracer" );
}
}
}
import flash.display.Sprite;
class TimeScale extends Sprite
{
public function TimeScale(main:Main)
{
// на этот момент main.timeScale еще не определена
// все происходит до присваивания timeScale ссылки на экземпляр
trace( "main.timeScale : " + main.timeScale );// main.timeScale : null
// но сам-то main в порядке
trace( "main : " + main );// main : [object Main]
// и методы его тоже
main.tracer();// Main.tracer
}
}
нет в AS статичных классов, как нет никаких хитрых чудес при определении документ класса
Тогда почему когда я класс документа делаю Main у меня дети не видят публичные функции Main (точнее видят ,но не вызывают), видят только статичные.? Пример в 5 посте.
в лом перечитывать все, но в той ветке немного о другом вроде бы
вот смотри...
ага, я понял, что тогда сделал неправильные выводы.
Добавлено через 6 минут
Тогда почему когда я класс документа делаю Main у меня дети не видят публичные функции Main (точнее видят ,но не вызывают), видят только статичные.? Пример в 5 посте.
Посмотрите внимательно на код. Вы создаете не экземпляр Ojb1, а просто новый спрайт, который никак не связан с obj2, значит Ojb2 у вас вообще не инициализируется и вызов метода из майн не происходит.
package classes.timeScale {
import classes.Main;
public class TimeScale extends TimeScaleDragger {
public function TimeScale() {
var obj1:Sprite = new Sprite();
this.addChild(obj1);
}
}
}
Добавлено через 21 минуту
а здесь (http://www.flasher.ru/forum/showpost.php?p=1096657&postcount=3) в Main лишняя закрывающая скобка, вначале. Этот пример вообще должен выбрасывать ошибку.
5 пост писал в качестве примера "на коленке", ошибся немного , извиняюсь, исправил, суть в том что document class = Main, он добавляет в себя obj1, а obj1 добавляет в себя obj2, а затем я из obj2 обращаюсь к Main через root и у меня не вызываются публичные методы Main, ошибка, как будто они приватные.
пример, использующий недоступные классы, нельзя запустить и увидеть в чем трабл
вот попытка реконструировать твою структуру, но она почему-то работает
попробуй поломать, чтоб перестала, может тогда разберемся
package classes
{
import classes.timeScale.TimeScale;
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main()
{
drawTimeScale();
}
private function drawTimeScale():void
{
var timeScale:TimeScale = new TimeScale();
addChild(timeScale);
}
public function getVarFromDateScale():void
{
trace( "Main.getVarFromDateScale" );
}
}
}
package classes.timeScale
{
import flash.display.Sprite;
public class TimeScale extends Sprite
{
public function TimeScale()
{
var obj1:Obj1 = new Obj1();
this.addChild(obj1);
}
}
}
package classes.timeScale
{
import flash.display.Sprite;
public class Obj1 extends Sprite
{
public function Obj1()
{
var obj2:Obj2 = new Obj2();
this.addChild(obj2);
}
}
}
package classes.timeScale
{
import classes.Main;
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Obj2 extends Sprite
{
public function Obj2()
{
this.addEventListener(MouseEvent.CLICK, onMClick);
this.graphics.beginFill(0xFF0000);
this.graphics.drawRect(0, 0, 60, 60);
}
public function onMClick(e:MouseEvent):void
{
(this.root as Main).getVarFromDateScale(); // Main.getVarFromDateScale
}
}
}
странно, у меня тоже работает. а когда документу присваиваешь класс нужно еще какие-то настройки выставлять во flash cs5 или просто тупо в свойтвах документа присваеваешь ему класс и все должно работать? а то заметил такую закономерность: качаю исходник чужой, сохраняю его в другую папку, копирую туда свой код - не работает, прям в исходник вставляю свой код - работает.
а вы пакет указываете в строке для документ-класса? Это обязательно иначе ИДЕ документ-класс не найдет и создаст свой.
ну да прописываю там classes.Main
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.