APP下载

AS3中四种循环执行任务的方法选择策略探析

2014-07-28秦伟

电脑知识与技术 2014年18期
关键词:调用间隔代码

秦伟

摘要:在编写Actionnscrip3.0脚本中,经常涉及到间隔循环执行某些任务的情况,通常可以使用Timer对象、eventFrame事件、setInterval()函数以及setTimeout()函数4种形式实现循环执行任务的功能。文章通过分析四种形式的运行机制及异同点,实例解析其功能为使用和选择各种方法来为编程实践提供参考。

关键词:Actionnscrip;循环;定时

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)18-4305-02

Strategy of Selecting Four Cycle Task Execution Method in AS3

QIN Wei

(College of Education Science, Tongren University, Tongren 554300, China)

Abstract: When the Actionnscrip3.0 script is programmed, we often face conditions of interval loop to perform certain tasks, you can often use 4 kinds form of the Timer object, eventFrame events, setInterval () function and setTimeout () function to achieve function of circular task execution. Through four forms of the analysis of the operation mechanism and the differences and similarities, example analysis for its function provide reference for programming practice as the selection and use of various methods.

Key words: Actionnscrip; Loop; Time

1 概述

Actionnscrip3.0(简称As3)是一种强大的面向对象编程语言,设计 As3 的意图是创建一种适合快速地构建效果丰富的互联网应用程序语言,这种语言以支持类型安全、代码维护轻松、编写简单、响应高效等优点已成为 Web 体验的重要部分[1]。在使用Flash软件进行设计与制作过程中经常涉及到使用As3脚本语言来实现间隔循环执行某一任务的代码设计,由于Flash软件本身的特性,我们习惯采用的循环语句while,for等语句来实现这些需求是不太容易的,所以了解Timer对象、eventFrame事件、setInterval()函数以及setTimeout()函数四种形式的原理机制及特性对实现循环执行任务的功能是非常重要的。

2 运行原理解析

2.1 Timer对象

通过构造Timer对象的实例的同时设置好delay,repeatCount两个参数来设置延迟时间和重复次数,delay的设置以毫秒计,设置好这两个参数后就会按照设置的时间延迟定时循环执行已编好的代码。如:

var timer:Timer = new 函数名(时间间隔,重复次数);

timer.addEventListener(TimerEvent.TIMER, 函数名);

function函数名(event:TimerEvent):void{函数体}

调用start()方法启动timer实例:timer.start();

2.2 eventFrame事件

Event对象中的ENTER_FRAME公共常量实现该功能主要是通过帧频来实现。每当Flash运行器执行一次预定屏幕更新检查的时候它调度Event.ENTER_FRAME事件。注册以接收Event.ENTER_FRAME通知的任何函数都被反复执行。由任何Event.ENTER_FRAME事件监听器做出的可见变化在它退出之前被描绘,这就是Event.ENTER_FRAME做动画的原理。如:

stage.addEventListener(Event.ENTER_FRAME, 函数名);

function函数名(e:Event):void {函数体}

2.3 setInterval()函数

setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象。setInterval有两种语法格式。

格式一:setInterval(函数名,时间间隔[arg1,arg2,..argn]), arg1,arg2,..argn为传递给函数的参数。如:

function 函数名(){函数体} setInterval(函数名,时间间隔);

格式二:setInterval(对象名,方法名,时间间隔[,arg1,arg2,.....argn]),其中对象名参数指定从Object对象派生的对象,方法名制定object参数中要调用的方法。arg1,arg2,..argn为传递给函数的参数。如:

myobj=new Object(); myobj.interval=函数名(){函数体}

setInterval(myobj,"interval",时间间隔);

2.4 setTimeout()函数

setTimeout()函数的使用方法与setlnterval()函数的使用方法相同,在指定的延迟(以毫秒为单位)后运行指定的函数。setTimeout()函数的一般形式为:endprint

setTimeout(函数名,时间间隔,函数参数);

function 函数名() {函数体 }

setTimeout(函数名,时间间隔);

3 四种形式的异同点与选择策略

1)对于一般的应用程序,当帧代码量不大,执行代码的时间小于帧频且执行帧代码的时间都小于Timer对象、eventFrame事件、setInterval()函数以及setTimeout()函数方法设定的时间间隔时,你选用那一种方法都是可以的,如下面实例中雪花的下落是间隔执行的,通过四种方法调用Snow类实现下雪效果:首先编写Snow.as的类文件,代码如下:

package{ import flash.display.*; import flash.events.*;

public class Snow extends Sprite{ public function Snow(){函数体}},

在Snow.as类文件的相同目录下,编写xh.fla文档,在xh.fla文档的第一帧编写帧代码都能实现调用上面的Snow类实现下雪效果,且他们的效果及执行时间没有多大区别。四种方法编写的代码如下:

使用Timer对象实现:

import Snow; var timer:Timer = new Timer(1,1000); timer.start();

timer.addEventListener(TimerEvent.TIMER,函数名);

function函数名(e:TimerEvent):void

{var xh:Snow=new Snow(); addChild(xh); }

使用eventFrame事件实现:

import Snow; stage.addEventListener(Event.ENTER_FRAME,函数名);

function 函数名(e:Event):void {var xh:Snow=new Snow(); addChild(xh);}

使用setInterval()函数实现:

import Snow; setInterval(函数名,50);

function 函数名():void { var xh:Snow=new Snow(); addChild(xh); }

使用setTimeout()函数实现:

import Snow; setTimeout (函数名,50);

function 函数名():void { var xh:Snow=new Snow(); addChild(xh); }

2) 尽管Timer、setTimeout()函数、setInterval()函数看似提供了一个完全随意的方式来在一个间隔时间之后执行一个函数,但它们任然依赖于Flash运行器的帧速率。对于setTimeout()函数、setInterval()函数如果时间间隔大于Flash运行器的帧速率,会以帧速率调用函数。对于Timer当一个TimerEvent.TIMER事件设置为运行得比帧速率更不频繁的时候,它将执行于下一次预定屏幕更新的时间间隔之后。为了请求更新于下次预定更新前,必须使用TimerEvent类的实例方法updateAfterEvent()。所以在基于速度的动画制作选用Timer、setTimeout()函数、setInterval()函数来实现间隔执行任务是没有多大区别的,在高版本的脚本中多选用Timer对象来实现该功能。

3) 在必须使程序内容的显示同步于手工创建的基于帧内容的显示的基于内容的脚本设计中,多使用eventFrame事件。且在Flash运行器中的帧速率的变动当做是可以接受的时候,也多使用eventFrame事件。因为使用基于eventFrame事件的动画代码一般要比基于Timer、setTimeout()函数、setInterval()函数更简单和使用较少的内存。

4)特别对于Timer对象,避免使用单个的Timer对象来移动单个的显示对象。只要有可能,使用一个单个的Timer对象来编制所有的动画。当然如果你想在不同时间更新不同的对象,单独的Timer对象可能更合适。

5) 四种方式执行间隔循环后都应用相应的方式结束执行任务,要不会出现内存被大量占用,函数重复调用等问题使动画运行不流畅。一般结束Timer对象的方法用Timer实例的stop()方法;结束eventFrame事件用removeEventListener()函数来删除;清除setInterval()的调用,使用clearInterval()函数;清除setTimeout()的调用,使用clearTimeout()函数。

4 结束语

总之,对于任何一门语言设计代码时都应了解该语言的一些基本语法,各种语句及函数的用法。在As3中对Timer对象、eventFrame事件、setInterval()函数以及setTimeout()函数的原理机制及各种方法及特征有一定的认识才能在设计间隔循环执行任务时使自己编写的脚本更简单、高效。

参考文献:

[1] (美)温妮,著,罗楷,译.ActionScript 3.0基础教程[M].北京:人民邮电出版社,2012:11-20.endprint

猜你喜欢

调用间隔代码
间隔问题
核电项目物项调用管理的应用研究
间隔之谜
LabWindows/CVI下基于ActiveX技术的Excel调用
创世代码
创世代码
创世代码
创世代码
基于系统调用的恶意软件检测技术研究
上楼梯的学问