as2 to as3(转)

最近玩了一下as,竟然发现无从开头,为什么?as1->as2->as3,Adobe公司竟然搞了三个版本,真她妈的郁闷。 以下是一位仁兄弟写的关于as2 与 as3的一些不同,甚好,转之。。。。。。 今天学习了神圣的as3.0,实现了从2.0到3.0的飞跃。 看了一早上,在2.0中做游戏常用到的几个基本方法的3.0转换已经基本了解,只是3.0的oop性更强了,幸好在家是看了几页《大话设计模式》,对oop思想有了一点的了解,接触起来没那么生硬。 一.addChild,添加一个孩子 首先,在舞台上新建一个mc,或者从库里拖到舞台上一个mc,然后修改mc的实例名名,在动作面板中对这个mc写一些相关的代码。比如mc.属性=…;mc.方法=…这些是没有变的;下面我来说一下,从库里调用mc的变化。 在as2.0中,我们给mc起一个链接名,然后用attachMovie来调用这个mc。 CODE: attachMovie(“链接名”,”新名字”); 这样我们就在舞台上就有了一个叫“新名字“的mc。 在as3.0中的写法有所改变,它把库中的mc看成了一个类,要在舞台上载入这个mc,首先要声明这个类,然后再把它new出来,然后在add到舞台上,写法是这样的。 CODE: var 新名字 = new 链接名(); addChild(新名字); 添加上了,我们应怎么删除呢?添加是addChild,那么删除,就应该是removeChild的咯,没错,我们用mc.parent.removeChild来删除,比如如果mc的parent是stage,那么删除mc应该是 CODE: stage.removeChild(mc); 二。ENTER_FRAME,让mc动起来 在as2.0中,要让一个mc连续的移动,我们用onEnterFrame CODE: onEnterFrame=function(){ 新名字._x++; }在as3.0中,要实现同样的效果,仿佛麻烦了一些,另外,需要说明的是,在as3.0中的属性,都没有了“_“,也就是做,mc的_x属性应该写成:mc.x。 as3.0中,要先给stage建立一个事件侦听,监听到ENTER_FRAME事件后,去调用moving函数(这是我自定义的),写法如下: CODE: import flash.events. Event; stage.addEventListener(Event.ENTER_FRAME,moving); //或者写成 // stage.addEventListener(“enterFrame”,moving); function moving(e:Event) { 新名字.x++; } 三。MouseEvent,看看鼠标在干嘛 在as2.0中,检测一个mc上的鼠标事件,可以这么写 CODE: mc.onRelease=function(){ trace(“mc is release!”); }其他的像onPress,onRollOver…类似。 在as3.0中,没有了onRelease等事件,还是要通过事件侦听来实现,这是as3.0一个新的机制。思路跟添加ENTER_FRAME的差不多,写法如下: CODE: import flash.events.MouseEvent; mc.addEventListener(MouseEvent.MOUSE_DOWN,down); //或者写成mc.addEventListener(“mouseDown”,down); function down(e:MouseEvent){ trace(“mouse is down”); } 四.KeyboardEvent,用键盘让mc懂起来 在as2.0中,先新建一个listener,用这个listener来监听键盘的动作,然后把这个listener添加到key上,写法如下: CODE: var keyListener:Object; keyListener.onKeyDown=function(){ if(Key.getCode==Key.LEFT){ trace(“left key is press!”); } } key.addListener(keyListener);在as3.0中的写法很类似,只是少了新建keyListener那一句 CODE: import flash.ui.Keyboard; stage.addEventListener(KeyboardEvent.KEY_DOWN,isDown); function isDown(e:KeyboardEvent){ if(e.keyCode==Keyboard.UP){ trace("left key is press!"); } }到这里,用以上的几个函数来做一个小游戏,应该是没问题了,好了,赶快去把你as2.0的游戏改成as3.0的吧! 附件:http://space.flash8.net/bbs/attachment.php?aid=348669 as2.0转as3.0(二) 学习笔记,转载请注明出处,谢谢合作!!http://blog.sina.com.cn/ladeng6666 五。Loader,把图片加进来 在as2中,要加载外面的文件(如jpg,swf等),我们最常用的是loadMovie(),这时候只要有一个mc,甚至没有mc都可以,直接加到舞台上。假如我们的舞台上有一个实例名为loadHolder的mc,我们要加载一张pic.jpg的图片,写法如下: CODE: loadHolder.loadMovie(“pic.jpg”); 如果需要知道加载进度的话,要稍微麻烦一点,我们用MovieClipLoader方法,监测嘛,就要有listener,我们叫它loadListener好了,然后有一个MovieClipLoader把pic.jpg加载到 picHolder里面去,写法如下: CODE: var picLoader:MovieClipLoader = new MovieClipLoader(); var loadListener:Object = new Object(); loadListener.onLoadStart = function () { trace("loadStarting"); }; loadListener.onLoadProgress = function () { trace("loading"); }; loadListener.onLoadComplete = function(){ trace("loadComplete"); } loadListener.onLoadInit = function () { trace("loadComplete and Init"); }; picLoader.loadClip("pic.jpg",picHolder); picLoader.addListener(loadListener); 在as3中,就没有第一中写法了,太简单了,主要还是第二种写法的思想,但写法变了,as3把picLoader和picHolder整成了一个叫loader的对象,然后给loader加上侦听,然后在stage上addChild就行了。 还有一点要说明的是,load()函数的参数不能只是一个字符串,as3把它定义成了一个对象,叫URLRequest,loadListener也改叫IEventDispatcher,(这么讲应该是不对的,但是你可以这么理解),具体写法如下: CODE: var loader:Loader=new Loader(); var url:URLRequest=new URLRequest("pic.jpg"); var dispatcher:IEventDispatcher=loader.contentLoaderInfo; dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS,startHandle); dispatcher.addEventListener(ProgressEvent.PROGRESS,loadingHandle); dispatcher.addEventListener(Event.COMPLETE,completeHandle); dispatcher.addEventListener(Event.INIT,initHandle); loader.load(url); stage.addChild(loader); function startHandle(e:HTTPStatusEvent) { trace("loadStarting"); }; function loadingHandle(e:ProgressEvent) { trace(e.bytesLoaded); }; function completeHandle(e:Event){ trace("loadComplete"); } function initHandle(e:Event) { trace("loadComplete and Init"); }; 六。setInterval,自定义帧频 在as2中,我们可以通过setInterval来按自定义的频率执行一个函数,用clearInterval来删除这个setInterval,比如,我们有一个名叫test的函数,然后用setInterval来让这个函数每秒中执行一次(setInterval的第二个参数是毫秒数),写法如下: CODE: function test(){ trace(“test”); } var intervalID:Number=setInterval(test,1000); //我们可以用clearInterval来删除setInterval; //clearInterval(intervalID); 除了setInterval,as3还为我们提供了另一个好玩的东西Timer,他是一个新添的类,他可以和setInterval一样,实现自定义频率的执行一个函数,另外他还可以指定循环的次数,可以修改延迟时间等等,这一点要比setInterval好的多。比如,我们有一个名叫t的Timer对象,每0.5秒执行一次,供执行10次,写法如下: CODE: var t:Timer=new Timer(500,10); var n:Number = 0; t.addEventListener("timer",timerHandler); t.addEventListener(TimerEvent.TIMER_COMPLETE,completeHandler); t.start(); function timerHandler(e:Event){ trace(n++); } function completeHandler(e:Event){ trace("completeHandler"); } 七。把自己的博客放到右键里去 在as2中,更改鼠标右键的写法如下: CODE: myMenu = new ContextMenu();//新建自定义的右键menu myMenu.hideBuiltInItems();//隐藏系统鼠标右键 myMenu.customItems.push(new ContextMenuItem("我的博客", blog, false)); function blog() { getURL("http://blog.sina.com.cn/ladeng6666","_blank"); } _root.menu = myMenu; 在as3中不让用getURL了,多了个URLRequest类,跳转也改成了navigateToURL,写法如下: CODE: var myMenu:ContextMenu = new ContextMenu(); var myBlog:ContextMenuItem = new ContextMenuItem("我的博客"); var blogURL:String = "http://blog.sina.com.cn/ladeng6666"; var request:URLRequest = new URLRequest(blogURL); myMenu.hideBuiltInItems(); myMenu.customItems.push(myBlog); myBlog.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,blog); function blog(e:ContextMenuEvent):void { navigateToURL(request); } this.contextMenu = myMenu; 八。_root,说再见,不再见 在as2中,当一个mc中嵌套了多个mc的时候,我们可以用_root来直接舞台,这一点在as3中好像不大好使了,不过root还是有的,只不过它是一个抽象类(好像是这么说的),不能实例化,也就是不能new出来,但是可以通过一下的几中方法指向舞台,比如说,舞台上我们定义了一个变量s,s=”我是在舞台上的!”,我们可以这样得到n: CODE: Object(root).s; (root as MovieClip).s; var _root=root; trace("_root=root----"+_root.s); 附件:http://space.flash8.net/bbs/attachment.php?aid=349204 原文地址:http://blog.sina.com.cn/ladeng6666
posted @ 2010-09-26 16:00  7hihi  阅读(342)  评论(0编辑  收藏  举报