PDA

Просмотр полной версии : добавление на сцену в другом классе


In8Finity
27.02.2012, 13:00
Не могу понять в чём дело.
В классе Main добавляю на сцену пару объектов.
Потом вызываю функцию из другого класса, которая должна добавить ещё один объект на сцену.

package
{
import flash.display.*;
import flash.events.*;

public class Main extends Sprite
{
public var obj1:MovieClip;
public var obj2:MovieClip;

public function Main()
{
this.addEventListener( Event.ADDED_TO_STAGE, Function1 );
}


public function Function1(event:Event = null):void
{
obj1 = new Object1();
addChild(obj1);
obj2 = new Object2();
addChild(obj2);
Class2.Function2();
}
.....
и вторая функция
package
{
import flash.display.*;
import flash.events.*;

public class Class2 extends MovieClip
{
public static var obj3:MovieClip;

public function Class2()
{

}


public static function Function2():void
{
trace("111");
obj3 = new Object3();
addChild(obj3);
}
....

Строка trace работает, а дальше вываливается ошибка.
Error: Call to a possibly undefined method addChild. addChild(obj3);

Подскажите, Что я забыл или делаю неправильно?

Inet_PC
27.02.2012, 13:03
Function2 функция статическая, на кого вы собрались добавлять? Передавайте в нее stage или другой контейнер. Например так:
public static function Function2(container: DisplayObjectContainer):void
{
trace("111");
obj3 = new Object3();
container.addChild(obj3);
}
//и вызов
Class2.Function2(this);

P.S. методы нужно называть с маленькой буквы. И желательно давать осмысленные имена, а не Function1 и Function2, это относится к именам классов и всего остального.

Deimos747
27.02.2012, 13:05
В static функции можно использовать только статические методы, поэтому он у вам и не видит addChild.

In8Finity
27.02.2012, 13:09
Спасибо за синтаксис. Учту. Названия такие - это для тестового примера просто. Для реального примера - согласен - названия будут другие.
А тогда вопрос. Можно обойтись без использования статической функции в этом деле?
Я с классами только начал разбираться, и когда пробовал создать просто
public function Function2():void
оно ругалось так:
Error: Call to a possibly undefined method Function2 through a reference with static type Class.

Добавлено через 1 минуту
Или как передавать stage или другой контейнер?
В общем, как обычно решают такую ситуацию?

Wolsh
27.02.2012, 13:24
"Обычно" дети делают внуков, а не братьев и сестренок.
Мейн основной класс, папа всем и вся. Только он решает, кого добавлять в свой список детей, а кого нет.
Например, ваша Function2 могла бы возвращать дисплейный объект по запросу из Мейна, и Мейн этот объект добавлял бы в свой дисплейлист.
// Мейн:
public function Function1(event:Event = null):void
{
obj1 = new Object1();
addChild(obj1);
obj2 = Class2.getObject3();
addChild(obj2);
}

// Class2
public static function getObject3():DisplayObject
{
trace("111");
return new Object3();
}

In8Finity
27.02.2012, 16:16
Спасибо. С контейнером - получилось.
А вот ещё вопрос тогда.
В главном классе я хочу прослушать тычок мышей и вызвать метод из другого класса.
Вот так не работает.
menu2.button2.addEventListener(MouseEvent.MOUSE_DOWN, Class2.functionFromClass2);
Функция-приёмник во втором классе выглядит так:
public function functionFromClass2(e:MouseEvent):void
{
trace("!!!!!!!!!!");
}

Пришлось сделать так:
menu2.button2.addEventListener(MouseEvent.MOUSE_DOWN, CC);
}

private function CC(e:MouseEvent):void
{
Class2.functionFromClass2();
}
Ну и функцию-приёмник, конечно, тоже изменил:
public function functionFromClass2():void
{
trace("!!!!!!!!!!");
}
Заработало, но получилось немного сложнее. Неужели нельзя никак первым вариантом сделать?