PDA

Просмотр полной версии : После присвоения Stage класса Main не видно публичных методов Main


Isfet
19.09.2012, 19:56
Хотел вообще знать как правильно обходиться со stage, покопавшись в нескольких исходниках понял что ей надо в свойствах присваивать класс, но после присвоения у меня в классе Main перестали видиться публичные методы, неужели такая манипуляция (в свойствах stage присваивать класс) делает этот класс статичным?
Если да, то как вызывать методы класса Main? делать их статичными и обращаться через класс?

bav
19.09.2012, 20:07
Покажите каким образом вы присвоили stage класс Main (через Document class?). И где теперь не видно публичных методов Main?

Isfet
19.09.2012, 20:18
вот таким макаром в свойтвах 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

Только это ОЧЕНЬ плохая практика, когда объект сам себя добавляет куда-то

Isfet
20.09.2012, 04:48
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. Пдскажите как по правильному?

fish_r
20.09.2012, 07:36
В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен null, то есть его фактически не существует. Инициализация объекта заканчивается тогда когда выполнится конструктор,и методы указанные в конструкторе ( а если в нем указана инициализация нижележащих объектов то и их конструкторы и методы указанные в них ). После этого можно обратиться уже к Майн, как к объекту.

По поводу второго примера strangedk вам уже подсказал, что обращаться из дочерних классов в родительские не корректно. Это создает проблемы при импорте в другие проекты и при отладке.
Чаще всего это решается диспатчем события из дочернего объекта о том, что его сост. изменилось. Родительский объект получает это событие и решает что в связи с этим он должен делать как и чье состояние он должен изменить и т.д.

Isfet
20.09.2012, 08:22
а можете поправить мой код,чтобы было понятно, как нужно диспатчить клик Child-а, и как потом вызывать функцию Main класса?

silin
20.09.2012, 09:48
В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен 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

}
}
в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)

Isfet
20.09.2012, 12:31
в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)
ну суть в том, как обращаться к this.parent.perent.perent.parent as Main например, как доставать этот класc? Не хочется во всех детей передавать его.
Хранить статический метод, который вытаскивает ссылку на Main класс? Стоит ли Stage присваивать класс Main?
Как в таком случае оращаться к Main из детей(можно обращаться this.root as Main но не знаю правильно ли это)? Как я понял что когда Document class ставишь Main он становится статичным, и как тогда к нему обращаться из детей?

fish_r
20.09.2012, 13:25
однако небольшой эксперимент показывает, что это не так
да, а я то иначе считал (http://www.flasher.ru/forum/showthread.php?t=173074&page=3)

silin
20.09.2012, 16:59
ну суть в том, как обращаться к 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

}
}

Isfet
21.09.2012, 05:38
нет в AS статичных классов, как нет никаких хитрых чудес при определении документ класса
Тогда почему когда я класс документа делаю Main у меня дети не видят публичные функции Main (точнее видят ,но не вызывают), видят только статичные.? Пример в 5 посте.

fish_r
21.09.2012, 09:03
в лом перечитывать все, но в той ветке немного о другом вроде бы
вот смотри...

ага, я понял, что тогда сделал неправильные выводы.

Добавлено через 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 лишняя закрывающая скобка, вначале. Этот пример вообще должен выбрасывать ошибку.

Isfet
21.09.2012, 10:15
5 пост писал в качестве примера "на коленке", ошибся немного , извиняюсь, исправил, суть в том что document class = Main, он добавляет в себя obj1, а obj1 добавляет в себя obj2, а затем я из obj2 обращаюсь к Main через root и у меня не вызываются публичные методы Main, ошибка, как будто они приватные.

silin
21.09.2012, 17:11
пример, использующий недоступные классы, нельзя запустить и увидеть в чем трабл

вот попытка реконструировать твою структуру, но она почему-то работает
попробуй поломать, чтоб перестала, может тогда разберемся
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
}
}
}

Isfet
22.09.2012, 09:04
странно, у меня тоже работает. а когда документу присваиваешь класс нужно еще какие-то настройки выставлять во flash cs5 или просто тупо в свойтвах документа присваеваешь ему класс и все должно работать? а то заметил такую закономерность: качаю исходник чужой, сохраняю его в другую папку, копирую туда свой код - не работает, прям в исходник вставляю свой код - работает.

fish_r
22.09.2012, 11:51
а вы пакет указываете в строке для документ-класса? Это обязательно иначе ИДЕ документ-класс не найдет и создаст свой.

Isfet
23.09.2012, 06:54
ну да прописываю там classes.Main