#flash #actionscript-3
#flash #actionscript-3
Вопрос:
Я пытаюсь вызвать функцию в другой класс после события.
Вот мой код:
Из класса doucment:
public static function redrawMap():void {
removeChild(global.world);
var world:WorldHandler = new WorldHandler(40,30);
global.world = world;
addChild(global.world);
world.mask = MapArea;
}
Из класса, из которого я вызываю:
WorldDesign.clearButton.addEventListener(MouseEvent.CLICK, clearWorld);
public function clearWorld(evt:MouseEvent):void{
WorldDesign.redrawMap();
}
Я не могу заставить ее работать правильно, я получаю странные сообщения типа «Вызов неопределенного метода removeChild», и он указывает на функцию redrawMap. Это означает, что он нашел функцию, но, похоже, я ничего не могу с этим поделать.
Есть идеи?
Комментарии:
1.
removeChild
является методом экземпляра. Вы не можете вызвать ее изнутри статического метода.
Ответ №1:
Поскольку redrawMap является статическим методом, вам также необходимо вызвать removeChild и addChild, подобные статическим методам:
public static function redrawMap():void {
WorldDesign.removeChild(global.world);
var world:WorldHandler = new WorldHandler(40,30);
global.world = world;
WorldDesign.addChild(global.world);
world.mask = MapArea;
}
Ответ №2:
redrawMap()
был определен как static
метод. Это означает, что он не может получить доступ к каким-либо методам экземпляра, таким как removeChild()
.
Решением было бы сделать его методом экземпляра — определить его как public function redrawMap()
. Затем вы можете вызвать функцию через экземпляры. То есть вам нужно будет где-то создать экземпляр класса WorldDesign (предположительно, во время инициализации остальной части swf)
var worldDesign:WorldDesign=new WorldDesign();
Затем вы можете вызвать redrawMap() как
worldDesign.redrawMap()
Ответ №3:
Лучший способ — вообще не использовать статический метод. Для этого используйте шаблон Singleton.
class WorldDesign {
private static var _instance:WorldDesign;
public static function get instance():WorldDesign {
if(!_instance) _instance = new WorldDesign();
return _instance;
}
public function redrawMap():void {
removeChild(global.world);
var world:WorldHandler = new WorldHandler(40,30);
global.world = world;
addChild(global.world);
world.mask = MapArea;
}
}
И используйте WorldDesign.instance.redrawMap();