用AS3来解析HTTP头部

AS3的URLLoader本身没有提供解析HTTP头部的功能,而在应用中,我们偶尔也会需要去解析HTTP头部,可以通过HTTP头部获取一些状态信息或者一些其他数据。

幸好AS3提供了Socket类,我们可以利用Socket来模拟HTTP请求,解析HTTP头部以及返回的内容。基本原理很简单:连接服务器的80端口或者其他web端口,向服务器发送请求头,基本上和下面类似:

GET /web/crystal/v1.1Beta01Build011/crystal_ext-min.js HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Accept-Encoding: deflate
Host: adsfile.qq.com

最新版flashplayer 10.1可能存在的一个安全问题bug

最近flashplayer 10.1升级到了10.1.82.76,由于该版本在安全性控制方面做了许多改进,导致出现了如下的问题。

在Firefox或者Chrome浏览器下,当跨域向远程服务器请求数据时,如果URL使用的是GBK编码的,那么即使在远程服务器上有安全策略控制文件,仍然会引发安全错误。而同样的服务器,使用UTF8或者纯ASCII码做URL则不存在此问题。

也有人发现了相同的问题:http://forums.adobe.com/thread/699750?tstart=0

此问题已提交至Adobe Flash Player Bug跟踪系统中,等待响应。

因此,建议大家尽量不要使用中文名作为URL路径,能使用英文字符的尽量使用英文字符,虽然有时候是难看一点。…

在AS3调用Firebug的console时被雷了

写了这么一段as3的代码,用到了E4X,Firebug是自己写的一个用来调用Firebug的console的调试类:

var x:XML = evt.message as XML;
Firebug.info(x.toString()); // 正常输出XML内容
Firebug.info(x is XML);     // true
Firebug.info(x.@status);    // 没有输出,但的确是有这个属性的

莫名奇妙,不知道啥原因,翻了手册,也Google了,还是不知道啥原因。于是想想这样一试:

var x:XML = evt.message as XML;
var status:String = x.@status;
Firebug.info(x.toString()); // 正常输出XML内容
Firebug.info(x is XML);     // true
Firebug.info(status);       // 成功输出status属性的值“success”

真让人崩溃!为什么一开始的写法就不能输出呢?不懂,有明白的人指点下吧,谢谢!…

其实AS和JS互相调用有个很酷的特性

JavaScript和ActionScript互相调用时,其实有个非常好的特性,不过貌似很少有人提到这个特性:它们之间的数据类型对方均可以识别。因此,你可以通过swf提供的接口来传递对象、数组、字符串等等。不过它们之间传递的参数的值的长度有限制(具体长度还没仔细测试),因此你不能把JavaScript中的一个超大的对象直接传递进去。不过即使是这样,已经非常好用了,看看示例代码:

AS(ActionScript)代码:

// 创建一个行的TextField来显示调用结果
var t:TextField = new TextField();
t.x = 10;
t.y = 10;
t.width = 300;
t.height = 200; 
this.addChild(t);

// 这个是要给JavaScript调用的函数
function test(obj){
    var s = [];
    for(var p in obj){
        s.push(p + ': ' + obj[p]);

AS3里面的TextField的Format的设置

在AS3里面,你每次创建的一个TextField对象都有一个相同的默认TextFormat,当你每次改变这个TextField里面的文本内容时,这个里面的文本使用的格式就是默认的格式(默认的TextFormat)。比如下面的代码可能和你期待的效果一样:

var fmt:TextFormat = new TextFormat();
fmt.align = TextFormatAlign.CENTER;
fmt.color = 0xffcc00;
fmt.size = 14;

var tf:TextField = new TextField();
tf.width = 140;
tf.height = 24;
tf.text = 'This is just for test';
tf.setTextFormat(fmt);

这个时候,这个文本的颜色是橙红色,字体大小为14号,没有任何问题,和我们所期待的一样。但是如果接着你改变这个文本的内容:

tf.text = 'This

AS3位图任意形变一步一步来(4)——任意形变

转载请注明出处:http://fdream.net,作者:Fdream

放着放着就忘了,多亏army同学在后面催我,要不然还真不知道什么时候会继续弄这个。今天上午又抽空捣鼓了一下,偏移总算是弄出来了,不过渲染效率很低,中间的计算过程应该还可以继续优化的。另外,弄到这里发现还是有问题,分得较细的时候会出现裂缝……误差真可怕!

先不管这个误差,我们来看看能不能形变先。由于计算形变矩阵需要初始的坐标和新的坐标,需要两个方法来计算(貌似可以合并?):

// calculate points
// 包含x坐标和y坐标,分别存储在pxs和pys数组中
// @params:
//   w: 位图宽
//   h: 位图高
//   hs: 水平分段数
//   vs: 垂直分段数
// @return:
//   void
function CalculatePoints(w:Number, h:Number, hs:Number, vs:Number):void {
    var iw:Number

load外部swf并共享变量

如果你在做flash开发,这个应该是经常碰到的事情:用a.swf加载b.swf,然后需要在b.swf中调用a.swf的方法或者变量。在as2里面实现这个很简单,root就是万能的。在a.swf中,用loadMovie的方法load b.swf到一个MovieClip后,b.swf就可以通过_root或者_parent来访问a.swf中的变量了。不过这招在AS3中已经不灵了,得换个方式。

在as3中,有这样一种方式可以实现:在a.swf中,使用Loader类来load b.swf,在load完成之后,调用b.swf中的一个方法,把a.swf的引用传入或者把相应变量传入给b.swf。一个简单的例子如下:

在a.swf的文档类或者时间轴上这么写:

// 这个是我们要访问的变量
var ab:String = '1234';
// 加载b.swf
var ldr : Loader=new Loader();
ConfigureListeners(ldr.contentLoaderInfo);

AS3位图任意形变一步一步来(3)——切割位图

对不起,让大家久等了,继续写blog。

今天我们继续研究位图的任意形变,今天的主要目的就是从外部加载一张图片,然后分割成两个三角形。当然了,分割成两个三角形是远远不够的,这一点,我们在后面会讲到。

从外部加载一张图片很简单,使用Loader类就可以轻松完成了。不过要注意的是这里是Loader类,在包flash.display下,而不是flash.net下的URLLoader类。这个类使用很简单,如下(为了简单,这就不写那些条条框框了,直接写在时间轴上了,所有的代码都在第一帧):

// 这个是我们要load的图片
var url:String = 'green.jpg';

//这个是用来保存位图数据的
var bmd:BitmapData = null;

// load方法
function Load():void {
    var req:URLRequest = new URLRequest(url);
    var loader:Loader = new

AS3位图任意形变一步一步来(2)——计算变换矩阵

转载请注明出处:http://fdream.net,作者:Fdream

由于仿射变换时,平行的边依然平行,所以,我们无法对一个矩形的位图进行随意变换,比如我们无法拉伸一个角,也无法进行把它变成梯形等。在上文中,我们提到过一种思路,就是把矩形分割成两个三角形,这样变换时从表面上看来就没有什么平行边了,这样我们就可以变换其中的一个或者多个角了。注意,我这里说的是从表面上看,这一点在后面的变换中要进行一定的处理的。

这样我们只需要对三个点进行平面变换,假设我们的三个点分别为(x1, y1)、(x2, y2)、(x3, y3),要变换的位置分别为(x1′,y1′)、(x2′, y2′)、(x3′, y3’)、现在,我们要做的就是计算其变换矩阵。假设其变换矩阵为:

注意,在Flash中,其对应的变换矩阵应该是这个(平移变换的位置略有不同):

根据…

AS3位图任意形变一步一步来(1)——了解矩阵变换

转载请注明出处:http://fdream.net,作者:Fdream

在Flash/ActionScript中,只提供了仿射变换功能。仿射变换包括平移(x 和 y 重新定位)、旋转、缩放和倾斜,在进行这些形变时,平行线仍然会保持平行,因此没办法做到任意形变。

实现位图或者MC(MovieClip)的任意形变的一种方式就是把它们分割成三角行,然后对三角形进行相应的仿射变换。比较流行的PV3D(papervision3d)就是采用的这种方式。

一切从简单开始,我们先看看一个点在平面上的几个简单的基本变换。一般来说,我们都将平面上的一个点表示为一个1×2的矩阵,我们可以通过将改点乘以一个2×2的矩阵来对该点进行变换。以下是一些简单的示例:

由于平移变换不是线性的,因此不能表示为2×2的矩阵,通过与一个1×2的矩阵相加即可得到相应的平移变换位置。上图中的取镜像变换从某种意义上也可以看做是一种平移变换:

通过上面的一些基本变换方式,我们可以得到一些比较复杂的变换:…