也说AS3自定义事件

看到网上有很多关于AS3自定义事件的文章,写的或简洁到不知所云,或复杂到云山雾罩,大多属于懂的人不用看,不懂的人看不懂。不禁想起前端时间刚接触自定义事件时的纠结,看了几篇相关的文章后,也明白作者的意思,结合自己工作中的一些想法,于是就也写篇文章说说自己的理解,凑凑热闹! 自我感觉自定义事件并不太难,主要还是得理解自定义事件的意义,明白自定义事件有什么用处,懂得自定义事件用在什么地方。 下面就结合我最近做一个小游戏时用到自定义事件的情况介绍下用法。 思路:通过抛出自定义事件,改变当前游戏状态! 由MainView来管理GameStartView、GamingView和GameEndView三个游戏状态,每个状态有一个按钮,点击后,抛出自定义事件,MainView侦听到事件后,根据参数改变游戏状态;自定义事件类MyGameEvent继承于Event,含有一个nextStatus的属性。 UML图:

代码方面列出最关键的类:MyGameEvent类。 [codesyntax lang=”actionscript3” container=”pre”]

package com.nestor.event
{
import flash.events.Event;

public class MyGameEvent extends Event
{
// 默认事件类型
public static const Status_Change:String = “MyGameEvent.Status_Change”;
// 下一游戏状态;
public var nextStatus:String;
public function MyGameEvent(type:String=Status_Change, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public function clone():MyGameEvent {
return new MyGameEvent (type, bubbles, cancelable);
}
}
}

[/codesyntax]     源码下载: [download id=”3”]

像素级移动(SetPixel)

常规的建个元件,做段时间轴动画,或者加上一些缓动代码,都可以实现移动的效果,这个是flash的入门知识。 今天要说的是,像素级的运动,通过BitmapData 的 setPixel和copyPixel 方法,改变位图的数据源,实现运动的效果,这个方法在项目实际运用中会大大提高系统的效率。 效果展示:

思路:注册Enter_Frame事件,每次通过 setPixel 刷新 位图BMP的 数据源BMD,形成动画的效果!

源码如下:

/* by Nestor/斯樵 sqstudio.com */ package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; [SWF(width="600",height="300",frameRate="30")] public class setpixel extends Sprite { private var bmd:BitmapData,bm:Bitmap private var id:int=1 public function setpixel() { bmd=new BitmapData(800,600,true,0) bm=new Bitmap(bmd) addChild(bm) addEventListener(Event.ENTER_FRAME,efHandler) } private function efHandler(e:Event):void{ bmd=new BitmapData(800,600,false,0x000000) bm.bitmapData=bmd bmd.lock(); for(var i:int=stage.stageHeight/2-5;i<5+stage.stageHeight/2;i++){ for (var j:int=id;j< 10 +id ;j++){ bmd.setPixel(j,i,0xffffff) } } bmd.unlock(); id +=10; if(id>stage.stageWidth){ id=0; } } } }

下载地址:千脑网盘 有问题,欢迎留言讨论!

AS3事件机制初识

昨天在做一个小游戏的时候,发现事件机制很不错,特地写一写,分享一下! 我当时是把游戏时间控制单独写了一个time类,游戏开始时60秒倒计时启动,可是时间为0时,怎么通知Main类呢? 以前也看过事件发送dispatchEvent,不过没怎么理解,不知道怎么用,后来就忘了,现在拾起来再一看,果然很有用,怪不得黑羽连发几篇文章,名为“AS3强大的事件机制”。 dispatchEvent就是可以把time的信息通过事件发送通知给Main类,发送的时候是time类里发送,接受的时候是Main类里的time类实例在侦听接收,所以从头到尾还是一个对象在完成,感觉很合理。 接下来贴效果:

说明:time类的倒计时为0时,会发送事件给Main类,Main类里的time类实例收到信息后,执行下一步操作!

代码如下:

time类:

package { import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.Event; public class Time extends Sprite { public var timer:Timer,tim:int; public function Time() { init(); } private function init() { timer = new Timer(1000); tim = 5;//总时间 timer.start() tim_txt.text = String(tim); trace(tim_txt.text) timer.addEventListener(TimerEvent.TIMER,timeHandler); private function timeHandler(e:TimerEvent) { tim_txt.text=String(tim) if (tim == 0) { timer.stop(); //时间为0时,发送给Main主文档这一事件,让Main进行下一步处理 this.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); } else { tim--; } } } }

Main类: package { import flash.display.Sprite; import flash.events.*; public class Main extends Sprite { private var time_mc:Time; public function Main() { init(); } private function init() { time_mc=new Time(); addChild(time_mc); time_mc.addEventListener(TimerEvent.TIMER_COMPLETE,timeCom); } public function timeCom(e:TimerEvent ) { timcom_txt.text = "Main类收到time类所发送的信息,时间到,Main类可以进行下一步处理"; } } } 源码下载:千脑网盘 上面写的属于事件机制里很简单的部分,随后在小游戏里我还用了自定义事件,但是理解的还不深,下次发文章时再写!

Flash变形相册

看到网上很多相册,或者是flash网站的展示页面,有下面这种flash加载下一张图片时的变形效果,感觉很不错,就尝试写了下这个效果。 只是一个很简单 的效果,有兴趣的朋友可扩展下做成相册,呵呵!(有人做的话,做好了记得分享下,我也围观下!) 效果如下:

变形相册截图

注:1.点击图片  或此处 查看效果, 下载载本地效果更佳!

代码如下: code: import com.greensock.TweenLite; import com.greensock.TweenLite; import flash.events.MouseEvent; import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; import flash.display.Sprite; import flash.events.ProgressEvent; /* by Nestor/斯樵 www.sqstudio.com */ var sp:Sprite =new Sprite(); var picLoader:Loader=new Loader(); var picArr = ["image/1.jpg","image/2.jpg","image/3.jpg","image/4.jpg"]; stage.addEventListener(MouseEvent.CLICK,onCK); var id:int = 0; init(); function onCK(e:MouseEvent):void { sp.removeChild(picLoader); picLoader.unload(); init(); stage.removeEventListener(MouseEvent.CLICK,onCK); load_txt.visible = true; } function picPro(e:ProgressEvent):void { load_txt.text = Math.round(e.bytesLoaded / e.bytesTotal * 100).toString() + "%"; } function picCom(e:Event) { load_txt.visible = false; var wid:Number = Number(e.target.width) + 10; var hei:Number = Number(e.target.height) + 10; picLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE,picCom); TweenLite.to(sam_mc,1,{width:wid,height:hei,onComplete:tweenCom}); } function tweenCom() { sp.addChild(picLoader); sp.x = sam_mc.x - sam_mc.width / 2 + 5; sp.y = sam_mc.y - sam_mc.height / 2 + 5; addChild(sp); stage.addEventListener(MouseEvent.CLICK,onCK); } function init() { picLoader.load(new URLRequest(picArr[id])); picLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,picPro); picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,picCom); if (id == picArr.length - 1) { id = 0; } else { id++; } } 源码下载:千脑网盘 解压密码:www.sqstudio.com 本实例用所用到的TweenLite类 可到官网下载

开通博客啦!

接触flash两年了,感悟很多,学的东西也比较乱,所以就想开个博客整理下。 最初关注flash,只是觉得好玩,感觉挺神奇。真正的上手入门,学习AS3也就是年初的事,刚开始是看金鹰的flash教程,现在看来这些教程确实很一般,不过确是给我打开了通向Flash AS3 的大门。之后就开始自学AS3,碰到有不懂的就百度,有时候费了很大劲儿,终于搞明白一个问题,那种激动和满足也是很让人难忘的,相信很多人都不会忘记那种恍然大悟的感觉。没事就逛逛天地会的论坛,看看绚丽的国外Flash全站,读读那些业内大牛的博客,倒也别有一番滋味。尤还记得,看到那些国外Flash全站特效的震撼,读完那些业内Flash大牛博文的仰慕,这些都成为我继续为Flash而努力的动力! 我的水平不高,目前对于AS3 API 掌握不很透彻,对于类的写法,不很熟练,对于设计模式更是一知半解。 不过,所幸我还有些值得庆幸的地方,我知道怎么去寻找解决问题的办法或者方向,我愿意一直用一种兴趣爱好的态度去不断学习Flash。之前在百度空间也写过一段时间博客[Flash蛋蛋堂],不过Flash蛋蛋堂那个博客上面有很多是转载的东西,很多并没有消化,就看到文章好就直接拿过来用了. 如今开通这个博客,我想尽量每一篇都是原创,即便是有别人的东西,那也是博采众家之长,经过融汇贯通的,力求对一个问题做出透彻的理解,并且尽量多做些实例,放出源码,既是对自己知识的梳理,也希望写的东西能给别人些许帮助吧!业内大牛的博客,我也收集了20多个,不过这些博客对我来说,更多的作用是了解业内的新闻动态,因为很多上面的技术要么很难看懂,要么暂时用不到。 鉴于我目前的水平有限,或许我写的东西对有的高手来说很简单,但是至少我每一篇都会再三斟酌,认真撰写,因为这也将做为我自己的技术资料存档,我想随着我技术的进步,这里的博客将会越来越有质量。 这个博客我会一直坚持下去! 喜欢Flash的朋友,我们一起成长!

2010.11.25


如今回头看看以前文章,颇感稚嫩,曾一度想删去,恰好看到季羡林《牛棚杂记》的序,感觉直击内心,好吧,那就不删吧。2017.03.03