【问题标题】:AS3 My code delay doesn't work properlyAS3 我的代码延迟不能正常工作
【发布时间】:2014-01-11 01:13:36
【问题描述】:

在一个函数中,我试图通过以下方式延迟代码的执行:

var thinkTimer = setInterval(Actions(opp), C.THINK_TIME);

其中 Actions 是一个简单(经过测试的工作)函数,opp 是一个小整数,C.THINK_TIME 是一个常量 = 3000(3 秒)。

但使用 setInterval 我遇到了这个问题:函数 Actions 立即运行(不等待间隔),每 3 秒我在输出中收到此消息:

TypeError: 错误 #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null。 在 SetIntervalTimer/onTimer() 在 flash.utils::Timer/_timerDispatch() 在 flash.utils::Timer/tick()

这是怎么回事?我不是想加入一个引用对象为空的属性或函数! :-/

【问题讨论】:

    标签: actionscript-3 setinterval


    【解决方案1】:

    您必须将您的 Actions(opp) 调用包装到一个嵌套函数中,并将其名称提供给您的 setInterval 调用,如下所示:

    private var opp:int; // place this outside if you ever want to change opp at runtime
    // without changing the setInterval statement
    function actOpp():void { Actions(opp); } // wrapper
    var thinkTimer:uint = setInterval(actOpp, C.THINK_TIME);
    

    实际的错误是setInterval 想要一个Function 对象,而您正试图为其提供Actions(opp) 的函数输出。您的 Actions 函数很可能返回 void,这会导致您出现错误。

    如果您不想在运行时更改 opp,假设您希望 AI 在设定的时间段内检查某个 opp,请使用 setInterval 的扩展语法,如下所示:

    var thinkTimer:uint = setInterval(Actions, C.THINK_TIME, opp);
    

    然后您使用arguments[0] 语法在您的函数中检索传递的opp 值,或者,如果您在该函数中声明了一个参数,则照常使用其名称。请注意,使用此语法,如果您在别处更改变量的值,则传递给 Actionsopp 值不会改变。要覆盖,您可以使用opp 的包装函数,将其名称(或引用)作为参数传递给setInterval,然后在Actions 中接受该引用,调用该函数并接收当前的opp 值。

    希望对您有所帮助,如果您有任何问题,请在下方评论。

    【讨论】:

      【解决方案2】:

      不是每个人都说你的语言,但从错误代码来看,有些东西正在引用一个空对象,其中一个对象是空的,跟踪这一行之前的对象,看看哪个是“空”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多