查看: 1551|回复: 32
|
如何set timing???(已解决!!!!!)
[复制链接]
|
|
就是所当过了20分钟我的mouse没动的话/或在某个frame停超过某时间的话它会自动从frame1或scene跳去别的frame.
懂怎样做吗??
[ 本帖最后由 什么来的 于 12-6-2006 02:29 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 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)就可以使用。 |
|
|
|
|
|
|
|
发表于 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) |
|
|
|
|
|
|
|
楼主 |
发表于 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噢。。
就是当它继续用这方法时,它的时间会越来越快。
原本是放十秒的,它虽然一样走到十,但就是越来越快!!
请将你的程序贴上来再说。 |
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
你先制造一个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);
------------------------------------------------------- |
|
|
|
|
|
|
| |
本周最热论坛帖子
|