佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1540|回复: 32

如何set timing???(已解决!!!!!)

[复制链接]
什么来的 该用户已被删除
发表于 2-6-2006 10:04 AM | 显示全部楼层 |阅读模式
就是所当过了20分钟我的mouse没动的话/或在某个frame停超过某时间的话它会自动从frame1或scene跳去别的frame.

懂怎样做吗??

[ 本帖最后由 什么来的 于 12-6-2006 02:29 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 2-6-2006 10:48 AM | 显示全部楼层
原帖由 什么来的 于 2-6-2006 10:04 AM 发表
就是所当过了20分钟我的mouse没动的话/或在某个frame停超过某时间的话它会自动从frame1或scene跳去别的frame.

懂怎样做吗??


Id_timeout = _global.SetTimeout(callbackfunction,duration_ms,parameters_for_callbackfunction);

_global.ClearTimeout(Id_timeout);

请自己想一下。
回复

使用道具 举报

什么来的 该用户已被删除
 楼主| 发表于 2-6-2006 03:28 PM | 显示全部楼层
可以说明一点吗??

我试将它放入,但没效果...
回复

使用道具 举报

发表于 2-6-2006 04:38 PM | 显示全部楼层
原帖由 什么来的 于 2-6-2006 03:28 PM 发表
可以说明一点吗??

我试将它放入,但没效果...


请考虑两个方面:
1)怎么知道鼠标停止了一段时间 ?
2)停止了多少时间后,才启动换frame ?

setTimeout 是到了某段时间ms为单位,然后就会执行程序一次。
clearTimeout 是在setTimeout执行之前,停止setTimeout。

学过 sleep,awake, notify 等概念吧。用这些东西去想想吧。Flash 好像没有sleep 的function
回复

使用道具 举报

发表于 3-6-2006 03:58 AM | 显示全部楼层
原帖由 donynam 于 2-6-2006 04:38 PM 发表


请考虑两个方面:
1)怎么知道鼠标停止了一段时间 ?
2)停止了多少时间后,才启动换frame ?

setTimeout 是到了某段时间ms为单位,然后就会执行程序一次。
clearTimeout 是在setTimeout执行之前,停止se ...



setTimeout和clearTimeout在AS是叫setInterval和clearInterval。
不用sleep,用onMouseMove來監聽事件後執行clearInterval即可



//example...

var a:Number;
var sec:Number = 1; //seconds
function setTimeout() {
    //your event here...
    clearInterval(a);
}

onMouseMove = function() {
    clearInterval(a);
    a = setInterval(setTimeout, sec*1000);
}

a = setInterval(setTimeout, sec*1000);

[ 本帖最后由 super-tomato 于 3-6-2006 08:46 AM 编辑 ]
回复

使用道具 举报

发表于 3-6-2006 10:32 PM | 显示全部楼层
原帖由 super-tomato 于 3-6-2006 03:58 AM 发表

setTimeout和clearTimeout在AS是叫setInterval和clearInterval。
不用sleep,用onMouseMove來監聽事件後執行clearInterval即可

//example...

var a:Number;
var sec:Number = 1; //seconds
fu ...


根据我之前设计screensaver的经验,使用setInterval,clearInterval,onMouseMove event,会造成不可预知的结果。最后可能导致系统资源不断的被flash 8 程序消耗。这可能是 setInterval,clearInterval 的内部缺陷有关。(之前的作品,其中onMouseMove函数的内容大致和你一样)

如果将设计改变,使用setTimeout,clearTimeout,OnMouseMove listener, 则没有发生系统资源不断被消耗的情况。

setTimeout,clearTimeout,在flash 8 里是内置,但无文件说明的函数。(这是一个非常神奇的事情,某些网友还开玩笑的说:“macromedia 在制作这个flash 8的时候忘记加入这个重要函数的说明档”)

不用重新写过。输入_global.setTimeout(var function_name:function,var duration:Number ,parameter1,parameter2,parameter3.....), _global.clearTimeout(setTimeoutid)就可以使用。
回复

使用道具 举报

Follow Us
发表于 4-6-2006 08:11 AM | 显示全部楼层
原帖由 donynam 于 3-6-2006 10:32 PM 发表


根据我之前设计screensaver的经验,使用setInterval,clearInterval,onMouseMove event,会造成不可预知的结果。最后可能导致系统资源不断的被flash 8 程序消耗。这可能是 setInterval,clearInterval 的内部缺 ...


_global.setTimeout我曾在Flash 8中列出過這個函數,但在class中調用卻有問題哦。


setInterval只要小心不讓frame做looping的話就沒什麽問題。

[ 本帖最后由 super-tomato 于 4-6-2006 08:14 AM 编辑 ]
回复

使用道具 举报

发表于 4-6-2006 12:16 PM | 显示全部楼层
原帖由 super-tomato 于 4-6-2006 08:11 AM 发表
_global.setTimeout我曾在Flash 8中列出過這個函數,但在class中調用卻有問題哦。

setInterval只要小心不讓frame做looping的話就沒什麽問題。


这是因为方法错误的关系.

正确的调用方法是
this.setTimeout(this:Object,function_to_be_called:String,duration:Number)

例子:在class里面, 使用this.setTimeout(this,"function_called",1000)
回复

使用道具 举报


ADVERTISEMENT

什么来的 该用户已被删除
 楼主| 发表于 6-6-2006 10:28 AM | 显示全部楼层
我照样酱做了:

var a:Number;
var sec:Number = 5.0; //seconds
function setTimeout() {
gotoAndplay(2);

    clearInterval(a);
}

onMouseMove = function() {
    clearInterval(a);
    a = setInterval(setTimeout, sec*1000);
}

a = setInterval(setTimeout, sec*1000);

------------------------------------------------

这我放在frame1.

我在frame 2 和3放了 stop();
当run时,它就跑去2然后是3 ,然后停在3。
当mouse动是它就在2 和 3 之间looping!!

为什么会酱??
回复

使用道具 举报

发表于 6-6-2006 01:35 PM | 显示全部楼层
原帖由 donynam 于 4-6-2006 12:16 PM 发表


这是因为方法错误的关系.

正确的调用方法是
this.setTimeout(this:Object,function_to_be_called:String,duration:Number)

例子:在class里面, 使用this.setTimeout(this,"function_called& ...


~_~ 這個我怎麼不知道﹐setInterval在 class 2.0 中所要使用 this 的教程我早在一年半前已寫過了。如果基本的 class 2.0 寫法這樣就已經可以執行了, 只是我的問題不在你們做到一些範圍內。不過還是謝謝你


class Test {
        public function Test() {
                init();
        }
        private function init()        {
                var This:Object = this;
                _root.onMouseDown = function()        {
                        _global.setTimeout(This.showText, 500, 'Super-Tomato');
                };
        }
        private function showText(param:String) {
                trace(param);
        }
}

[ 本帖最后由 super-tomato 于 6-6-2006 02:26 PM 编辑 ]
回复

使用道具 举报

发表于 6-6-2006 02:33 PM | 显示全部楼层
原帖由 什么来的 于 6-6-2006 10:28 AM 发表
我照样酱做了:

var a:Number;
var sec:Number = 5.0; //seconds
function setTimeout() {
gotoAndplay(2);

    clearInterval(a);
}

onMouseMove = function() {
    clearInterval(a);
    a =  ...



抱歉﹐因為臨時寫的代碼﹐沒測試。。。 onMouseMove的時候需要指定 gotoAndPlay(1);
回复

使用道具 举报

发表于 7-6-2006 01:47 AM | 显示全部楼层
原帖由 super-tomato 于 3-6-2006 03:58 AM 发表

setTimeout和clearTimeout在AS是叫setInterval和clearInterval。
不用sleep,用onMouseMove來監聽事件後執行clearInterval即可

//example...

var a:Number;
var sec:Number = 1; //seconds
fu ...


差点忘记了,不断的set 和 clear interval 会导致内存不断被消耗。

这种设计会有内存耗尽的危险。尤其是当用户不断的移动鼠标的时候。

所以我认为这种设计方法是一种错误的设计方法。

以下的方法可以避免这种内存严重消耗的局面。

var durationTime:Number = 0;
var islock:Boolean = true;
function onMouseMove() {
    _root.durationTime=0;
        _root.islock=true;
}

function Time_elapse(time:Number){ //How long do you want mouse consider in idle state?
        if (_root.durationTime<time){
        _root.durationTime+=1000;
                trace (_root.durationTime);
        }
        else{
                if (islock){
                        islock=false;
                    trace ("Do as you like"); //Do what you want to run after mouse is consider idle.
                }
        }
        return _root.durationTime;
}

setInterval(_root.Time_elapse,1000,10000); //if mouse sleep for ten seconds go Do as you like.
回复

使用道具 举报

发表于 7-6-2006 03:12 AM | 显示全部楼层
不斷的增加setInterval而沒正確的clearInterval才會造成 memory leak,這在 Flash Team 的blog已經提過了。而我們所使用 intervalID 其實是個pointer,它指向了 memory 的分配位置,學過 C 的都應該知道 allocation。只要clearInterval指對對象的話,就會把分配位置的部分設定為null,而非 undefined。

在 Flash 8 中,如果使用 setInterval 時 trace 一下,就可以知道其實内部是在循環運作 setTimeout,當然對於較短的代碼時使用 setInterval 我們不會忘記使用 clearInterval,也許在代碼長的情況下而忽略了就容易造成記憶体嚴重的被佔用。

再來是 setTimeout 在 Class AS2.0 中不方便應用的解決,是因爲 Flash 8 沒有設定 intrinsic。只要到所安裝的目錄下搜索 toplevel.as 打開並加入以下代碼即可。

intrinsic function clearTimeout(id:Number):Void;
intrinsic function setTimeout():Number;




抱歉,donynam 12樓所貼的 Time_elapse 再加上 updateAfterEvent(); 會比較完整。
回复

使用道具 举报

发表于 7-6-2006 11:04 AM | 显示全部楼层
原帖由 super-tomato 于 7-6-2006 03:12 AM 发表
不斷的增加setInterval而沒正確的clearInterval才會造成 memory leak,這在 Flash Team 的blog已經提過了。而我們所使用 intervalID 其實是個pointer,它指向了 memory 的分配位置,學過 C 的都應該知道 allocati ...


如果有必要用setInterval 模拟 setTimeout 可以使用以下的方法

        function setTimeout () {
                var timer = new Object();
                var interval = 0;
                var s = 0;
                if (typeof(arguments)=='object' || typeof(arguments[0])=='movieclip') timer.obj = arguments[s++];
                else timer.obj = null;
                timer.fn = (typeof(arguments)!='function')? timer.obj[arguments] : arguments;
                interval = parseInt(arguments[s+1]);
                timer.args = arguments.slice(s+2);
                if (typeof(timer.fn)!='function' || isNaN(interval)) return null;
                timer.id = this.available_(this.timeoutArray);
                timer.intid = setInterval(this, "execTimeout",interval,timer.id);
                this.timeoutArray[timer.id] = timer;
                return timer.id;
        }

function execTimeout (id) {
                clearInterval(this.timeoutArray[id].intid);
                var timer = this.timeoutArray[id];
                var tempobj:Object = new Object;
                tempobj = timer;
                var tempobj2:Object = new Object;
                tempobj2 = timer.obj;
                var tempargs = new Object;
                tempargs = timer.args;
                this.timeoutArray[id]=-1;
                tempobj.fn.apply(tempobj2,tempargs);
        }
基于flash 8的已经内置支持 setTimeout 所以就没有必要另写一个setTimeout 了。除非,有人想要将程序编译成flash 8之前的版本。
回复

使用道具 举报

什么来的 该用户已被删除
 楼主| 发表于 7-6-2006 11:20 AM | 显示全部楼层
原帖由 donynam 于 7-6-2006 01:47 AM 发表


差点忘记了,不断的set 和 clear interval 会导致内存不断被消耗。

这种设计会有内存耗尽的危险。尤其是当用户不断的移动鼠标的时候。

所以我认为这种设计方法是一种错误的设计方法。

以下的方法可以 ...



我发现好像有bug噢。。

就是当它继续用这方法时,它的时间会越来越快。

原本是放十秒的,它虽然一样走到十,但就是越来越快!!
回复

使用道具 举报

发表于 7-6-2006 02:20 PM | 显示全部楼层
原帖由 什么来的 于 7-6-2006 11:20 AM 发表

我发现好像有bug噢。。

就是当它继续用这方法时,它的时间会越来越快。

原本是放十秒的,它虽然一样走到十,但就是越来越快!!


请将你的程序贴上来再说。
回复

使用道具 举报


ADVERTISEMENT

发表于 7-6-2006 03:15 PM | 显示全部楼层
原帖由 什么来的 于 7-6-2006 11:20 AM 发表



我发现好像有bug噢。。

就是当它继续用这方法时,它的时间会越来越快。

原本是放十秒的,它虽然一样走到十,但就是越来越快!!



因為你沒使用clearInterval﹐而一直進行循環﹐就會產生這樣的問題。
如果是frame播放完再跳回的話﹐就把setInterval放在 onLoad 事件中就可以了
回复

使用道具 举报

什么来的 该用户已被删除
 楼主| 发表于 12-6-2006 09:09 AM | 显示全部楼层
http://i28.photobucket.com/albums/c230/leslie_wongsk/t.swf

他能在10秒里面回去我要的frame,但当他的二次实行时他的时间就回短过10秒!!

然后再实行时,时间就越短。。

我就是照着donynam  所写:

-----------------------

stop()
var durationTime:Number = 0;
var islock:Boolean = true;
function onMouseMove() {
    _root.durationTime=0;
        _root.islock=true;
}

function Time_elapse(time:Number){
        if (_root.durationTime<time){
        _root.durationTime+=1000;
                trace (_root.durationTime);
        }
        else{
                if (islock){
                        islock=false;
                   gotoAndPlay(1);
                }
        }
        return _root.durationTime;
}

setInterval(_root.Time_elapse,1000,10000);


------------------------------------------------------

super-tomata说酱setinterval放在onload,但里面都没onload!!

我去查onload的function了,是不是酱file load在flash 里面的啊??

.......

如何涅??!!?

[ 本帖最后由 什么来的 于 12-6-2006 09:16 AM 编辑 ]
回复

使用道具 举报

发表于 12-6-2006 10:00 AM | 显示全部楼层
原帖由 什么来的 于 12-6-2006 09:09 AM 发表
http://i28.photobucket.com/albums/c230/leslie_wongsk/t.swf

他能在10秒里面回去我要的frame,但当他的二次实行时他的时间就回短过10秒!!

然后再实行时,时间就越短。。

我就是照着donynam  所写:

- ...


你先制造一个layer,长度为程序最大不循环的时间。
然后将这个程序放在那个layer里面。

限制 setInterval(_root.Time_elapse,1000,10000) ,让它只能够被系统调用一次即可。

至于方法,就留给你自己想想吧。

请阅读有关flash frame 的相关文档。

[ 本帖最后由 donynam 于 12-6-2006 12:09 PM 编辑 ]
回复

使用道具 举报

什么来的 该用户已被删除
 楼主| 发表于 12-6-2006 02:35 PM | 显示全部楼层
在此我郑重的谢谢super-tomato和donynam 的帮忙!!!

让我的问题得以解决。。

以下就是那方法,但全都是他俩的杰作,实在paiseh...

-------------------------------------------------

stop()
var durationTime:Number = 0;
var islock:Boolean = true;
function onMouseMove() {
    _root.durationTime=0;
        _root.islock=true;
}

function Time_elapse(time:Number){
        if (_root.durationTime<time){
        _root.durationTime+=1000;
                trace (_root.durationTime);
                               
        }
        else{
                if (islock){
                        islock=false;
                   gotoAndPlay(1);
               clearInterval(a);
}
        }
        return _root.durationTime;

}

a=setInterval(_root.Time_elapse,1000,10000);

-------------------------------------------------------
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-9-2024 01:28 AM , Processed in 0.128427 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表