又过生日了,24岁了

不知不觉快过年了,意味着生日快到了。

印象中没在外面过过生日,因为之前过生日基本都是放寒假中,在家里过的,这次算是第一次吧,不过还是有点特殊的,下午打电话给必胜客宅急送叫了4个批萨过来和同事一起小庆祝了下,精致的小笔记本上同事们写给我的祝福语都指向了我最在意的部分啊,技术提升,单身问题,身材发福,呵呵,身处在这样一个团队真是我的幸运。

回头看看自己已经24岁了,过去的岁月还是有许多值得感慨和总结的事情,简单罗列一下

还拥有的:

  • 理想
  • 还算自由的生活
  • 有希望养活自己的一门手艺,尽管离精通还很远
  • 独立的价值观和思考习惯
  • 吉他

正在失去的:

  • 理想
  • 健康
  • 青春和时间
  • 亲人的关心
  • 一切很重要但我没有察觉的东西

没有的:

  • 姑娘
  • 归属感
  • 时间
  • 能令自己满意的工作能力

觉得每年自己都变化很大,只是尽我所能的去经历,过程中收获了许多,也失去了许多,大概人生本来就是这样子没办法预测,时间不多,不知道明年25岁生日的时候这份清单会发生什么变化。

AS3区分鼠标单击、双击、拖动事件

最近在写的一个小项目中遇到一个感觉有点不合理的需求,即需要在一个地方同时监听鼠标单击、双击、拖动事件并做出不同的响应,由于AS3事件机制的问题,处理这个需求有点小麻烦,下面分析一下

  • 单击:MouseEvent.CLICK事件,就单击事件,没啥好说的
  • 双击:MouseEvent.DOUBLE_CLICK事件,据师兄春哥说AS2里面是没有这个事件的,他都是自己写双击事件;现在AS3是提供了这样的事件,我只要doubleClickEnabled=true就可以用了,但问题是默认doubleClick会先监听到一次Click事件,去调用Click的监听函数,这样子就麻烦了
  • 拖动:拖动其实就三个过程,MOUSE_DOWN,MOUSE_MOVE,MOUSE_UP,但问题是MOUSE_DOWN,MOUSE_UP完了以后Flash又认为这是一次Click事件,就又会去调Click的监听函数,纠结。

解决思路:

  • 区分单击、双击:不直接在单击双击事件里面写相应,而是先就这两个事件分别修改一个布尔值,然后Timer判断,再根据此布尔值判断是调双击的方法还是单击的方法,废话不多说上代码:
?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	var mySprite:Sprite = new Sprite();
	var isDoubleClick:Boolean = false;//判断是否是双击的标志
 
	mySprite.addEventListener(MouseEvent.CLICK, onClick);
	mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);
 
	private function onDoubleClick(event:MouseEvent):void {
		isDoubleClick = true;
	}
 
	private function onClick(event:MouseEvent):void {
		isDoubleClick = false;
		var timer:Timer = new Timer(260, 1);
		timer.start();//也就是说两次单击间隔在260毫秒之内的就被认为是双击
		timer.addEventListener(TimerEvent.TIMER, clickOrDouble);//这边的clickOrDouble也可以写成匿名函数,把mouseEvent传进去
	}
 
	private function clickOrDouble():void {
		if(isDoubleClick){
			doubleClickFunc();//调用双击响应函数
		}else{
			clickFunc();//调用单击响应函数
		}
	}
  • 区分单击、移动:MOUSE_DOWN和MOUSE_MOVE的时候分别修改一个布尔值,CLICK里面就根据这个布尔值来判断是不是拖动中,思路其实差不多,代码:
?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	private var isDragging:Boolean;//判断是否在拖动中的标志
	mySprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
	mySprite.addEventListener(MouseEvent.CLICK, onClick);
 
	private function onMouseDown(event:MouseEvent):void{
		isDragging = false;
		//bla bla bla~~
		mySprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		mySprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
	}
 
	private function onMouseMove(event:MouseEvent):void {
		isDragging = true;
		//bla bla bla~~
	}
 
	private function onClick(event:MouseEvent):void {
		if (isDragging == false) {
			//bla bla bla~
		}
	}

Google要撤了

今天一天twitter上炸开锅了,关于Google要退出中国的消息从早刷到晚,整个一天几乎都没什么心情工作,一直在关注事态发展,在下午基本确认G.cn将关闭,Google将撤出中国的时候,我的心情简直低落到极点。相信绝大多数互联网从业人员都是像我这样的Google重度用户,至少离不开Gmail,离不开Google Reader,更离不开Google.com,Google的服务已经成为我们生活和工作的一部分了,它以这种方式离开我们,不得不为我们生存的环境感到悲哀。

事实上我自己的话平时很少使用G.cn,自从GFW开始间歇性屏蔽Google.com,我就将所有Google的服务都加入了Foxy Proxy的白名单,使用SSH访问,但是听闻G.cn关闭,想必Google彻底被墙也是必然的了,这么优秀的服务和工具就这样彻底离开了国人,而由百度这种作恶多端的公司占据市场,真的让我想起一句话:“在屎壳郎的国度里,只有挑大粪才能成功”,Google这种坚持原则的公司是不适合在这里生存的。

如果Alexa排名前三的网站Google,Facebook,Youtube在国内都无法访问,大家只能百度,开心网,优酷,感觉上我们就是世界的二等公民,只能被迫使用更次的互联网服务和产品,开发者开发应用的积极性受到打击,国内本来就奇缺的创新意识可以宣告完全被和谐了。

四个字总结心情:无奈,想逃。

AS3加载图片

关于AS3加载图片等外部资源,我常用的有两种方式:Loader和Embed,各自的特点,总结如下:

  • Embed:在Flash编译阶段就将资源嵌入,也就是说图片资源是会被编译进swf文件里面去的;这样子的好处是代码比较简洁,使用方便,也不存在加载顺序的问题,缺点是会增大swf文件的体积
  • Loader:在Flash运行阶段动态加载资源,这种方式不会影响swf文件的体积,而且可以很灵活地更改你要加载的资源,但是有可能会遇到路径变更或者跨域问题,同时,过多地使用Loader去动态加载无疑会加重服务器负担,因此需要和Embed权衡使用

书写的例子如下:
Embed:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
[Embed(source = "../assets/images/closeBtn.png")]
private var closeBtnImage:Class //需要嵌入的图片对象
 
private var btnSprite:Sprite = new Sprite();
 
private function test():void {
	var bmp:Bitmap = new closeBtnImage();
	btnSprite.addChild(bmp);
}

Loader:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
private function addItem():void {
	var loader:Loader = new Loader();
	loader.load(new URLRequest("http://zhufei.de/something.png"));
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
}
 
//监听到Loader加载完毕以后执行的函数
private function loadComplete(e:Event):void {
	var l:Loader=Loader(e.target.loader);//得到Loader对象
	var bm:Bitmap = Bitmap(l.content);//Loader里面的内容
	trace(l);
	trace(bm);
}

AS3的碰撞检测应用

在最近的项目中遇到一个问题,就是在同一个容器中有多个对象,需要做到鼠标点击某个对象,即选中该对象,此时最上层的一个层会覆盖住被选择的对象,这时因为这个层的缘故,有可能导致该层下面的某些较小的对象无法再接受鼠标的事件,经过龙藏同学的提示,采用碰撞检测的方法,思路如下:

  1. 将容器中的对象按照加入的顺序依次压入一个数组
  2. 鼠标单击时获取该坐标的x,y值
  3. 从后往前遍历数组(也就是从最上层往最下层遍历),依次对该鼠标单击的点做碰撞检测
  4. 一旦检测到碰撞,即跳出循环,纪录该碰撞的对象,即被选中的对象

代码如下:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
        this.addEventListener(MouseEvent.MOUSE_DOWN,onStageMouseDown);
 
        private function onStageMouseDown(event:MouseEvent):void{
             var mX:Number=event.stageX;
	     var mY:Number=event.stageY;
	     for(var i:int=items.length-1;i>=0;i--){  //这里items就是存放对象的数组
		if(items[i].hitTestPoint(mX,mY)){  //在这里做碰撞检测
		      selectedItem=items[i];
		      break;
		   }
	      }
        }

1月6日 Avatar

昨天晚上去看了Avatar,杭州没有IMAX,普通3D的话因为没有解决中文字幕问题,所以是中文配音的,这个无论如何不接受,所以还是看了2D的,尽管这样,我觉得还是远远超出了我的预期,可以给满分了,过一阵去上海看IMAX,很期待啊。

关于剧情,只能说又再体验到外行领导内行真的是悲剧啊,可是大多数时候这种情况没办法改变。

看到纳维人骑着大鸟自由飞翔的时候,心里不知道有多向往。

告别09年

最近挺忙的,搭了博客都没时间上来更新日志,看来时间管理还是没有做好。今天是09年的最后一天,回想起来今年是经历了不少事情,09年1月1日的时候可能怎么样都想不到365天以后的这个时候身在何处,在做什么事情,心态和理想会变成什么样子,今年的经历让我更相信了世事无常,也许能做的就只有追随自己的心去专注一些事情。

2012就要来了,在这有限的两年里还是给自己订一些目标吧

2010年的理想:

  • AS/Flex方面积累更多经验,提升编码和架构能力
  • 有空研究下乐理,多扒一些谱子,至少该有点即兴伴奏的能力了吧…也许可以再搞搞指弹
  • 多运动,减肥
  • 认识一些靠谱的姑娘和朋友
  • 买一些东西,比如Mac,Gphone或者Iphone,一把更靠谱的琴,Ipod Classic等等
  • 杭州混熟了
  • 也不能太愤青

现在能想到的大概就是这样子,有些可以靠自己的努力实现,有些不一定靠谱,希望一切顺利吧,对了,还有一条,维护好这个博客。

Firefox下使用Flash Player Debugger版本

官网下载页下载Flash Player 10 Plugin content debugger (for Netscape-compatible),安装完以后不要忘记最后一步,把C:\Windows\System32\Macromed\Flash\下的NPSWF32.dll文件复制到Firefox安装目录的plugin文件夹中,这样子完了以后就可以在Firefox中调试Flash了。话说未安装debug版之前这个dll只有几百K,装完以后变成4M多,囧…

First Post

来杭州一个月,各方面都还不错,工作很充实,生活也很规律,最主要的是开始做自己想做的事情了;告别了过去很多东西,不称心的工作,父母和家乡,女朋友,又恢复到一个人学习、生活在异地的状态。

淘宝的工作氛围很好,已经习惯了每天早上9点到晚上9点待在公司,在这里的时间总是过得飞快。比较爽的是边上有咖啡机,我平时爱喝咖啡可是又经常会懒得泡,这下好了,没事就会过去冲一杯,这样子每天都会喝掉很多,汗。

两年前在大学里面维护过一个博客,可是因为种种原因没有再更新,域名和空间都废弃了,现在发现需要有个地方经常记录一下平时工作和学习的心得和技巧,顺便发发牢骚,就决定重开一个博客;“逐飞”是我来这边以后的花名,已经习惯别人这么叫我了;今后这个博客会比较多的用来记录我开发中总结的经验,也许偶尔写写生活,欢迎评论和订阅。