日历

« 2008-07-06  
  12345
6789101112
13141516171819
20212223242526
2728293031  

我的好友

最新评论

统计信息

  • 访问量: 1053
  • 日志数: 7
  • flash数: 1
  • 书签数: 1
  • 建立时间: 2007-11-20
  • 更新时间: 2008-05-26

RSS订阅

工程和艺术是不分家的

我的最新日志

  • flash player 10 beta, GPU 支持!3D支持!

    2008-5-26


    似乎知道这件激动人心的事情已经晚了好多天,在这个极速的信息时代,显然已经落后别人好多 - -
    新的flashplayer增加了许多令人兴奋的新特性,下面是我比较感兴趣的:

    1.支持GPU!提供3DAPI!无需废话,这一功能万众期待了好久。(3DGame!3D交互!cool!)
    2.流媒体UDP传输支持!动态Streaming支持!新的音频Codec,另外还有动态产生音频流的功能!(这对音乐游戏简直是莫大福音)
    3.Shader!自定义滤镜!加强的绘图API!而且可以利用GPU!(....又有很多奇思妙想的东东要出现了)
    4.传说中的p2p!(只是小道消息,说Adobe已经内置了但没有公开,难道是Adobe的策略?怕MS及时抄袭?)
    5.可以保存到本地文件?!(结合p2p这个是不是有点恐怖啊...,但愿安全方面已经考虑得十分周到)
    6.文本的支持,特别是亚洲文字和中文的支持!新的文本抗锯齿引擎!(美工们再也不用头疼字体的问题了)
    7.Ecmascrīpt4中的 Type Array,更好的时间与空间效率!(Generic的东东,估计还有一些其他ECMA4的东东吧,这一块儿是应该提高,相比MS,Adobe在这一块的确是差不少)

    总体上比silverlight2 beta更令人心动(上个月问了silverlight2宣讲工程师关于3D的支持问题,似乎silverlight在其roadmap中还没怎么考虑呢)

    初步看了一下新的AS3 Refercnce
    比较关键的几个包:

    3D Model的
    flash.geom:

     ClassDescrīption
     Matrix3D The Matrix3D class represents a transformation matrix that determines the position and orientation of the three-dimensional display object.
     Orientation3D The Orientation3D class is an enumeration of constant values for representing the orientation style of a Matrix3D object.
     PerspectiveProjection The PerspectiveProjection class provides an easy way to assign or modify the perspective transformations of a display object and all of its children.
     Point The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis.
     Utils3D The Utils3D class contains static methods that simplify the implementation of certain three-dimensional matrix operations.
     Vector3D The Vector3D class represents a point or a location in the three-dimensional space using the Cartesian coordinates x, y, and z.
    Render的:
    flash.display

     Graphics The Graphics class contains a set of methods that you can use to create a vector shape.
     GraphicsBitmapFill Defines a bitmap fill.
     GraphicsEndFill Indicates the end of a graphics fill.
     GraphicsGradientFill Defines a gradient fill.
     GraphicsPath A collection of drawing commands and the coordinate parameters for those commands.
     GraphicsPathCommand Defines the values that can be used when specifying path drawing commands.
     GraphicsPathWinding 
     GraphicsShaderFill Defines a shader fill.
     GraphicsSolidFill Defines a solid fill.
     GraphicsStroke Defines a line style or stroke.
     GraphicsTrianglePath Defines an ordered set of triangles that can be rendered using either (u,v) fill coordinates or a normal fill.
     InterpolationMethod The InterpolationMethod class provides values for the interpolationMethod parameter in the Graphics.beginGradientFill() and Graphics.lineGradientStyle() methods.
     JointStyle The JointStyle class is an enumeration of constant values that specify the joint style to use in drawing lines.
     LineScaleMode The LineScaleMode class provides values for the scaleMode parameter in the Graphics.lineStyle() method.
     PixelSnapping The PixelSnapping class is an enumeration of constant values for setting the pixel snapping options by using the pixelSnapping property of a Bitmap object.
     Shader A Shader instance represents a pixel shader in Actionscrīpt.
     ShaderData A ShaderData object contains properties representing any parameters and inputs for a shader kernel, as well as properties containing any metadata specified for the shader.
     ShaderInput A ShaderInput instance represents a single input image for a shader kernel.
     ShaderJob A ShaderJob instance is used to execute a shader operation in the background.
     ShaderParameter A ShaderParameter instance represents a single input parameter of a shader kernel.
     ShaderParameterType This class defines the constants that represent the possible values for the ShaderParameter class's type property.
     ShaderPrecision This class defines the constants that represent the possible values for the Shader class's precisionHint property.
     TriangleCulling Defines codes for culling algorithms that determine which triangles not to render when drawing triangle paths.

    还有很多地方,sound的sampelData,text等等,都有一定的增加。

    下面这个是Adobe的bug跟踪系统,有兴趣的可以看看
    http://bugs.adobe.com/jira/secure/BrowseProject.jspa

    接下来打算玩一玩这些新功能,写写demo,有机会的话和silverlight2 beta做一些比较,搞一个使用手记出来,哈哈,说不定还能为Adobe找几个bug呢。(身在曹营心在汉? 呵呵,只支持最好用的!)


  • AS3 下的图片字符生成

    2008-2-04

                                            
            GG3S,                          
           ;@@@H     s9999X2222222222225:  
           9@@@i     XBHHHHHHHHHHH#@@@@@2  
      23333@@@#33333X:          sA@@#&S,   
      ABBB@@@@BBB#@@@s       SG@@@AS       
         ,#@@G   &@@B        M@@@;         
         &@@B    M@@3 .......M@@@r.......  
        S@@@;   i@@@s:@@@@@@@@@@@@@@@@@@@9 
       S@@@2    M@@H. iisssss#@@@5ssssssi: 
       &#@@#&Xr3@@@;         M@@@:         
         ,ihB@@@@@G          M@@@:         
           ,3@@@@@@@&S       M@@@:         
        .5G@@@HS sAMX:       M@@@:         
     5hM@@@M3;          i###@@@@M          
     ,XMB3r              hHAG35r           

    网上流行复古的图片字符,觉得挺好完的,很复古的感觉。有点空闲的时间,就琢磨着怎么用Flash来实现。

    只是一个函数,感觉没必要封装,代码就贴在下面了:

            private function picture2String(bmpData:BitmapData,size:uint,template:String):String{   
                //灰度化
                var matrixArr:Array = [ 0.299,0.587,0.114,0,0,
                                        0.299,0.587,0.114,0,0,
                                        0.299,0.587,0.114,0,0,
                                        0,    0,    0,    1,    0 ];
                var cmFt:ColorMatrixFilter = new ColorMatrixFilter(matrixArr);
                bmpData.applyFilter(bmpData,bmpData.rect,new Point(0,0),cmFt);
               
                //分割图像,
                var total:uint = size * size /2;
                var interval:Number = 0xFF / (template.length-1);
                var cols:uint = uint(bmpData.width / size) * 2;
                var rows:uint = uint(bmpData.height / size);
                var arrDrawing:Array = new Array();

                for(var i:uint=0;i<rows;i++){
                    for(var j:uint=0;j<cols;j++){
                        var b:BitmapData = new BitmapData(uint(size/2),size);
                        b.copyPixels(bmpData,new Rectangle(j*uint(size/2),i*size,uint(size/2),size),new Point(0,0));
                        var data:ByteArray = b.getPixels(b.rect);
                        data.position=0;
                        b.dispose();
                        var sum:uint = 0;
                       //计算区域图像的灰度均值
                        for(var rgb:uint;data.position<data.length;rgb=data.readUnsignedInt()){
                            var temp:uint = rgb & 0x000000FF;
                            //if(temp >190)temp
                            sum += temp;
                        }   
                        var avgRGB:uint = uint(sum / total);
                        var index:uint = uint(avgRGB / interval);
                        //匹配字符
                        var c:String = template.charAt(index);
                        arrDrawing.push(c);
                    }
                    arrDrawing.push('\n');
                }
                return arrDrawing.join('');
            }

    使用方法:

            var picString:String = picture2String(bmpData,12,'@#MBHA&Gh93X25Sisr;:,.   ');
          
    其中 bmpData是draw过来的BitmapData图像数据,12代表,每个字符代表的图像大小为(12/2)*12,字符串'@#MBHA&Gh93X25Sisr;:,.   '是模板,表示灰度的值从小到大依次代表的字符。



  • Flash扩展实践(1)

    2008-2-04

    经常接一些小游戏的活来做,程序里面用到大量的AS链接资源。在Flash8里面如果选择一个资源作为AS链接的话,默认会把”在第一帧导出“的选项也同时选上。显然这是为了我们开发者省事的一个小设计,使我们每次少点击一下鼠标,因为如果不选择在第一帧导出的话,必须把该资源拖到时间轴的某一帧上,才能被AS使用。这样问题就来了,一个正常的游戏,如果不使用外部的loader的话,那么必须让第一帧空出来只放loading的资源,而让所有的资源都放在第一帧之后,这样才会在下载的过程中很快地下载完第一帧,loading才能及时显示出来。然而一个项目开始的时候经常是做很多修改,如果每分配一个链接,都手工把它放到第二帧或者其他的”存贮帧“的话,一是很麻烦,二来一旦这个链接资源不再作为”存储帧“,或者有其他改动,你就得从”存贮帧“里面把其删掉。很是麻烦。所以大多情况下,我都是按照默认选择让其从第一帧导出,这样做测试起来很方便。不过到了最后要做loading的时候,痛苦的事情就来了,需要从库里面查到每一个AS链接资源,并把他们放到”存储帧“里。这样无聊机械令人痛苦的活儿从任何一个编程者的角度看是不能忍受的。
    不过好在有了Flash Extension,我写了一个10行左右的脚本就解决了这个问题。下面就是代码:

    createLibray.jsfl

    fl.getDocumentDOM().getTimeline().addNewLayer("library");

    fl.getDocumentDOM().getTimeline().insertBlankKeyframe(1);

    fl.getDocumentDOM().library.selectAll(true);
    var selItems = fl.getDocumentDOM().library.getSelectedItems();
    for(var i=0;i<selItems.length;i++){
        var m = selItems[i];
        if(m.linkageIdentifier&&m.linkageExportInFirstFrame){
            m.linkageExportInFirstFrame = false;
            fl.getDocumentDOM().addItem({x:0,y:0},m);
        }
    }

    这个脚本首先创建一个新的层,并在该层上的第二帧上创建了一个空白关键帧。
    然后选择所有的库元件,并查出哪些是AS链接资源,然后把这些链接资源都加到新的帧内。

    把这个脚本放到Flash的配置文件夹下就可以从命令面板下直接使用了
    具体位置是:
    C:\Documents and Settings\你的账户\Local Settings\Application Data\Macromedia\Flash 8\zh_cn\Configuration\Commands\

    原来没有发现Flash Extension的强大,事实上,他能充分的发挥你手中Flash IDE的威力,比如在普通的横版游戏制作过程中,可以使用Flash Extension 让你的Flash IDE 变成一个很好用的游戏地图编辑器,呵呵,关于这个我们以后再说吧。
  • [转]从Java开发者的角度看ActionScript虚拟机

    2008-1-07

    Actionscrīpt Virtual Machine 2(AVM2)在Flash Player 9运行时环境中执行Actionscrīpt 3.0(AS3)字节码。Actionscrīpt 3是一种面向对象编程语言,用于在Adobe Flex和AIR中构建Flash应用程序。AS3完全符合ECMAscrīpt标准第3版。

    对Java开发者来说,虚拟机的概念并不新鲜,但AVM2中还是有好些特性值得一观。Per Olesen上周发表了一篇博客文章讨论AVM2中若干值得注意的特性,包括:强类型、方法闭包、即时(JIT)编译器和垃圾收集。

    类型信息

    AS3支持强类型,Olesen说:
    在AS3之前,代码编译后所有类型信息都会被剥除。在运行时,所有东西都只是动态类型的小原子。从AS3起,类型信息会一直保留到运行时。

    ……使用类型明确的变量可以提高性能表现和降低内存消耗。

    方法闭包

    AS3支持方法闭包,Olesen说:
    AS3给我们提供了方法闭包,也就是说我们可以创建实为函数的变量,并四处传递它,而该函数仍然保持着它被创建之时的上下文环境(也就是说“this”仍然是定义函数时的那个“this”)。
     
    在Gary Grossman和Emmy Huang的文章《Action scrīpt 3.0概观》中,他们描述了方法闭包的主要用途:
    由于方法闭包,Actionscrīpt 3.0中的事件处理得以提供内建的事件委托,从而得到了简化。

    myButton.addEventListener("click", someMethod);

    即时(JIT)编译器

    JIT编译这种技术将字节码转换成原生机器码来提高性能。Adobe的文档《Actionscrīpt Virtual Machine 2 (AVM2) Overview》详细解说了它对开发者的影响:

    在实践中,AVM2可经由JIT在运行时转换代码,但这并不会影响程序执行的语义,只会影响性能。
    Olesen指出了开发者应当注意的一个影响:

    AVM2的JIT有一个地方应该注意:构造器是不被JIT的,因此如果你的一个类里有严重影响性能的代码,把它移出构造器。
     
    垃圾收集

    Olesen从大框架上描绘了AVM2中的垃圾收集:
    内存管理和垃圾收集器属于MMgc子项目。它采用了一种延迟引用计数(Deferred Reference Counting,DRC)机制,并结合一个增量的、保守的标记/清除收集器。当然,垃圾收集器实现已经为达到最佳的客户机性能作了优化,它使用小尺度 (30ms)的时间片。

    如果读者想查阅更多资料来源,Farata Systems有一篇文章详细比较了Java 5和Actionscrīpt 3的语法异同。另外,在Mozilla Tamarin Project的资料中可以找到AVM2的更多信息。(译注:Tamarin是Adobe将AVM2捐献给Mozilla之后的产物,目标是构建一个高效、开源的ECMAscrīpt 4实现。)Tamarin是Flash Player 9和AIR平台使用的AVM2实现。另外,Adobe有一个专门为Java开发者服务的Flex社区网站:http://flex.org/java/

    对于Java开发者来说,Actionscrīpt的语法以及虚拟机架构与Java都有不少相似之处,这应当会让学习过程变得轻松一些。
  • 【翻译】大公开:十种做Flash游戏赚钱的方法

    2008-1-01


    如果你做Flash游戏纯粹是为了兴趣或者是好玩,那为什么不一边玩一边赚钱呢?我曾做过很多Flash游戏并因此赚了不少钱。下面我就要公开我总结的十条做Flash游戏赚钱的秘笈。

    好了,现在我们切入正题,当前的情形是,你开发了一个很伟大的Flash游戏,并期望从中赚上一笔。


    1. 你可以从一些游戏网站上获得赞助。这就是说某些网站会赞助你一些钱,作为交换条件你需要将他们的LOGO标志和网站链接放到游戏中。你会问,这些网站为什么要这么做呢?这是因为当有人玩你的游戏的时候可能会点击这些链接而为这些网站带来流量,他们可以从这些流量中获得广告收入或者其他好处。通常情况下给你的赞助从$50-$2000+不等,赞助多少取决于游戏的的好坏。不同的网站赞助的金额不同,他们的站点上通常会写清楚赞助金额有多少。这里列出了一些赞助商:ArmorGames, CrazyMonkeyGames 和 FlashRage. 毫无疑问,获得赞助是对你艰苦劳动有所回报的必要手段。


    2. 如果你有自己的网站,那么把链接放到你的游戏中,然后再把游戏提交到一些游戏门户上,如 Newgrounds,这样你的网站就会从中得到流量。然后在你的网站上放上一些广告,就能把这些流量变成真金白银,当然前提是流量足够大。


    3. 你可以在游戏里嵌入Mochi的广告,这会让每一个玩你的游戏的人给你带来收入。Mochi广告是世界上首家针对小游戏投放广告的,目前他们仅仅接受一些开发者,所以你需要申请入伙。Mochi的好处,即使你的游戏放在其他网站上,也会为你带来收入。


    4. 一些网站会举办竞赛,征集最优秀的游戏并给予奖金,例如Newgrouds。最好经常逛逛这些网站,看看什么时候有新竞赛举办。相比之下,竞赛的奖金一般比 拿赞助的方法高很多(这当然要取决于举办方是否财大气粗),但显而易见的是如果你没有金刚钻就不要揽瓷器活(有可能是一分钱都拿不到滴...0_0)。


    5. 还有一些网站,如果你把你的游戏提交给他们,他们会支付你一些广告的费用的。这是一种让游戏为你掘金的好方法。像GameGum就提供这种方式。


    6. 如果你的游戏真的很热,那么一些网站乐意用一大笔钱来购买它的非独占性许可证。这意味着你要将他们的LOGO链接放进游戏中,然而与赞助方式不同的是,卖给他们的只是游戏拷贝,该拷贝只能出现在他们自己的网站上,也就是说,你可以将许可证分别卖给很多网站,大大地赚上一笔!当然这一切的前提是,你的游戏的确很火爆。


    7. 更进一步,如果你的游戏超级棒,玩家成千上万,那么你就有可能赢得一些大奖,并得到一大笔奖金。显而易见的是,假如评上了一个奖,往往也会被其他大奖相中的。


    8. 如果你真的赢了好几个奖,很多人会注意到你,特别是那些大型的游戏公司,他们也许会给你一份制作游戏的合同,或是购买你做的每一个游戏,甚至会让你开发专用游戏机上的东东!


    9. 假如你的游戏真的没得说,让上面的所说的一切都发生了的话,那么它有可能被改为游戏机里的游戏,这意味着你真的要发财了!当然,还是那句话,你的游戏必须足够的优秀,并且可以被改编成游戏机可以操控的游戏。


    10. 你也可以将你的游戏发布成预览版,想玩完全版的就得掏钱来买。如果玩家真的迷恋上你的游戏demo,他们会舍得花钱的,这样你就能赚好多。道理很简单,卖的越多,收入也就越多。


    其他做Flash游戏赚钱的方式还有待你的发现,但至少目前你已经知道了十种。希望你能从这堆文字中有所收获。





  • Google 你何时能够提供crossdomain?

    2007-11-23


    昨天为了vamos能够支持Picasa图片的导入,研究了一下Picasa的api。发现Google做的东西就是比较规范,不出1个小时,As2的代码就完全写好了。然后在Flash8中测试,OK,一切正常,picasa的图片轻松囊入其中。但没想到的是,FTP到服务器测试时,却跑不动了!凭着以往的经验,第一个闪出的念头是——crossdomain! 用Firebug快速的查了一下,发现果然如此。从google得到的crossdomain竟然是*.google.com。....无语。

    天啊,Google公开了api却不提供crossdomain!

    但依然还是本着“google"的精神开始google。搜寻关键词 picasa + crossdomain,第一条就是
    Crossdomain.xml or other solution

    读毕,发现这个问题至今还没有解决,对于flash/flex应用只能用丑陋而低效的proxy——用自己的服务器做一个中转HTTP请求的代理而已。

    实在搞不懂,相比较Flickr和Yahoo,google为什么这样无视Flash/Flex的开发群体?从帖子列表时间上上看,这个问题至少已经凉在那里半年多了...

    没有办法,只好先放弃了,proxy的解决方法是不可接受的。等待Google picasa的开发人员早点解决Crossdomain的问题。
Open Toolbar