ActionScript 3.0 - MVC模式

 

MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。

MVC模式能使界面(Viwe)和数据(Model)能有效的分开,由控制器(Controller)去控制。

我们现在以一个比较简单的电子时钟的例子来看看如何使用MVC模式来架构我们的程序.

首先我们来看一下Model,Model按照我的理解是数据,就是所有的共用数据都是存储在Model里面的,时钟里有这样的数据,小时,分钟,秒;现在我们来建立一个Model,ModelLocator.as:

// ModelLocator.as

package net.smilecn.clock.model{ 

    

    import flash.events.EventDispatcher;

    import flash.events.Event;



    // 需要用dispatchEvent发消息出去

    public class ModelLocator extends EventDispatcher{

    

        private var _hour:String;

        private var _minutes:String;        

        private var _second:String;

        

        public function ModelLocator():void{

        }

        

        public function get hour():String{

            return _hour;

        }

        

        public function set hour(value:String):void{

            _hour = value;

            dispatchEvent(new Event("changeHour"));

        }

        

        public function get minutes():String{

            return _minutes;

        }

        

        public function set minutes(value:String):void{

            _minutes = value;

            dispatchEvent(new Event("changeMinutes"));

        }

        

        public function get second():String{

            return _second;

        }

        

        public function set second(value:String):void{

            _second = value;

            dispatchEvent(new Event("changeSecond"));

        }

    

    }

    

}

 

// Controller.as

package net.smilecn.clock.control{

    

    import flash.utils.Timer;

    import flash.events.TimerEvent;

    

    import net.smilecn.clock.model.ModelLocator;

    

    public class Controller{

        

        private var _model:ModelLocator;

        private var _timer:Timer;

        

        public function Controller(model:ModelLocator):void{

            _model = model;

        }

        

        public function startTime():void{

            _timer = new Timer(1000,0);

            _timer.addEventListener(TimerEvent.TIMER,timerHandler);

            _timer.start();

        }

        

        private function timerHandler(event:TimerEvent):void{

            var nowDate:Date = new Date();

            _model.hour = nowDate.getHours()>9?String(nowDate.getHours()):"0"+nowDate.getHours();

            _model.minutes = nowDate.getMinutes()>9?String(nowDate.getMinutes()):"0"+nowDate.getMinutes();

            _model.second = nowDate.getSeconds()>9?String(nowDate.getSeconds()):"0"+nowDate.getSeconds();

        }

        

    }

}

这个类中我们用到了Timer类,因为我们用的是时钟,所以需要一个定时器,Timer是一个很好的定时器,Timer(1000,0),这里1000是指1000毫秒,就是1秒钟触发一次定时钟,0表示次数,这里0是无限次,如果是大于0的数就是这个数的次数。侦听TimerEvent.TIMER事件就是1秒钟去执行一次timerHandler方法,timerHandler方法的功能是得到当前的时间然后去改变_model里面的值,再看一下ModelLocator.as里面的代码,当hour,minutes,second的值改变的时候就会去发消息出去,那么谁来侦听这些消息呢,当然是View,现在来看下View.as:

// View.as

package net.smilecn.clock.view{

    

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.text.TextField;

    

    import net.smilecn.clock.model.ModelLocator;

    import net.smilecn.clock.control.Controller;

    

    public class View extends Sprite{

        

        private var _model:ModelLocator;

        private var _controller:Controller;

        private var time_txt:TextField;

    

        public function View(model:ModelLocator,controller:Controller):void{

            _model = model;

            _controller = controller;

            time_txt = new TextField();

            addChild(time_txt);

            _model.addEventListener("changeHour",changeTimeHandler);

            _model.addEventListener("changeMinutes",changeTimeHandler);

            _model.addEventListener("changeSecond",changeTimeHandler);

            

            _controller.startTime();

        }

        

        private function changeTimeHandler(event:Event):void{

            time_txt.text = _model.hour+" : "+_model.minutes+" : "+_model.second;

        }

    

    }

}

在View里面,侦听了_model的事件,所以当收到数据改变的消息后,将_model的数据显示到文本框中。

要使程序运行,我们现加一个文档类:

package net.smilecn.clock{

    

    import flash.display.Sprite;

    

    import net.smilecn.clock.model.ModelLocator;

    import net.smilecn.clock.control.Controller;

    import net.smilecn.clock.view.View;

    

    public class Clock extends Sprite{

        

        private var _model:ModelLocator;

        private var _controller:Controller;

        private var _view:View;

        

        public function Clock():void{

            _model = new ModelLocator();

            _controller = new Controller(_model);

            _view = new View(_model,_controller);

            addChild(_view);

        }

        

    }

}

在文档类中建立了ModelLocator、Controller、View的实例,ModelLocator产生的实例被传到了Controller和View中,这样就保证了Controller和View使用是相同的ModelLocator,其实要达到这种效果不用这种方法也可以,可以用到上一节中用到的单例模式。

这里作一个总结,Controller是一个控制者,它去改变ModelLocator,ModelLocator的数据被改变后去更新View,使我们能看到数据。如果界面上有一些按钮交互,那么就应该是Controller去响应View里的按钮交互,响应后去通过一些操作后改变ModelLocator,ModelLocator数据改变后通知View去改变界面。

有人可以会说这个程序用更少的代码就可以完成,但这里只是演示程序的架构,当程序很大时,好的架构会使程序更清晰。

转载:http://blog.csdn.net/arrowyoung/archive/2008/03/13/2178384.aspx

 

AS基础

-----------------------------------
做过Flash动画的Flash爱好者们都知道,要做好一个Flash动画,AS是必不可少的,即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识。
首先我们要了解AS要写在什么地方,什么时候AS会被触发执行。
1、帧:
写在关键帧上面的AS,当时间轴上的指针走到这个关键帧的时候,就写在这个帧上面的AS就被触发执行了。常见的例子有在影片结尾的帧写上 stop() 等。操作方法就是点选关键帧,然后打开AS面板。
2、按钮:
不同于帧上面的AS,按钮上面的AS是要有触发条件的。要把AS写在按钮上,操作方法是点选目标按钮,然后打开AS面板。举个例子能说的更明白。
假设有一个动画,要让它在播放完同时停止,那么,你要做的就是在这个动画的最后一帧写AS
stop();
再假设有个按钮,效果是按下按钮后停止播放,那么步骤如下。
做一个按钮,放到主场景,点选按钮,然后打开AS面板。现在如果也在按钮上写
stop();
那么,输出的时候就会提示错误。正确的应该这样写
on(release){
  stop();
}
这里要比帧的动画多这些代码: on(release){} , 整个代码翻译过来就是:
当(松开){
  停止
}
红色的代码表示鼠标的触发事件事件之一,这里用的是 release 松开,按钮的常用事件:
release         松开
releaseOutside  在按钮外面松开
press           按下
rollOver        鼠标进入按钮的感应区
rollOut         鼠标离开按钮的感应区  
现在很明确了:写在按钮上面的AS一定就是这种格式的:
on(事件){要执行的代码}
3、MC(电影剪辑)
如果你看懂了上面的内容,那么写在MC上面的AS和写在按钮上的大同小异。操作方法就是点选MC,然后打开AS面板。看个例子
onClipEvent(load){
  stop();
}
同样,MC需要一个事件来触发AS的执行。翻译这段代码就是
当剪辑(载入){
  停止
}
红色代码同样表示一个事件。MC的事件有下面这些:
load 载入,当MC出现的时候执行。也就是除非卸载这个MC,否则load事件内的代码只执行一次
unload 卸载,当MC卸载的时候执行
enterFrame 存在的每个帧。在MC存在的每个帧都要执行一次代码。如果你的场景有100个帧,有个MC从41帧开始出现到100帧才消失,那么这个MC上面的代码执行了60次
mouseDown 按下鼠标,在场景内任何地方都算。和按钮不一样的地方
mouseMove 移动鼠标,只要移动鼠标就执行代码
mouseUp 松开鼠标
同样你要明确:写在MC上的代码一定总是这种格式:
onClipEvent(事件){代码}

 

FLASH中常用语法关键字及语句(不断更新ing)

1、指令语句:
break 跳出最近的循环体(do...while,while...,for...,for(in)...)
continue 用在循环体内,表示忽略之后的语句,直接进入下一轮循环
#include "filename" 引入一个外部脚本文件:
var variable 定义一个局部变量(只在函数体内有效)
return [expression] 跳出函数体(并返回一个值)
new func(...) 新建一个对象,并用func构造函数进行构造
delete variable 删除一个变量,使其变为未定义
2、判断语句({}内语句数为1时{}可省):
if (expression1) {
statement(s)1
} else if (expression2) {
statement(s)2
...
} else {
statement(s)n
}
当expression1为true时执行statement(s)1,当expression2为true执行
statement(s)2……否则执行statement(s)n。{}内语句数为1时{}可省。
ifFrameLoaded ([scene,] frame) {
statement(s)
}
当场景scene的帧frame已经载入时,执行statement(s)。
3、循环语句({}内语句数为1时{}可省):
while (expression) {
statement(s)
}
当expression的值为true时反复执行statement(s)直到expression的值为false。
do {
statement(s)
} while (expression)
反复执行statement(s)直到expression为false。{}内语句数为1时{}可省。
for (statement1; expression; statement2) {
statements(s)
}
先执行statement1,当expression的值为true时反复执行statement(s),并在执行
完一轮后执行一次statement2,直到expression的值为false。
for (variable in obj_mc) {
statements(s)
}
variable依次取obj_mc的各成员名称,反复执行statements(s),直到所有成员都
取过一遍。
4、对象操作语句({}内语句数为1时{}可省):
with (obj_mc) {
statement(s)
}
对obj_mc进行操作,凡statement(s)里用到的与obj_mc的成员名相同的变量、函数
、影片片段,都指代obj_mc的成员。
tellTarget (mc) {
statement(s)
}
对mc进行操作,凡用到的变量、函数、影片片段,只要未指明绝对路径,都指代mc
的成员。
5、函数及事件:
function func(variable1, variable2, ...) {
statement(s)
}
定义一个函数。函数体内this对象指代调用该函数的对象或影片片段,未用var定义
的变量(非形参)从属于该函数所在的影片片段。func名称省略时该复合语句返回
一个类型为"function"的值,用以指代该函数。
on (mouseEvent) {
statement(s)
}
只能用在按钮的动作里。mouseEvent的可取值为:
press 鼠标键在按钮上按下
release 鼠标键在按钮上松开
releaseOutside 鼠标键在按钮区域外松开
rollOver 鼠标滑过按钮
rollOut 鼠标滑出按钮
dragOver 鼠标有键按下时滑过按钮
dragOut 鼠标有键按下时滑出按钮
keyPress(key) key键被按下,key为ASCII码字符或Key对象常量
各事件可用逗号分隔,当有一事件成立时就执行statement(s)。
onClipEvent (clipEvent) {
statement(s)
}
只能用在影片片段的动作里。clipEvent的可取值为:
load 该影片片段已载入
unload 该影片片段被卸载
data 用loadVariableNum载入数据后或用loadMovie载入影片的每个影片片段后
enterFrame 播放至该影片片段所在帧(若停在该帧则反复执行)
mouseMove 鼠标移动
mouseDown 鼠标键按下
mouseUp 鼠标键松开
keyDown 键盘键按下
keyUp 键盘键松开
各事件可用逗号分隔,当有一事件成立时就执行statement(s)。
flash中的常量及全局函数
1、常量:
true 逻辑真。
false 逻辑假。
null 空值,可与未定义值相等(但类型不同)。如variable未定义时,
variable == null为true。
NaN 表示Not a Number,即非数值量。用于表征数值计算时发生的非数值型错
误。如:1 * 'a'就得NaN。
newline 表示换行符,即'\n'。
Infinite 表示无穷大数值。如:-1 / 0得-Infinite。
2、数值运算函数:
= Number(expression)
将expression转化成数值,expression为false、null或未定义时返回0,
为true时返回1,无法转化时返回NaN。如:Number("12e2")返回1200。
= Boolean(expression)
将expression转化成布尔值。expression的值为false、null、"false"或
为字符串且Number(expression)为NaN或0则返回false,否则返回true。
= int(expression)
将expression转化成数值后取整。如:int("-1.2")返回-1。
= random(num)
随机返回0到num-1(num必须正整数)的某一个整数。
= isFinite(expression)
判断expression转化成数值后是否为有限量。比如isFinite(1/0)返回
false。
= isNaN(expression)
判断expression是否为非数值量。
= parseInt(expression, num)
把expression先转化为字符串后再按num进制理解转化为整数。比如:
parseInt(12, 16)返回18。
= parseFloat(string)
把字符串转化为浮点数。如:parseFloat("1.2e-2")返回0.012。
3、字符串运算函数:
= String(expression)
将expression转为字符串。expression的值可为布尔值、数值、一般对象
(返回"[object][object]")、数组对象(返回各项的值列表)、影片片
段(返回绝对路径)。
= chr(num)
返回ASCII码值为num的对应字符。
= ord(char)
返回字符char所对应的ASCII码值(8-bit)。
= length(string)
返回string长度(即字符个数)。
= substring(string, start_num, length_num)
返回string中第start_num(需>=0,否则取0)个字符开始,长度为
length_num(需>=0,否则忽略)的子串。若length省略或过界,则返回
start_num之后的整个子串。
= mbchr(num)
返回ASCII码值为num的对应双字节字符。
= mbord(char)
返回双字节字符char所对应的ASCII码值(16-bit)。
= mblength(string)
返回string的双字节长度。
= mbsubstring(string, start_num, length_num)
返回string中第start_num个字符开始,长度为length_num的子串。
= escape(string)
将一般字符串译成URL编码格式的字符串。如escape("1&2")返回"1%262"。
= unescape(string)
将URL格式的字符串解码成一般字符串。如unexcape("%D7%D4%D4%DA")返
回"自在"。
注:字符串按双字节字符处理时,双字节字符(如中文字符)代表一个整体。比如
字符串"I'm 自在幻想",用在length函数时返回12,而用在mblength函数时返回8。
4、其他函数:
= getProperty(mc, property)
返回影片片段mc的property属性值。
= targetPath(mc)
返回影片片段mc的绝对路径字符串。如主场景下的一个影片片段名为mc1,
则targetPath(_root.mc1)返回"_level0.mc1"。
= eval(target)
返回目标路径字符串target所指代的变量、对象或影片片段实例。如上例
中eval("_root.mc1")返回影片片段mc1实体。
= getTimer()
返回影片从开始播放到当前的时间间隔(毫秒单位)。
= getVersion()
返回系统平台及FlashPlayer的版本。如返回"WIN 5, 0, 30, 0"表示当前
系统为Windows,FlashPlayer的版本为5.0r30。

你可能感兴趣的:(actionscript)