2013-04-17 5 views
0

много помощи от вас, ребята :). Мой следующий вопрос здесь :).AS3 Как добавить класс на сцену из таймера?

У меня есть таймер в классе MyTimer.as и Thief1_mc.as. Как я могу добавитьChild (Thief1_mc) на сцене из MyTimer? Все выглядит просто, единственная проблема - это свойство «stage». Класс MyTimer не может отправлять «этап» в качестве аргумента, потому что он не находится на самой сцене. Я попытался добавить MyTimer на сцене в Main class, например addChild (MyTimer), трассировка говорит, что MyTimer находится на сцене, но я до сих пор не могу передать аргумент этапа Thief1_mc. Мне нужен этот аргумент для отправки, потому что класс Thief1_mc должен добавить себя на сцену, используя свойство «stage».

Код:

public class Thief1_mc extends MovieClip 
{ 

    //this variable type Stage will contain stage 
    private var stageHolder:Stage; 

    public function Thief1_mc() 
    { 
     //constructor 
    } 

    //function that creates this object with passed "stage" argument from the caller 
    public function createItself(st):void 
    { 
     //variable that contain the stage so I can use this argument anywhere in the class 
     stageHolder = st; 
     //i have to refer to the stage by passed "st" parameter to create this object 
     stageHolder.addChild(this); 
     //initial position 
     this.x = 380; 
     this.y = 230; 
    } 

} 

}

MyTimer класс и "_thief1.createItself (этап)" Вызывающий со стадией arument

public class MyTimer extends Sprite 
{ 
    private static var nCount:Number = 120; 
    private static var currentCount:Number; 
    private static var _timer:Timer = new Timer(1000,nCount); 

    private static var _timerDispather:Timer; 
    private static var _thief1:Thief1_mc = new Thief1_mc ; 

    public function MyTimer() 
    { 
     // constructor code 
    } 

    //another timer 
    private static function increaseInterval(interval:int):void 
    { 
     _timerDispather = new Timer(interval); 
     _timerDispather.addEventListener(TimerEvent.TIMER, onUpdateTimeAnotherTimer); 
     _timerDispather.start(); 
    } 
    //another timer; 
    private static function onUpdateTimeAnotherTimer(e:Event):void 
    { 

     _thief1.createItself(stage);//the most important part 
    } 

    public static function activateTimer():void 
    { 
     currentCount = nCount; 
     _timer.addEventListener(TimerEvent.TIMER, onUpdateTime); 
     _timer.start(); 
    } 

    public static function deactivateTimer():void 
    { 
     _timer.removeEventListener(TimerEvent.TIMER, onUpdateTime); 
     _timer.stop(); 
     _timer.reset(); 
     currentCount = nCount; 

     //another timer 
     _timerDispather.removeEventListener(TimerEvent.TIMER, onUpdateTimeAnotherTimer); 
     _timerDispather.stop(); 
     _timerDispather.reset(); 
    } 

    private static function onUpdateTime(e:Event):void 
    { 
     currentCount--; 


     if (currentCount == 0) 
     { 
      _timer.removeEventListener(TimerEvent.TIMER, onUpdateTime); 
      _timer.stop(); 
      _timer.reset(); 

     } 
    } 
} 

}

+0

Просто выбросьте это, ваша функция createItself (st): void должен быть создан сам (st: Stage): void. –

ответ

1

Ваш код в обратном направлении в нескольких местах. Это не течет очень хорошо, и проблемы, которые у вас возникают сейчас, будут на десять раз на вашем этапе.

Во-первых, ваш класс MyTimer не должен распространяться на Sprite. Он не отображается и не представляет ничего графически.

Во-вторых, ваш класс таймера занимает больше, чем нужно. Я бы пересмотрел его, чтобы управлять только вашими таймерами и событиями таймера. Создайте список в вашем классе таймера, который будет содержать некоторые другие элементы, которые могут иметь триггеры метода для выполнения других действий, например создание и добавление Thief1_mc.

Упрощенно это может выглядеть следующим образом:

public class Updater 
{ 

    private var _timer:Timer; 
    private var _toUpdate:Vector.<IUpdatable> = new Vector.<IUpdatable>(); 


    public function Updater() 
    { 
     _timer = new Timer(60); 
     _timer.start(); 
     _timer.addEventListener(TimerEvent.TIMER, _notifyUpdatables); 
    } 


    private function _notifyUpdatables(e:TimerEvent):void 
    { 
     for each(var i:IUpdatable in _toUpdate) 
     { 
      i.update(this); 
     } 
    } 


    public function addUpdatable(updatable:IUpdatable):void 
    { 
     _toUpdate.push(updatable); 
    } 


    public function removeUpdatable(updatable:IUpdatable):void 
    { 
     var index:int = _toUpdate.indexOf(updatable); 
     if(index >= 0) _toUpdate.splice(index, 1); 
    } 

} 

Отсюда нам нужно создать интерфейс, который мы будем реализовывать на классы, которые мы хотим, чтобы быть в состоянии назвать update() на каждый раз, когда Updater таймера клещи :

public interface IUpdatable 
{ 
    function update(updater:Updater):void; 
} 

Теперь то, что я хотел бы сделать в вашем случае есть класс, который делает расширить Sprite и управляет графику приложения/игры. Он будет реализовывать интерфейс IUpdatable, как я описал, а также может иметь дело с добавления вашего Thief1_mc:

public class View extends Sprite implements IUpdatable 
{ 

    public function update(updater:Updater):void 
    { 
     // Create a Thief. 
     var thief:Thief = new Thief(); 

     updater.addUpdatable(thief); 
     addChild(thief); 
    } 

} 

Ваш Thief может воспользоваться интерфейсом IUpdatable мы имеем и быть добавлены в очередь обновления, когда он будет создан, как и Я сделал это выше. Просто, чтобы иметь полный пример, вот класс Thief:

public class Thief extends Sprite implements IUpdatable 
{ 

    public function update(updater:Updater):void 
    { 
     // Make this Thief so some stuff. 
     // 
    } 

} 

А вот как вы можете связать все это вместе в классе документа:

public class App extends Sprite 
{ 

    private var _updater:Updater; 
    private var _view:View; 


    public function App() 
    { 
     _updater = new Updater(); 
     _view = new View(); 

     _updater.addUpdatable(_view); 

     stage.addChild(_view); 
    } 

} 

Это может быть немного подавляющим сначала, и похоже, много работы, но теперь у вас есть хорошая чистая основа, чтобы легко добавлять элементы.

Вместо того, чтобы ваш один класс пытался управлять таймерами и добавлять воров, как вы изначально, мы отделили обязанности и немного подтянули поток. Updater имеет дело только с хранением IUpdatable экземпляров и вызывает их метод update() каждый раз, когда в нем гаснет Timer. Класс View управляет графикой, а также добавляет Thief каждый раз, когда он обновляется через Updater. Сначала на сцену был добавлен View, поэтому все, что вам нужно сделать, это добавить воров в себя, чтобы они отображались.

Если вы возьмете это и перестройте, как работают таймеры в пределах Updater, я думаю, вы будете там, где хотели, но со значительно более глубоким пониманием и структурой.

+0

+1 Это было красиво написано –

+0

Спасибо за ваш ответ. Я рассмотрю ваш код, но мне кажется, что это сложно усложнить для такой простой задачи. В основном мне нужно создавать объект на сцене каждый раз, когда MyTimer тикает. Моя самая большая проблема здесь заключается в том, что MyTimer не может получить доступ к этапу свойств, даже если MyTimer добавлен на сцене главным классом!?! Ну, я знаю, что если объект находится на стадии, он должен иметь доступ к свойству сцены ??? Еще раз спасибо Marty – irnik

+0

@irnik Конечно, ради исправления вашей конкретной проблемы как можно скорее сделайте статический метод в своем классе MyTimer, например 'public static function setState (stage: Stage)', который затем устанавливает свойство внутри класса которые вы можете использовать для обозначения сцены. – Marty

 Смежные вопросы

  • Нет связанных вопросов^_^