Posts tagged ‘flash’

Django系列谈(一)

Python是一种很优雅的语言。优雅这个字,在我理解是,用最少的话表达最多的意思,说白了就是开发效率。我觉得作为程序员应该会一种优雅的语言。在紧急或者懒惰的情况下,可以最快最高效的帮助完成一些任务。作为一个flashflex的coder,最头疼的莫过于,需要后台,至少说,需要一个测试用的后台。Python是搭建简易后台最有效率的技术之一。

这个“之一”一定要讲,不然容易造成论战。不错,除了python,有人还喜欢ruby,或者php。他们code的效率同样很高。争来争去是没有意义的,我感觉,与其耍嘴皮子,搞些有意义没意义的辩论,还不如关注你手上可以用的资源。如果你认定了Python,那么马上学习吧,拿起来就用吧,我们只是要测试用后台不是么,黑猫白猫,能抓老鼠就是好猫。邓爷爷的话一定要相信。

如果你惦记着纯用Python搭服务器,那你一定够傻了。要知道python可以做很多事情,能力很强的劣势就是,比较“底层”(当然跟C比较的话,编程效率高)。为什么不用framework呢。flash的开发效率同样比较低,所以才有flex冒出来。framework就是用来降低工作量的,就像很多所谓的牛人在给他们的产品做广告时说的那样,我们尽可能的让开发者关注业务,而不是实现。说的多好。

Django是很好很强大的web framework。它的好处是:

  • 自带一个测试服务器。可以免去IIS和apache。不需要安装额外的服务器软件。
  • 绝少的配置选项。
  • 自带一个简易的管理系统。可以管理数据库的增删改。
  • 依靠python解释执行的好处,做修改可避免服务器重启
  • 快速实现MVC

上面是虚的,实的嘛,下回分解。

localhost下模拟慢网速

Flash IDE 可以为调试的swf模拟网速来测试进度条。如果是Flex builder呢,似乎是没有的,不过千万别在这个问题上钻牛角尖,因为这实际上是本地服务器的职责,而不是flex builder该干的工作(flex builder编译完成并启动页面后就结束任务了)。

在这种情况下要为flex模拟慢网速的话,就要使用proxy工具了,我这里推荐ServiceCapture,当然很多http检测工具都带有模拟网速的功能,我选serviceCapture除了它能检测http,还能读出trace和AMF协议,简直是Flash专用工具。

首先你需要安装serviceCapture for firefox 插件,让它“干预”firefox上的调试。

sc_1

sc_2

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

sc_3

避免try catch,提升Flash性能

在一些实时性能要求比较高的应用中,如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可以长盛不衰的原因吧。

SlideshowPro for flash

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 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>

flash游戏中的数学问题

LongLongAgo,在做泡泡龙游戏的时候,发现数据结构的好处。使用树结构的数学模型可以清晰的描述逻辑处理方式。比如在判断是否有球掉落的时候,见下图,就可以用这样的数学语言描述:“对某个球而言,不存在一条路径到达root”。root就是最顶层。

泡泡龙

泡泡龙

如果这样的球存在的话,就说明它是“浮空”的,也就是说可以掉下来了。

这类的数学描述在很多领域都用过,记得flash的垃圾回收机制么,原来使用计数法来判断一个对象要不要被消灭,如果用在displayObject树结构里就不够了,因为它们可以相互引用,于是,用上面所说的数学描述就成了很好的补充,跟泡泡龙的原理类似,如果有一个displayObject不能到达root的话,它就脱离了显示树,就该被消灭,而不用管计数是多少。

回到泡泡龙的问题上来,一个被发射上来的球可以看成一个根节点,当它被打到一堆球当中的时候,一个树结构就形成了:以这个新球为根,周围的六个球为第一层子节点(可能某些是空,或者重复应用,需要剔除),然后使用广度优先或者深度优先遍历来查找“通往root的路径”,再加上些优化,就能实现这种数学描述,从而完成“掉落”这个游戏功能。

数学在flash游戏中无处不在。此乃往事,特此笔记。

Flex builder 配合 FlashDevelop开发模式

每次谈到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来链接类库代码。

显然第二种方式更好,可以有效的将测试代码和类库代码分开。

轻便实用的瑞士军刀 — picpick tool

设计用的辅助工具,官网见这里。我一直用很长时间了,可以很方便的截屏,调色,量尺寸等小活,是辅助Flex/Flash开发的好东东。这里给张截图吧。

这就是它的功能菜单了,包括:

  • Screen capture:除了截屏,可以做简单的编辑。不过我一直用Jing,基本上不用它
  • Open Color Picker:在屏幕上取色
  • Show Color Palette:调色板

C++检测flash player 版本

在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;
}

flash.net.Socket使用入门

AS3有两类内建的class socket和XMLSocket,都是用来处理socket连接的。不同的是Socket可以处理二进制流,也可以控制文本的编码,比XMLSocket更加灵活,更加底层。而且它还有flush方法,反观XMLSocket则没有,在处理缓冲区的时候就更加控制自如了。基于Socket可以实现很多自定义通信协议。

虽然初看上去有点难,可是玩通了后就感觉很方便。呵呵,编程是需要些勇气的,多多尝试自己不熟的东西总会给自己带来些惊喜。言归正传,Socket的处理方式也属于经典的事件处理,无论是连接,发送,接受信息,都需要依赖事件反馈,所以,执行方法之前先建立时间监听总是不错的。一般的流程如下:

  1. 执行connect()方法
  2. 连接成功事件,失败事件,或者安全性事件,按照各自的需要实现处理方法
  3. 发送靠两类方法:writeXXX和flush,前者是把数据写入缓冲区,后者是立即发送缓冲区的内容
  4. 接收数据靠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();
		}

另外有几个地方要注意:

  • 数据的写入或读出方式要看Endian,就是正序和反序,正常排列方式就是bigEndian,见http://en.wikipedia.org/wiki/Endianness
  • 缓冲区就是保存socket发送和接受数据的内存区,writeXXX并不是直接发送出去,而是保存到缓冲区等待,flush才是把缓冲区的内容发出。要注意,一条指令写完后就要flush。

体验一下Flash Catalyst

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可以越做越好。