0

你们的很多帮助:)。我的下一个问题在这里:)。

我在 MyTimer.as 和 Thief1_mc.as 影片剪辑类中有计时器。如何从 MyTimer 在舞台上添加Child(Thief1_mc)?一切看起来都很简单,唯一的问题是“舞台”属性。MyTimer 类不能发送“舞台”作为参数,因为它本身不在舞台上。我尝试在主类的舞台上添加 MyTimer,如 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(stage)”调用者

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();

        }
    }
}

}

4

1 回答 1

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()TimerViewThiefUpdaterView

如果您采用此方法并重新构建计时器在其中的工作方式Updater,我认为您将在您想要的地方,但具有更好的理解和结构。

于 2013-04-17T00:58:30.827 回答