免费预览已结束,剩余19页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AS3从零基础学习类 一个简单的类先写一个简单的类,了解一下类的结构: package public class MyClass public function MyClass() 这里是一个类的简单结构,package是包的意思。假设现在项目存放在d:exam这个文件夹,那么这个类直接保存在d:exam中,取名叫MyClass.as (注意:类的文件名应该跟类名需一样)。如果代码写成这样:package net.smilecn public class MyClass public function MyClass() 那么MyClass.as就应该放在d:examnetsmilecn这个路径下面。其中: public class MyClass:表示要创建的这个类的名字是MyClass(类名可以任意取,习惯以大写开头)。 public function MyClass(): funciton代表一个方法名(可以说是函数),跟类名相同的方法,称为构造函数,就是这个类被实例化时执行的函数。现在把代码改成: package net.smilecn public class MyClass public function MyClass() trace(这是写的第一个类); 在d:exam下建立一个FLA文件,在第一帧写如下代码: import net.smilecn.MyClass;var myClass:MyClass = new MyClass(); 那么在输出面板里就会输出“这是写的第一个类”。其中: import net.smilecn.MyClass:导入写的类(类在使用前要导入net.smilecn是包名,MyClass是类名)。 var myClass:MyClass = new MyClass(): 实例化MyClass这个类(实例化的时候会执行构造函数,那么就会执行trace这句代码)。成员常量、变量和方法首先看一段代码: package net.smilecn public class MyClass public const PI:Number = 3.1415926; public var r:Number; private var s:Number; public function MyClass() trace(这是写的第一个类); 在前面的基础上增加了几行代码,其中:const是定义常量,var是定义变量,所谓的常量就是不能改变的量,变量就是能够改变的量;public、private是属性关键字。在ActionScript 3.0中属性关键字有这样几个: public:指定类、变量、常量或方法可用于任何调用者。 private:指定变量、常量或方法仅可供声明或定义它的类使用。 protected:指定变量、常量、方法或命名空间只可用于定义它的类及该类的任何子类。 internal:指定类、变量、常量或函数可用于同一包中的任何调用者。下面主要说明public、private这两个属性关键字。从字面上理解public是公共的意思,说简单点就是任何地方都可以调用;private是私有的意思,就是说只有这个类中才可以调用。举例说明,在前面用的FLA文件中的第一帧加上这个的代码: import net.smilecn.MyClass; var myClass:MyClass = new MyClass(); myClass.r = 3; /正确 myClass.s = 18; /错误 可以看到因为r声明为public,所以在外部调用是正确的,s声明为private,所以不直接在外部访问s这个变量,这就是public和private的区别。如果要在外部改变s的值,则可以修改MyClass类,如下: package net.smilecn public class MyClass public const PI:Number = 3.1415926; public var r:Number; private var s:Number; public function MyClass() trace(这是写的第一个类); public function setSValue(value:Number):void s = value; 这样通过一个公共方法(就是函数)设置了s的值,可以在FLA文件中调用: myClass.setSValue(18); 当然跟其它语言一样,也可以用get和set方法来读取或写入private变量的值: package net.smilecn public class MyClass public const PI:Number = 3.1415926; public var r:Number; private var s:Number; public function MyClass() trace(这是写的第一个类); public function set sValue(value:Number):void s = value; public function get sValue():Number return s; 在调用的时候就可以用这样的语句了: myClass.sValue =18; /(当使用过set后可以这样操作) var a = myClass.sValue; /(当使用过get后可以这样操作) 继承继承是指一种代码重用的形式,允许程序员基于现有类开发新类。现有类通常称为“基类”或“超类”,新类通常称为“子类”。首先看一段代码:package net.smilecn import net.smilecn.MyClass;/类在使用之前要先导入 public class MySubClass extends MyClass public function MySubClass() trace(Pi:,PI);/正确 trace(r:,r);/正确 trace(s:,s);/错误 发现这个类比之前写的类多了“extends”这个一个关键字。这个关键字的作用就是说明,MySubClass类是继承MyClass类的,继承之后就可以使用MyClass这个类里的变量和方法了,这样就达到代码重用的目的。例如,现在要写关于若干个球的类,有足球、篮球、排球等,那么可以先找出这些的共性,先写一个球的类,然后再继承这个球的类写出若干个球的类。由于相同的东西写在球的类中了,这就达到了代码重用。可以看出,PI,r,s是在MyClass这个类中定义的变量,那么由于MySubClass继承了MyClass,所以MySubClass也能使用这些变量。但值得注意的是,public和protected可以在子类中使用,而private则不行。所以这里PI和r可以使用,s不能用,并且子类在构造的时候也会执行基类的构造方法。改一下FLA文件的代码:import net.smilecn.MySubClass; var mySubClass:MySubClass = new MySubClass(); mySubClass.r = 3; 在输出面板会输出:这是写的第一个类PI:3.1415926r:NaN注意:标有错误的那句代码要去掉,不然会报错。下节继续讲解继承. (编辑:非熊) -类的继承二 当前位置:主页 AS入门 作者:arrowyoung 发表于:2009-08-29Tag:菜鸟教程 继承 在上节中,我们介绍到了继承,继承在我们的实际应用中是用的比较多的一种方式。 上节的继承是继承我们自己定义的类,如果要用到影片和类关联起来,我们可能会更多的去继承AS3中已有的类Sprite和MovieClip;MovieClip这个类我们在2.0中就经常用到,就是影片剪辑,Sprite是什么了,其实就是一个没有帧的 MovieClip,在没有动画的情况下我们会更多的使用Sprite,来看一段代码: package import flash.display.Sprite;public class MySprite extends Spritepublic function MySprite()graphics.beginFill(0xFFCC00);graphics.drawCircle(40,40,40); 现在我们建立一个MySprite的类(注意保存的AS文件名一定要跟类名一样),因为它是继承的Sprite类,所以我们可以使用graphics来画图,这里我们画了一个圆。 要使用这个类,我们同样要在帧上加一些代码: import flash.display.Sprite;/import MySprite;var mySprite:MySprite = new MySprite();addChild(mySprite);mySprite.x = 100;mySprite.y = 100; 这里首先我们还是建一个实例,名字叫做mySprite,接下来我们用到了这句: addChild(mySprite); addChild相当于2.0里面把库中的元件载入到场景中,用了addChild后我们画的那个圆就显示在场景中了,与之对应的是removeChild,是从场景中删除 接下来 mySprite.x=100; mySprite.y=100; 是设置坐标位置,因为是继承的Sprite,因为Sprite有x、y属性,所以MySprite也有了(注意x,y相当于2.0里面的_x和_y) 上面的代码MySprite是用代码画的一个图形,有很多图形我们不可能都用代码去画,这样就失去FLASH的主要功能了,我们还可以把库中的元件链接到MySprite这个类中。 我们新建一个MC,在库中在这个MC上点右键,点链接,会出现一个对话框,将为ActionScript导出打上勾,在上面类的后面填上要链接的类,这里我们填上:net.smilecn.MySprite ;基类那里我们填上:flash.display.Sprite 然后再发布看看,会发现不仅有刚才画的圆,我们在刚才的那个MC里画任何东西都会在里面,这样就做到了元件和类的链接。 在FLASH CS3中还加入了一个文档类(document class)的概念,使用文档类后,我们刚才写帧上面的代码就不用了,直接写在文档类里面,文档类就相当于第一帧的位置,这样我们就不用在FLA文件里写代码了,所有代码都写在AS文件里,达到了界面和代码的分离。 现在在建立一个类,MainForm.as: packageimport flash.display.Sprite;import MySprite;public class MainForm extends Spritepublic function MainForm()var mySprite:MySprite = new MySprite();addChild(mySprite);mySprite.x = 100;mySprite.y = 100; 我们发现刚才第一帧的代码搬到这个类里面来了,那个第一帧的代码就可以全部删除掉 最后在FLA的属性栏中找到文档类,在后面输入类的位置:net.smilecn.MainForm(注意是包名加类名) 好,现在发布看一下,是不是跟刚才的效果一样。 (编辑:非熊) -加载库中MC 上一节中,我们将库中的MC链接到一个类上,达到了类与元件的绑件,那么要完成像2.0一样的效果,将库中的元件载入到场景中是不是也要在MC上链接类了(3.0中没有以前的标识符),如果每个在库中的MC都要链接一个类就麻烦了,其实只需要在类后面起个名字就可以了。 比如我们起个名字叫MyMc,基类就用默认的flash.display.MovieClip(注意在点确定时有个找不到类的警告,不用管它,点确定就可以了),在文档类中这样写: package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; public class MainForm extends Sprite public function MainForm() var myMc:MovieClip = new MyMc(); addChild(myMc); 同样,要播放库中的声音也可以这样做,方法一样,链接在类后面起个名字,比如MySound,基类就用默认的flash.media.Sound package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; import flash.media.Sound; public class MainForm extends Sprite public function MainForm() var myMc:MovieClip = new MyMc(); addChild(myMc); var mySound:Sound = new MySound(); mySound.play(); play方法是播放声音 通过上述方法,我们可以通过代码将库中的元件加载到场景中或播放库中的声音。 反射的方式加载库里的MC 在上一节中我们用到了在库中加载一个元件,我们还有另一个方法来加载一个元件,就是用反射的方法,反射就是用库中元件的名字(字符串)去得到我们想要的元件,用代码去把它变成一个类. 我们在库中建立两个MC,并用上一节的方法将它们导出,名字分别为:Mc1和Mc2,我们要将这两个元件加载 到场景上,按照上一节的方法,我们应该这样做: package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; public class MainForm extends Sprite public function MainForm() var mc1:MovieClip = new Mc1(); addChild(mc1); var mc2:MovieClip = new Mc2(); addChild(mc2); 那么如果用反射的方法应该怎样做呢,看下面的代码: package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; import flash.utils.getDefinitionByName; public class MainForm extends Sprite public function MainForm() var ClassReference:Class = getDefinitionByName(Mc1) as Class; var instance:MovieClip = new ClassReference(); addChild(instance); 这段代码只加载了Mc1这个元件,而且我们发现代码比上一种方法更复杂一些,那为什么要使用反射这种方法呢,我们在看一段代码: package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; import flash.utils.getDefinitionByName; public class MainForm extends Sprite public function MainForm() for(var i=1;iAS入门 作者:arrowyoung 发表于:2009-09-01Tag:事件 菜鸟教程 在as3.0中我们用的最多的可能就是事件 ,我们会侦听各种事件. 当我们点击一个按钮时,在2.0中我们可能会用到这样的语句: _btn.onPress = function(); 当然后我们也可以用addEventListener来侦听一个点击事件.在3.0中我们一律用addEventListener 这种加侦听的方式来完成. _btn.addEventListener(MouseEvent.CLICK,btnClickHandler); function btnClickHandler(event:MouseEvent):void /点击后代码 这是一个单击事件,基本上我们用到的系统里的所有类都会有事件,在帮助文档中我们可以找到,我们可以很方便的使用这些事件. 我们现在把上一节中我们用到的代码稍加一下变动: package net.smilecn import flash.display.Sprite; import flash.display.MovieClip; import flash.utils.getDefinitionByName; import flash.events.MouseEvent; public class MainForm extends Sprite public function MainForm() for(var i=1;iAS入门 作者:arrowyoung 发表于:2009-09-03Tag:事件侦听 菜鸟教程 在上一节中我们介绍了侦听,要知道我们可能经常会用到侦听,所以我们会写很多个addEventListener,经常有些侦听我们用过一次后可以就不会再用了,那么为了节省资源,我们要将这些侦听删除掉,要侦除侦听这们用这样的方法: instance.addEventListener(MouseEvent.CLICK,insClickHandler);/添加侦听 instance.removeEventListener(MouseEvent.CLICK,insClickHandler);/删除侦听 这里我们用removeEventListener 就可以将侦听删除掉,我们在编程过程中,已经不用的侦听我们应该及时删除掉以节省资源. 现在我们来看一个小例子,这个例子的功能是有两个按钮,点击其中一个自己变成不可点击,另一个变成可点击状态. package net.smilecn import flash.display.Sprite; import flash.display.SimpleButton; import flash.events.MouseEvent; public class MainForm extends Sprite public function MainForm() _btn1.addEventListener(MouseEvent.CLICK,btnClickHandler); private function btnClickHandler(event:MouseEvent):void trace(你点击了:,event.currentT); _btn1.addEventListener(MouseEvent.CLICK,btnClickHandler); _btn2.addEventListener(MouseEvent.CLICK,btnClickHandler); event.currentTarget.removeEventListener(MouseEvent.CLICK,btnClickHandler); 在我们上一节讲到的FLA文件在场景里加两个按钮一个名叫_btn1,一个叫_btn2;发布我们会发现点一个按钮后这个按钮的侦听就会被删除,另一个被加上. 当然像按钮的帧听没必要删除,但关于时间之类的侦听,不用了就要删除了 使一个按钮禁用可能用不到删除侦听的方法,大家可以会想到2.0里面用到的enabled,但在3.0中enabled对SimpleButton没有作用,对Button有作用,如果要完成相同的功能,我们要用mouseEnabled 下一节我们再看类和类之前的消息传递. (编辑:非熊) -消息机制 当前位置:主页 AS入门 作者:arrowyoung 发表于:2009-09-03Tag:消息机制 菜鸟教程 前两节中,我们讲到了侦听,类与类之前也是可以侦听的,类与类之前的侦听就达到了类和类之前发消息的功能,这其实就是AS3.0中的消息机制。 我们先一个叫做MyClass的类: package net.smilecn import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class MyClass extends Sprite public function MyClass() addEventListener(MouseEvent.CLICK,clickHnadler); private function clickHnadler(event:MouseEvent):void dispatchEvent(new Event(Event.CLOSE); 将库中的一个MC链接到MyClass这个类上(方法参数前面章节)再修改之前的文档类: package net.smilecn import flash.display.Sprite; import flash.events.Event; import net.smilecn.MyClass; public class MainForm extends Sprite private var myClass:MyClass; public function MainForm() myClass = new MyClass(); addChild(myClass); myClass.addEventListener(Event.CLOSE,closeHandler); private function closeHandler(event:Event):void trace(你收到了myClass的消息); 发布试一下,是不是收到的消息,我们来看一下原理: 在MyClass中我们用到了一个方法dispatchEvent,这个方法就是用来发消息的,是不是只要写个类就可以用到dispatchEvent这个方法了,不是的,如果我们写的这个类不继承Sprite是不能用的,凡是从EventDispatcher继承下来的类就可以使用这个方法. 我们在看在文档类中有一个这样的语句:myClass.addEventListener(Event.CLOSE,closeHandler); 因为在MyClass中dispatchEvent(new Event(Event.CLOSE);发了一个Event.CLOSE事件,而在文档类中侦听了这个事件,所以就收到了这个消息。 说简单点就是一个要用dispatchEvent发消息,一个要用addEventListener侦听这个消息就可以了,这里我们用到了FLASH的EVENT类里面自带的CLOSE事件,其实就是个字符串,我们也可以自己定义字符串,比如这样: dispatchEvent(new Event(“message”); myClass.addEventListener(message,closeHandler); 这种方法也是可以了,消息的名称我们可以自己定义。 (编辑:非熊) 投稿:51 有疑问:去艾睿论坛 交朋友:去友吧 事件传递参数 当前位置:主页 AS入门 作者:arrowyoung 发表于:2009-09-04Tag:事件传递参数 菜鸟教程 上一节中我们讲到了类与类之前的消息传递,其实是一个类发消息,另一个类侦听这个消息,我们在发消息的时候能不能传递参数呢,当然是可以的,其实发消息的时候传参数在2.0里面是很方便的,但3.0里面要去写一个类去继承Event这个类,感觉麻烦了许多,在我学习3.0的初期一直不是很理解到了3.0为什么变复杂了,所以刚开始经常会用到扩展Event这个类,但到后来发现只要程序的架构写好了,这种方法是可有可无了,不过今天还是要讲解这种方法的使用。 我们先写一个继承Event的类: package net.smilecn import flash.events.Event; public class MyEvent extends Event private var _object:Object; public function MyEvent(type:String,object:Object):void super(type); _object=object; public function get param():Object return _object; 这个一个很简单的类,继承了Event这个类,在构造方法里有一个super(type),super 的意思是执行父类的构造方法,也就是执行Event的构造,type是消息的类型,就是消息的名字,一个字符串,object就是我们要传的参数要用到的一个变量,是一个对象,我们知道对象是很方便的,可以存储1到多个参数,下面是一个GET方法,通过param这个名字去取_object这个对像的值。 再来看一下怎么用这个MyEvent类,修改上一节中的文件;MyClass: package net.smilecn import flash.display.Sprite; import flash.events.MouseEvent; import net.smilecn.MyEvent; public class MyClass extends Sprite public function MyClass() addEventListener(MouseEvent.CLICK,clickHnadler); private function clickHnadler(event:MouseEvent):void dispatchEvent(new MyEvent(myClassMessage,a:100,b:200); 我们发现修改代码并不多,由new Event变成了net MyEvent,也就是说以前发的消息是as自带的Event事件,现在发的是我们自己写的MyEvent 事件,再看参数还有一个a:100,b:200,这个参数就是我们传进去的对象,这个对象有两个属性值,一个叫a,值为100,一个叫b,值为200; 再来看文档类: package net.smilecn import flash.display.Sprite; import net.smilecn.MyEvent; import net.smilecn.MyClass; public class MainForm extends Sprite private var myClass:MyClass; public function MainForm() myClass = new MyClass(); addChild(myClass); myClass.addEventListener(myClassMessage,myClassMessageHandler); private function myClassMessageHandler(event:MyEvent):void trace(你收到了myClass的消息:a=+event.param.a+ b=+event.param.b); 文档类中修改的地方是侦听到消息后执行的方法,我们发现参数的类型变成了MyEvent,因为我们发的是MyEvent的事件,这里收到事件的类型当然是MyEvent,在event.param就是去取MYEevent_object,就是我们在MyClass传过的对象了,event.param.a的值就是100,event.param.b的值就是200,这样我们就达到了传递参数的目的了。 (编辑:非熊) -单例模式 当前位置:主页 AS入门 作者:arrowyoung 发表于:2009-09-04Tag:单例模式 菜鸟教程 在使用其实语言中,比如C+,JAVA ,会用到一些设计模式,使程序结构更加合理化,今天我们来看一下设计模式中最基本的一种单例模式。 讲单例模式之前我们先看一个普通的例子,先建一个普通的类: package net.smilecn public class MySubClass public var num:Number = 0; public function MySubClass() 下面再建两个类,这两个类中都生成MySubClass的实例 package net.smilecn import net.smilecn.MySubClass public class OneClass private var mySubClass:MySubClass= new MySubClass(); public function OneClass() mySubClass.num = 5; package net.smilecn import net.smilecn.MySubClass public class TwoClass private var mySubClass:MySubClass=new MySubClass(); public function TwoClass() trace(mySubClass.num);/结果为0 在OneClass和TwoClass这两个类中都有MySubClass的实例,如果我们改变其中一个实例,其它的是不会更改的,因为它们不是同一个实例,所以第一个把num改为5,第二个里面仍是0,它们间没有联系。 单例模式的意思是不管怎么样都只产生一个实例,我们现在来修改MySubClass的代码: package net.smilecn public class MySubClass private static var mySubClass : MySubClass; public var num:Number = 0; public function MySubClass() if ( MySubClass.mySubClass != null ) throw new Error( 只能产生一个实例 ); public static function getInstance():MySubClass if ( mySubClass = null ) mySubClass = new MySubClass(); return mySubClass; 在这里我们加了一个getInstance的方法,一个mySubClass 的静态变量,getInstance也是静态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 层巷道支护项目规划设计方案
- 有限空间安全管理信息化平台设计
- 2025年人员笔试及复审等笔试考题及考点剖析附带答案详解
- 中国电脑呼叫系统行业研究及十五五规划分析报告
- 广告经营权转让合同法律解析
- 2025贵州中物聚能科技有限公司招聘笔试历年备考题库附带答案详解试卷2套
- 2025航天南湖电子信息技术股份有限公司招聘57人+笔试历年备考题库附带答案详解试卷2套
- 2025福建莆田荔源集团招聘电气工程人员30人笔试历年备考题库附带答案详解试卷2套
- 2025福建省大数据集团平潭有限公司招聘3人笔试历年难易错考点试卷带答案解析试卷2套
- 2025福建泉州经济技术开发区投资集团有限公司招聘1人笔试历年备考题库附带答案详解试卷2套
- 小米全面预算管理案例
- 2025年船舶租赁合同协议书模板
- 慢性阻塞性肺疾病急性加重期诊疗指南
- 门头招牌长期合同范本
- 江苏省宿迁市泗阳县2024-2025学年高一上学期11月期中物理试题(含答案)
- 2025品牌情绪与增长白皮书
- 土地整治项目竣工验收汇报
- 超星尔雅学习通《人工智能与创业智慧(北京林业大学)》章节测试含答案
- 驾驶员上岗前培训考试及答案解析
- 2025年学校少先队知识应知应会题库(含答案)
- 体检中心护理安全培训课件
评论
0/150
提交评论