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