August 28, 2010, 4:52 pm
Python是一种很优雅的语言。优雅这个字,在我理解是,用最少的话表达最多的意思,说白了就是开发效率。我觉得作为程序员应该会一种优雅的语言。在紧急或者懒惰的情况下,可以最快最高效的帮助完成一些任务。作为一个flash和flex的coder,最头疼的莫过于,需要后台,至少说,需要一个测试用的后台。Python是搭建简易后台最有效率的技术之一。
这个“之一”一定要讲,不然容易造成论战。不错,除了python,有人还喜欢ruby,或者php。他们code的效率同样很高。争来争去是没有意义的,我感觉,与其耍嘴皮子,搞些有意义没意义的辩论,还不如关注你手上可以用的资源。如果你认定了Python,那么马上学习吧,拿起来就用吧,我们只是要测试用后台不是么,黑猫白猫,能抓老鼠就是好猫。邓爷爷的话一定要相信。
如果你惦记着纯用Python搭服务器,那你一定够傻了。要知道python可以做很多事情,能力很强的劣势就是,比较“底层”(当然跟C比较的话,编程效率高)。为什么不用framework呢。flash的开发效率同样比较低,所以才有flex冒出来。framework就是用来降低工作量的,就像很多所谓的牛人在给他们的产品做广告时说的那样,我们尽可能的让开发者关注业务,而不是实现。说的多好。
Django是很好很强大的web framework。它的好处是:
- 自带一个测试服务器。可以免去IIS和apache。不需要安装额外的服务器软件。
- 绝少的配置选项。
- 自带一个简易的管理系统。可以管理数据库的增删改。
- 依靠python解释执行的好处,做修改可避免服务器重启
- 快速实现MVC
上面是虚的,实的嘛,下回分解。
March 19, 2010, 5:06 pm
Flash IDE 可以为调试的swf模拟网速来测试进度条。如果是Flex builder呢,似乎是没有的,不过千万别在这个问题上钻牛角尖,因为这实际上是本地服务器的职责,而不是flex builder该干的工作(flex builder编译完成并启动页面后就结束任务了)。
在这种情况下要为flex模拟慢网速的话,就要使用proxy工具了,我这里推荐ServiceCapture,当然很多http检测工具都带有模拟网速的功能,我选serviceCapture除了它能检测http,还能读出trace和AMF协议,简直是Flash专用工具。
首先你需要安装serviceCapture for firefox 插件,让它“干预”firefox上的调试。


然后所有在firefox里发生的http和AMF连接都会被记录下来,serviceCapture “中转”了firefox的请求,这样就能人为的拖慢网速。

February 1, 2010, 10:43 am
在一些实时性能要求比较高的应用中,如3D,try…catch处理错误会严重的影响性能和执行效率,应该尽量使用判断语句来代替。为此我有个实验。
if (theOldIndex >= 0 && theOldIndex < this._cache_pop_yw_zws.length)
{
_gra.lineStyle(1, 0xffffff);
_gra.beginFill(colorFront);
_gra.drawCircle(theCachedArr[theOldIndex].x, theCachedArr[theOldIndex].y, 6);
_gra.endFill();
}
这里主要是为了不让theOldIndex溢出造成错误,如果每次ENTER_FRAME都是用try catch来判断,大概用getTime测试的执行时间会大上一倍多,太杯具了。因此尽量要预见可能出现的问题,有时情愿写code麻烦点。我想这也是c可以长盛不衰的原因吧。
January 28, 2010, 2:01 pm
SlideShowPro for flash is a photo and video slideshow component that can be embedded in Flash. It is flexible and easy-customized. We have used it in our photo gallery flash and it works well.
check it here. It’s not free:)
the configuration is very simple, you can just open component panel in Flash and drag-drop SlideShowPro on stage. The configuration panel looks like:

slideshowpro component panel
SlideShowPro will read xml file for configuration, which specify images and their path. here is demo of xml:
<?xml version="1.0" encoding="UTF-8"?>
<gallery>
<album title="Samples" description="XXXXX"
lgPath="path/of/images/">
<img src="001.jpg" />
<img src="002.jpg" />
<img src="003.jpg" />
<img src="004.jpg" />
<img src="005.jpg" />
</album>
</gallery>
January 27, 2010, 10:39 am
LongLongAgo,在做泡泡龙游戏的时候,发现数据结构的好处。使用树结构的数学模型可以清晰的描述逻辑处理方式。比如在判断是否有球掉落的时候,见下图,就可以用这样的数学语言描述:“对某个球而言,不存在一条路径到达root”。root就是最顶层。

泡泡龙
如果这样的球存在的话,就说明它是“浮空”的,也就是说可以掉下来了。
这类的数学描述在很多领域都用过,记得flash的垃圾回收机制么,原来使用计数法来判断一个对象要不要被消灭,如果用在displayObject树结构里就不够了,因为它们可以相互引用,于是,用上面所说的数学描述就成了很好的补充,跟泡泡龙的原理类似,如果有一个displayObject不能到达root的话,它就脱离了显示树,就该被消灭,而不用管计数是多少。
回到泡泡龙的问题上来,一个被发射上来的球可以看成一个根节点,当它被打到一堆球当中的时候,一个树结构就形成了:以这个新球为根,周围的六个球为第一层子节点(可能某些是空,或者重复应用,需要剔除),然后使用广度优先或者深度优先遍历来查找“通往root的路径”,再加上些优化,就能实现这种数学描述,从而完成“掉落”这个游戏功能。
数学在flash游戏中无处不在。此乃往事,特此笔记。
January 19, 2010, 11:26 am
每次谈到Flex builder和FlashDevelop这两个工具总不免比较一番,其实两者各有优点为什么不互补一下呢。事实上我在实践过程中,觉得有些情况下两个配合着用非常不错。FlashDevelop有轻便的优势,代码提示很好,而Flex builder支持Flex framework,支持可视化开发,搭建UI快捷编码量少。
什么时候配合着用比较好呢。那就是开发AS类库,类库用FlashDevelop开发,轻便快捷,而测试使用Flex builder,快速构建UI来显示效果,提供参考。
通过观察FlashDevelop project的文件夹可以发现,基本上FlashDevelop和Flex builder的布局是差不多的,source code放在src里,编译文件放bin,类库放lib等等。于是就有两种配合方式可供参考:
- 叠在一块儿。先用FlashDevelop建一个project,然后Flex builder也建在同一个位置。
- 分开建project。Flex builder使用external source path来链接类库代码。
显然第二种方式更好,可以有效的将测试代码和类库代码分开。
December 30, 2009, 1:04 pm
设计用的辅助工具,官网见这里。我一直用很长时间了,可以很方便的截屏,调色,量尺寸等小活,是辅助Flex/Flash开发的好东东。这里给张截图吧。

这就是它的功能菜单了,包括:
- Screen capture:除了截屏,可以做简单的编辑。不过我一直用Jing,基本上不用它
- Open Color Picker:在屏幕上取色
- Show Color Palette:调色板
November 4, 2009, 4:50 pm
在win32环境下,需要通过查找注册表来识别flash player插件的版本号:
/************************************************************************/
/* check flash version if it's 9.0 or higher */
/************************************************************************/
BOOL checkFlashActivexVersion()
{
HKEY hkey = NULL;
// if register do not have flash activex key
if (isKeyExists(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Macromedia\\FlashPlayer"), &hkey))
{
BYTE keyvalue[128];
DWORD valuelength = sizeof(keyvalue);
// get "CurrentVersion" value
if(RegQueryValueEx(hkey, "CurrentVersion", NULL, NULL, keyvalue, &valuelength) == ERROR_SUCCESS)
{
//
char *pfVersion = (char *)&keyvalue;
//pfVersion++;
if (*pfVersion >= '9' || *pfVersion == '1')
{
return TRUE;
}
}
}
return FALSE;
}
July 4, 2009, 10:37 pm
AS3有两类内建的class socket和XMLSocket,都是用来处理socket连接的。不同的是Socket可以处理二进制流,也可以控制文本的编码,比XMLSocket更加灵活,更加底层。而且它还有flush方法,反观XMLSocket则没有,在处理缓冲区的时候就更加控制自如了。基于Socket可以实现很多自定义通信协议。
虽然初看上去有点难,可是玩通了后就感觉很方便。呵呵,编程是需要些勇气的,多多尝试自己不熟的东西总会给自己带来些惊喜。言归正传,Socket的处理方式也属于经典的事件处理,无论是连接,发送,接受信息,都需要依赖事件反馈,所以,执行方法之前先建立时间监听总是不错的。一般的流程如下:
- 执行connect()方法
- 连接成功事件,失败事件,或者安全性事件,按照各自的需要实现处理方法
- 发送靠两类方法:writeXXX和flush,前者是把数据写入缓冲区,后者是立即发送缓冲区的内容
- 接收数据靠socketData事件,然后用readXXX方法一次读出缓冲区的内容
放个例子:
private function createAndConfig():void
{
_sock = new Socket();
_sock.addEventListener(Event.CONNECT, onConnectHandler);
_sock.addEventListener(IOErrorEvent.IO_ERROR, onCloseHandler);
_sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onCloseHandler);
_sock.addEventListener(Event.CLOSE, onCloseHandler);
_sock.addEventListener(ProgressEvent.SOCKET_DATA, onGetDataHandler);
}
private function onGetDataHandler(event:ProgressEvent):void
{
var _bytes:ByteArray = new ByteArray();
_sock.readBytes(_bytes);//read all
var _pack_len:int = _bytes.length;
var _pack_header:String = _bytes.readUTFBytes(4);
if(_pack_header == "ZPTX")
{
if(_pack_len>4)
{
try
{
//response
_bytes.position += 8
var cmd_id:uint = _bytes.readUnsignedInt();
if(cmd_id == 1003)
{
//common
var cp:CommonPackage = new CommonPackage();
cp.percentWidth = 100;
cp.initData(_bytes.readUnsignedInt(), _bytes.readUnsignedInt());
_reclist.addItemAt(cp, 0);
}
}
catch(e:Error)
{
//
sendEmpty();
}
}
else
{
//send last request again
if(_buff)
{
_sock.writeBytes(_buff);
_sock.flush();
}
}
}
this.dispatchEvent(new Event("received"));
}
public function sendBytes(_msg_bytes:ByteArray, _msg_id:uint):void
{
//package msg
var msg_len:uint = _msg_bytes.length;
var _whole_msg_package:ByteArray = new ByteArray();
_whole_msg_package.writeUnsignedInt(msg_len+8);
_whole_msg_package.writeUnsignedInt(_msg_id);
_whole_msg_package.writeBytes(_msg_bytes);
var _msg_package_len:uint = _whole_msg_package.length;
//whole package
var _bytes:ByteArray = new ByteArray();
_bytes.writeUTFBytes("ZPTX");
_bytes.endian = Endian.LITTLE_ENDIAN;
_bytes.writeUnsignedInt(_msg_package_len+8);
_bytes.endian = Endian.BIG_ENDIAN;
_bytes.writeBytes(_whole_msg_package);
//store
_buff = _bytes
_sock.writeBytes(_bytes);
_sock.flush();
}
另外有几个地方要注意:
June 30, 2009, 11:07 am
Adobe新发布了Flash Builder4,改名字了不是么,除了flex builder之外多了一个附属的协作工具Flash Catalyst。我的感觉,Flash Catalyst是一个专属于flex开发的设计工具,是给设计人员使用的。我以前也喜欢过做设计,于是单独下载Flash Catalyst体验下。

最引人注目的就是上面的PAGES/STATES,有了这个就很像flex的设计工具了。Flex引入了状态的概念,来为服务器数据提供眼花缭乱的动态或静态的显示方式。其他方面,弱化了基础绘画功能(素材主要是来自导入),而添加了基本的flex事件,绑定功能(都是比较简单的基于标准组件的功能,以后的工作当然是交给flex builder了)。可以说,Flash catalyst是连接flash/photoshop等设计工具和flex builder的桥梁,让协作更加的顺畅。这让我想起,以前设计人员给我psd,然后我还得花上一天时间吧psd里的元素抽出来保存到png,真的很痛苦。我想有了flash catalyst后这类工具后肯定会改善吧。
不过还是有点担心吧,这毕竟是看起来很初步的工具。需要给设计人员培训,也不知道能不能支持自定义组件。如果是一个复杂的flex,还是可能碰到很多问题。这是一条很长的路,希望Adobe可以越做越好。