• 1.如何使用Matrix类来改变注册点:

    做相册功能时一开始最烦的就是注册点在(0,0)的位置,为了能方便的旋转、缩放操作,需要将注册点移动到中心,参考雪の猫的方法,做了简化:

    var obj=this.myImageBitmap; //要改变的图片或影片剪辑
    var matrix:Matrix = obj.transform.matrix;
    matrix.tx=0;
    matrix.ty=0;
    var halfW:Number = obj.width/2;
    var halfH:Number = obj.height/2;
    matrix.translate(-1*halfW,-1*halfH);

    这样在旋转、缩放的操作时能看到注册点居中的效果,实际上就是利用transale函数将matrix属性的tx、ty值往左上角方向移动半个宽度和高度;

     

    2.保存图像时为何一旦做过旋转操作就会看不到图片?

    虽然用matrix平移的方法能改变注册点,而实际上AS3.0并没有能真正改变注册点(网上的其他方法也是),注册点还是在(0,0)点的,不过是这样对旋转、缩放会有注册点在中心的效果罢了。但是,一旦使用rorate函数进行了旋转,这个边角的注册点却会跟着移动,比如,将图片顺时针方向转90度,那么,原来在左上角的注册点,却会移动到右上角去了!

    而保存图像的时候,AS3.0是将图片的注册点跟你的BitmapData对象的左上角对齐,这就不难想像保存后的图像会是什么样子了!如果图像没旋转,注册点就在(0,0),那保存在图像应该很完美;一旦向任意一个方向做了旋转,那么你将什么也看不到,因为图像的内容已经跑到BitmapData的范围之外了!

    解决方法,就是在保存的时候,当调用BitmapData的draw(myImageBitmap.bitmapData, new Matrix() )方法写入图像时,将传入的Matrix再做一次正确的平移。

    比如假设前提是只做每次90度旋转(像xp自带图片浏览器的旋转功能一样),那么在执行保存函数前做一次计算和平移,下面是简单的算法:

    var tx:Number=myMatrix.tx, ty:Number=myMatrix.ty;
    var tx1:Number=0, ty1:Number=0;
    if(tx<0 && ty<0){
    tx1=-1*tx;
    ty1=-1*ty;
    }else if(tx>0 && ty<0){
    tx1=tx;
    ty1=-1*ty;
    }else if(tx>0 && ty>0){
    tx1=tx;
    ty1=ty;
    }else if(tx<0 && ty>0){
    tx1=-1*tx;
    ty1=ty;
    }
    myMatrix.translate(tx1,ty1)

    然后调用BitmapData的draw方法 写入,在执行保存函数,应该就可以查看到正确的图像了。

  •     这两天需要将一个flash的播放器里面的配置项移出来改为用独立的xml文件作配置。

        我这个半路出家的actionscript程序员还是第一次用到XML这个类。看了一下文档,在本地上用testXml.load("test.xml","GET")很快就Load进一个文件进行解析。于是将整个播放器的全局变量都改写,移到新建的xml文档中。传上服务器的文件夹之后,调试表明居然是莫名其妙地Load进其他的xml文件了。load进来的xml是我以前已经修改过的xml文件,可以保证服务器上没有这个文件。

        重新查看文档,明白到要远程加载xml文件需要输入的参数一定要是Url路径的。原来加载到的那个xml,估计是客户端和下载到本地磁盘的swf文件在同个临时文件夹中的重名文件。那确实是难得的巧合,让我疑神疑鬼了很久。

        新的问题是如果要把本是配置项的url路径写进flash文件,那么还要配置文件来干什么?只能找些取巧点的方法了。

        在帮助文档中找到个方法,用Movie._url属性能获取该影片的url路径。于是用这个属性来获取运行的swf文件的url,将配置的xml文件与swf文件放在同一个目录下,用字符串改成xml文件的路径就是了:

        var url_this=_root._url;
        var url_dir=url_this.substring(0,url_this.lastIndexOf("/")+1);
        var url_config=url_dir+"config.xml";

        传上服务器后是OK的。

        不过AS2.0的XML类也有比较烦人的地方,比如查找xml节点比较麻烦,如果用XPath需要引进import com.xfactorstudio.xml.xpath.*;的组件,很别扭,好在flash8的客户端程序还有个新属性:idMap,能通过id直接查找节点,非常好用。

        var testXml1=new XML();
        testXml1.ignoreWhite=true;
        testXml1.load=("http://.../.../test.xml","GET");

        testXml1.onData=function(src:String){
           var testXml2=new XML();
           testXml2.parseXML(src);
           var value=testXml2.idMap["testId"].firstChild.nodeValue;
           …………
        };

        不过可惜FMS服务器端写asc文件就没这些优待了。还是得通过节点上下文的关系查找。

        另外最让我头疼的还是xml的加载是异步的,XML对象通过load进一个xml文件之后,要等待onData事件被触发后才能将xm文件的信息提取出来。这个时候事件之外的程序早就执行完了。不过一般情况下都不会恼人,因为事件驱动本来也是个优点,可以让onData里面拿到配置文件的数据后才调用主函数启动应用程序。不过不幸的是我的程序的情况是不允许这样做,只好使用土方法:用一个定时器每0.1秒检查一下xml文件Load完了没有,等load完了才执行主函数:

        function startApp(){
            if(testXml.loaded){
                clearInterval(intevalID);
                Main();
            }
        }      
        var intevalID=setInterval(this,"startApp",100)

        这方法是有效。不过到了FMS的服务器端程序中就不能这样用了。因为服务器端的配置文件是要求在应用程序被加载时触发的事件application.onAppStart()中进行读取的。而很可能配置项还没读完,客户端已经开始连接,application.onConnect()也被触发了,那么onAppStart中所要执行的用户验证等动作都没完成,客户端也就收到“连接失败”的信息。

        暂时没想到什么很好的解决方法。当然,可以用上面的方法变通一下,改为让客户端的flash多尝试几次连接,连接超过几次返回错误才提示用户连接失败。

        总之,将flash程序改为用xml做配置文件会遭遇这么多麻烦的问题,我事先是没预料到的。
    Tag:Flash 编程
  •     在搜乐看到介绍这个叫Winterbells的Flash游戏:



        漂亮温柔的夜幕场景,可爱雪白的兔子,梦幻一般从空中垂垂飘落下来的铃铛,小提琴演奏的音乐又是这么平和优美,圣诞节未到,气氛已经来了。玩的方式是用鼠标操纵兔子不断踩着铃铛向星空高处跳跃,坚持越久就能拿到越高的分数,有点难度哦。
       
        一眼看到这游戏,我心里马上就将它评为圣诞节的精品!希望能有很多人从这flash里感受到圣诞节的欢乐~
    Tag:Flash 游戏