- A_road.rar (4.9 KB)
-
2010-09-06
【原创】Flex中A-star寻路算法
A*寻路算法是最常用的寻路算法了,下面介绍一些概念,及Flex中实现的Demo
节点(node) :
本质上就是方形网格里的某一个方格(yujjj注:为什么不把他们描述为方格?因为在一些时候划分的节点不一定是方形的,矩形、六角形、或其它任意形状,本书中只讨论方格)。由此可以看出,路径将会由起点节点,终点节点,还有从起点到终点经过的节点组成。
代价(cost)
:
这是对节点优劣分级的值。代价小的节点肯定比代价大节点更好。代价由两部分组成:从起点到达当前点的代价和从这个点到终点的估计代价。代价一般由变量f,g和h,具体如下。
f:特定节点的全部代价。由g+h决定。
g:从起点到当前点的代价。它是确定的,因为你肯定知道从起点到这一点的实际路径。
h:从当前点到终点的估计代价。是用估价函数(heuristic function)计算的。它只能一个估算,因为你不知道具体的路线——你将会找出的那一条。
估价函数(heuristic):计算从当前点到终点估计代价的公式。通常有很多这样的公式,但他们的运算结果,速度等都有差异(yujjj注:估价公式计算的估计值越接近实际值,需要计算的节点越少;估价公式越简单,每个节点的计算速度越快)。
待考察表(open list)
:
一组已经估价的节点。表里代价最小的节点将是下一次的计算的起点。
已考察表(closed list):
从待考察表中取代价最小的节点作为起点,对它周围8个方向的节点进行估价,然后把它放入“已考察表”。
父节点(parent node)
:
以一个点计算周围节点时,这个点就是其它节点的父节点。当我们到达终点节点,你可以一个一个找出父节点直到起点节点。因为父节点总是带考察表里的小代价节点,这样可以确保你找出最佳路线。
现在我们来看以下具体的运算方法:
1. 添加起点节点到待考察表
2. 主循环
a. 找到待考察表里的最小代价的节点,设为当前节点。
b. 如果当前点是终点节点,你已经找到路径了。跳到第四步。
c. 考察每一个邻节点(直角坐标网格里,有8个这样的节点 )对于每一个邻节点:
(1).如果是不能通过的节点,或者已经在带考察表或已考察表中,跳过,继续下一节点,否则继续。
(2).计算它的代价
(3).把当前节点定义为这个点的父节点添加到待考察表
(4).添加当前节点到已考察表
3. 更新待考察表,重复第二步。
4. 你已经到达终点,创建路径列表并添加终点节点
5. 添加终点节点的父节点到路径列表
6. 重复添加父节点直到起点节点。路径列表就由一组节点构成了最佳路径
代码比较多就不贴了,可以参考Flash高级动画教程第四章
附件为测试文件,红色为英雄,蓝色为通路,黑色为障碍,绿色为测试过的节点,白色为实际路径
-
本文附件下载:
已有 0 人发表留言,猛击->>这里<<-参与讨论
JavaEye推荐
- box2Dstudy.rar (353.4 KB)
【原创】Box2DFlash学习笔记
最近一直没写东西,今天分享学习Box2D的学习吧。看的是官方上的用户手册
首先几个基本概念
world ,就是整个物理世界了,是下面所有东西的集合。
rigid body, they are hard like diamonds.也简称body,也就是实际的一个物体。
shape , shape have material properties of friction and restitution.很多物理上的性质都在shape中给予定义。
constraint ,物体之间的限制,joint is a kind of constraint.
joint 很重要,有很多种joint.
然后是一些小细节
Box2D中没有像素的概念,由C++那边移植过来的,默认的长度单位是meter,1meter = 30 pixel;
world要尽可能的大,大的比小的好,如果body到达了world的边界,就会被“冻结”并停止模拟。
Box2D是模拟真实的物理世界,如果质量设置为0,body就为static,碰撞就不会动。
Box2D不会保存shape或者body的定义,它把数据复制给b2Body结构。(就像bitmap和bitmapData)
Integrator simulate the physics equations at discrete points of time.越少的迭代,性能越好,准确性越差。
Body的建立主要是采用工厂模式,Factories do not retain references to the definition.
只介绍一些感觉比较重要的,详细的得看官网的用户手册,下面贴一下我在flex下做的Demo
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="demo()"
width="1100"
height="600"
layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Image;
import mx.containers.Box;
import mx.core.UIComponent;
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
private var ui:UIComponent=new UIComponent;
public var the_world:b2World;
private var time_count:Timer=new Timer(500);
public function demo():void
{
//init b2AABB
var environment:b2AABB=new b2AABB();
environment.lowerBound.Set(-100.0, -100.0);
environment.upperBound.Set(100.0, 100.0);
//gravity
var gravity:b2Vec2=new b2Vec2(0.0, 20.0);
//init b2world
the_world=new b2World(environment, gravity, true);
the_world.DrawDebugData();
var debug_draw:b2DebugDraw=new b2DebugDraw();
var debug_sprite:Sprite=new Sprite();
debug_sprite.x=50;
this.addChild(ui);
ui.addChild(debug_sprite);
debug_draw.m_sprite=debug_sprite;
debug_draw.m_drawScale=40;
debug_draw.m_fillAlpha=0.3;
debug_draw.m_lineThickness=1;
debug_draw.m_drawFlags=b2DebugDraw.e_shapeBit;
the_world.SetDebugDraw(debug_draw);
var final_body:b2Body;
var the_body:b2BodyDef; //bodyDefination,定义了位置
the_body=new b2BodyDef();
the_body.position.Set(13, 13); //original Position
var the_box:b2PolygonDef; //shape,定义了形状、摩擦力、密度
the_box=new b2PolygonDef();
the_box.SetAsBox(8.5, 0.5); //half meter
the_box.friction=0.5;
the_box.density=0; //static body ,mass == 0
final_body=the_world.CreateBody(the_body);
final_body.CreateShape(the_box);
final_body.SetMassFromShapes(); //compute mass
addEventListener(Event.ENTER_FRAME, on_enter_frame);
time_count.addEventListener(TimerEvent.TIMER, on_time);
time_count.start();
}
public function on_time(e:Event):void
{
var final_body:b2Body;
var bodyDef:b2BodyDef;
var shape:b2PolygonDef;
bodyDef=new b2BodyDef();
bodyDef.position.Set(Math.random() * 10 + 6, 0);
//矩形
shape=new b2PolygonDef();
shape.SetAsBox(Math.random() + 0.1, Math.random() + 0.1);
shape.friction=0.3;
shape.density=1;
shape.restitution=0.5;
final_body=the_world.CreateBody(bodyDef);
//圆形
var circleShape:b2CircleDef=new b2CircleDef;
circleShape.density=1;
circleShape.friction=0.5;
circleShape.restitution=0.5;
circleShape.radius=Math.random() + 0.1;
//三角
var triangleShape:b2PolygonDef=new b2PolygonDef;
triangleShape.vertexCount=3;
triangleShape.density=1;
triangleShape.friction=0.5;
triangleShape.restitution=0.5;
var aaa:Number=Math.random() + 0.1;
triangleShape.vertices[0].Set(-aaa, 0.0);
triangleShape.vertices[1].Set(aaa, 0.0);
triangleShape.vertices[2].Set(0.0, 2 * aaa);
var tempN:Number = Math.random();
if(tempN <= 0.4)
{
final_body.CreateShape(triangleShape);
}
else if(tempN >= 0.7)
{
final_body.CreateShape(circleShape);
}
else
{
final_body.CreateShape(shape);
}
final_body.SetMassFromShapes();
}
public function on_enter_frame(e:Event):void
{
the_world.Step(1 / 30, 20);
for (var bb:b2Body=the_world.m_bodyList; bb; bb=bb.m_next)
{
//可以遍历world中的body
}
}
]]>
</mx:Script>
</mx:Application>
-
本文附件下载:
已有 0 人发表留言,猛击->>这里<<-参与讨论
JavaEye推荐
盗梦空间
周日去看了早场的《盗梦空间》,中途憋尿,出来了片刻,回去后,发现还在枪战,甚感无聊。总的来说,比较好看,场面宏大壮观,Leonardo的情感戏演绎很精彩,由于事前看到了太多的好评,看完略感失望,觉得并没有传说中的那么好。
Leonardo最近拍的电影,都很不错,比如《禁闭岛》,其中有复杂的心理戏戏分,比《盗梦空间》中的要来得曲折多变,更好看。压抑的时候压抑的透不过气;爆发的时候像火山喷发;也有平静下的汹涌暗潮,相比起来,《盗梦空间》里的心理戏只能说吸引人,我觉得是可以更好的。
我觉得《盗梦空间》最好看的地方,还是在于导演的想象力,天马行空,但看上去又逻辑性极强,也就是所谓的“高智商”。制造梦境,而在梦境中虚拟出显示,还有人本能的守护行为,应该是电影中最有意思的地方。高智商,加上逼真的视觉效果,确实看的过瘾。
另我感到最不爽的是冗长的动作戏,感觉像是为了拖延时间,凑戏分。影片后期,无休止的枪战和飙车戏,单调,简单,和整个戏分有点不搭调的感觉,一段复杂的枪战场面,看的人都快睡着了,很失败。还不如请个国内的动作指导,比如某某大哥,摆弄几个很酷的造型,那样更有观赏性,还能兼管中国市场,何乐而不为。
-
2010-09-05
前端基础:返回码
被人challenge了很多次了,记在BLOG里,有空背一背:
总共是2,3,4,5共6+7+17+5共35个。
Successful
=================================
200 OK
指示客服端的请求已经成功收到,解析,接受。
201 Created
请求已经完成并一个新的返回资源被创建。被创建的资源可能是一个URI资源,通常URI资源在Location头指定。回送应该包含一个实体数据
并且包含资源特性以及location通过用户或者用户代理来选择合适的方法。实体数据格式通过煤体类型来指定即content-type头。最开始服务器
必须创建指定的资源在返回201状态码之前。如果行为没有被立刻执行,服务器应该返回202。
202 Accepted
请求已经被接受用来处理。但是处理并没有完成。请求可能或者根本没有遵照执行,因为处理实际执行过程中可能被拒绝。
203 Non-Authoritative Information
204 No Content
服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。回送可能包含新的或更新信息由entity-headers呈现。
205 Reset Content
服务器已经接受请求并且用户代理应该重新设置文档视图。
206 Partial Content
服务器已经接受请求GET请求资源的部分。请求必须包含一个Range头信息以指示获取范围可能必须包含If-Range头信息以成立请求条件。
Redirection
==================================
300 Multiple Choices
请求资源符合任何一个呈现方式。
301 Moved Permanently
请求的资源已经被赋予一个新的URI。
302 Found
通过不同的URI请求资源的临时文件。
303 See Other
304 Not Modified
如果客服端已经完成一个有条件的请求并且请求是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304
状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束。
305 Use Proxy
请求的资源必须通过代理(由Location字段指定)来访问。Location资源给出了代理的URI。
306 Unused
307 Temporary Redirect
Client Error
=====================
400 Bad Request
因为错误的语法导致服务器无法理解请求信息。
401 Unauthorized
如果请求需要用户验证。回送应该包含一个WWW-Authenticate头字段用来指明请求资源的权限。
402 Payment Required
保留状态码
403 Forbidden
服务器接受请求,但是被拒绝处理。
404 Not Found
服务器未找到任何匹配Request-URI的资源。
405 Menthod Not Allowed
Request-Line请求的方法不被允许通过指定的URI。
406 Not Acceptable
407 Proxy Authentication Required
408 Reqeust Timeout
客服端没有提交任何请求在服务器等待处理时间内。
409 Conflict
410 Gone
411 Length Required
服务器拒绝接受请求在没有定义Content-Length字段的情况下。
412 Precondition Failed
413 Request Entity Too Large
服务器拒绝处理请求因为请求数据超过服务器能够处理的范围。服务器可能关闭当前连接来阻止客服端继续请求。
414 Request-URI Too Long
服务器拒绝服务当前请求因为URI的长度超过了服务器的解析范围。
415 Unsupported Media Type
服务器拒绝服务当前请求因为请求数据格式并不被请求的资源支持。
416 Request Range Not Satisfialbe
417 Expectation Failed
Server Error
===================================
500 Internal Server Error
服务器遭遇异常阻止了当前请求的执行
501 Not Implemented
服务器没有相应的执行动作来完成当前请求。
502 Bad Gateway
503 Service Unavailable
因为临时文件超载导致服务器不能处理当前请求。
504 Gateway Timeout
505 Http Version Not Supported
阅读全文类别:一起来学javascript 查看评论
Flex常用排序算法总结
排序算法有很多,在Flex里面Array类有sort方法,mx.collection包里面也有Sort类,具体用法查下API就好了。万变不离其宗,就总结5个相对基础的排序算法,主要是思想和过程。
一、插入排序(Insertion Sort)
1. 基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
2. 排序过程:
【示例】:
[初始关键字] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
二、选择排序
1. 基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
2. 排序过程:
【示例】:
初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [49 97 65 76]
第五趟排序后 13 27 38 49 49 [97 97 76]
第六趟排序后 13 27 38 49 49 76 [76 97]
第七趟排序后 13 27 38 49 49 76 76 [ 97]
最后排序结果 13 27 38 49 49 76 76 97
三、冒泡排序(BubbleSort)
1. 基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
2. 排序过程:
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
【示例】:(竖着看)
49 13 13 13 13 13 13 13
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
四、快速排序(Quick Sort)
1. 基本思想:
在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
2. 排序过程:
【示例】:
初始关键字 [49 38 65 97 76 13 27 49]
第一次交换后
[27 38 65 97 76 13 49 49]
第二次交换后
[27 38 49 97 76 13 65 49]
J向左扫描,位置不变,第三次交换后
[27 38 13 97 76 49 65 49]
I向右扫描,位置不变,第四次交换后
[27 38 13 49 76 97 65 49]
J向左扫描
[27 38 13 49 76 97 65 49]
(一次划分过程)
初始关键字
[49 38 65 97 76 13 27 49]
一趟排序之后
[27 38 13] 49 [76 97 65 49]
二趟排序之后
[13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序结果 13 27 38 49 49 65 76 97
五、堆排序(Heap Sort)
1. 基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
2. 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])
堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
3. 排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
已有 0 人发表留言,猛击->>这里<<-参与讨论
JavaEye推荐
- 优化Flash平台的性能(Adobe提供) (2010-8-24 17:56:22)
- AS3版Flash Remoting客户端类-Service类 (2010-8-3 14:41:53)
- 有关在Remoting通信中对于返回值是list就会报错的解决方法 (2010-7-16 18:0:28)
- [转发]3月28日•上海浦东•中国Flash开发者交流会 (2010-3-12 14:56:5)
- 我的近况 (2010-3-11 17:29:32)
开始找工作了-有招人的朋友,帮忙推荐推荐
-
在久游已经做了四年多了,感觉现在我的职业发展出现瓶颈,故现在准备换工作了!先说说自己的具备专业技能吧 有八年多的Flash程序开发经验,精通AS2.0和AS3.0编程; 在基于Flash平台技术实现流媒体,视频服务以及RIA等方面开发有着非常丰富经验; 精通Flash与后台技术之间多种数据通讯技术(如Flash Remoting,Socket等); 做过部门主管和技术经理,
Copyright © 2008
继续阅读《开始找工作了-有招人的朋友,帮忙推荐推荐》的全文内容...
分类: 相关资讯 | Tags: 工作 flash 职业 | 添加评论(0)
相关文章:
-
2010-09-03
周期定时器:一个Flash Player10.1中不得不关注的特性
作者: Seven_Yuan 发表于 2010-09-03 17:32 原文链接 阅读: 135 评论: 0
转自:http://www.riaidea.com/blog/archives/273.html
在Flash Player 10.1中,Adobe引入了一个全新的Periodic timer定时器概念,它可以改善浏览器中swf内容的CPU使用。在浏览器中的swf文件在不可见状态下(如窗口最小化,隐藏标签tab或页面滚动到swf文件以外的区域)会自动调节以降低资源消耗。(注:之前的Flash Player版本虽然不会渲染图形,但仍然在全速运行AS脚本,音视频编码解码等。)具体改变如下:
可见状态下:
1)SWF的帧频frameRate会被限制和校准为Jiffy时间模式(如最高60fps),但是目前的10.1 beta3仍然保留最高120fps的限制,这在正式版中将会被改变。
2)计时器(AS2中的Interval和AS3中的Timer)也会校准为Jiffy。
3)LocalConnection也同样会被校准。因此消息从一个swf文件到另一个swf文件至少需要33ms(也有说是40ms)。
4)Video不会做改变,他们可以在任何帧频下播放而不受影响。
不可见状态下:
1)SWF的帧频被锁定为2fps,不进行任何渲染。
2)计时器(AS2中的Interval和AS3中的Timer)被锁定为最多2次/秒。
3)LocalConnection也被锁定为最多2次/秒。
4)Video视频解码(不渲染和显示)只占用CPU空闲时间。
5)为了兼容音频,当swf中有音频在播放的时候,swf的帧频会被调整为8fps,同样swf中计时器和LocalConnection也做相应调整。
应该说这个特性非常有利于网络上flash应用的普及,但是也存在着潜在的风险。比如某些情况下,我们的应用程序需要在不可见的时候仍然保持着正常的运转,比如计时器的正确运行,某些事件按时发生,某些下载任务及时进行等等。当swf的帧速下降到2fps的时候,其影响是显而易见的。因此我们需要在swf不可见的时候仍然保持较高或者正常的帧速。目前有两种解决方法:
利用播放一个音频来使swf在不可见状态下维持8fps:
var gs:Sound = new GhostSound();
gs.play(0, int.MAX_VALUE, new SoundTransform(0));
用js的setInterval方法去调用swf的ExternalInterface.addCallback的方法,从而间接实现一些在不可见状态下必须全速运行的一些动作:
setInterval(callSWF, 50);
function callSWF()
{
var swf=document.getElementById("swfID");
if(swf)swf.execSomeMethod();
}
最新新闻:
· 耐克Nike+ GPS应用 无配件即可记录运动(2010-09-07 22:49)
· Google真相:决策贡献及其艰苦抉择(2010-09-07 22:46)
· 谷歌CEO宣布今秋将在美国推出电视服务(2010-09-07 22:13)
· 环球企业家:亚马逊出手(2010-09-07 21:39)
· Google 代码搜索升级,新增 Chromium 订制版(2010-09-07 21:31)
编辑推荐:博客园电子期刊2010年8月刊发布
- Load an external image
- Create a new instance of BitmapData (bitmap_data) and assign it to bitmapData property of the external bitmap
- Create a new instance of BitmapData (bitmap_data_copy) with same size of external bitmap
- Copy the pixels of external bitmap in the new instance bitmap_data_copy
- Use the dispose method on bitmap_data to free memory
- Create a mask form using a Shape
- Create a new instance of BitmapData (bitmap_data_shape) the same size of external image and use draw method over shape
- bitmap_data_copy uses the method copyChannel on bitmap_data_shape
- Give bitmap_data_copy to property bitmapData of external image
Alpha mask using Actionscript 3.0
作者: Seven_Yuan 发表于 2010-09-03 17:15 原文链接 阅读: 131 评论: 0
Have you ever tried to create an alpha mask using Actionscript 3.0?
The thing is reachable with the method copyChannel of the BitmapData class.
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.geom.*;
import flash.filters.*;
public class Main extends MovieClip
{
private var loaded_bitmap:Bitmap;
private var bitmap_data:BitmapData;
private var bitmap_data_copy:BitmapData;
private var bitmap_data_shape:BitmapData;
private var shape:Shape;
public function Main()
{
addEventListener(Event.ADDED_TO_STAGE,init);
addEventListener(Event.REMOVED_FROM_STAGE,destroy);
}
private function init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
loadImage();
}
private function loadImage():void
{
var request:URLRequest=new URLRequest("tiger.jpg");
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImageLoaded);
loader.load(request);
}
private function onImageLoaded(evt:Event):void
{
evt.target.removeEventListener(Event.COMPLETE,onImageLoaded);
loaded_bitmap=evt.target.loader.content as Bitmap;
createAlphaMask();
}
private function createAlphaMask():void
{
bitmap_data=loaded_bitmap.bitmapData;
var w:Number=bitmap_data.width;
var h:Number=bitmap_data.height;
bitmap_data_copy=new BitmapData(w,h,true,0x00FFFFFF);
bitmap_data_copy.copyPixels(bitmap_data,bitmap_data.rect,new Point());
bitmap_data.dispose();
shape=createMask(w,h);
bitmap_data_shape=new BitmapData(w,h,true,0x00FFFFFF);
bitmap_data_shape.draw(shape);
bitmap_data_copy.copyChannel(bitmap_data_shape,bitmap_data_shape.rect,new Point(),BitmapDataChannel.ALPHA,BitmapDataChannel.ALPHA);
loaded_bitmap.bitmapData=bitmap_data_copy;
addChild(loaded_bitmap);
}
private function createMask(w:Number,h:Number):Shape
{
var new_shape:Shape=new Shape();
new_shape.graphics.beginFill(0xFFFFFF);
new_shape.graphics.drawEllipse(50,50,w-100,h-100);
new_shape.graphics.endFill();
var blur_filter:BlurFilter=new BlurFilter(50,50,BitmapFilterQuality.HIGH);
new_shape.filters=[blur_filter];
addChild(new_shape);
return new_shape;
}
private function destroy(evt:Event):void
{
removeEventListener(Event.REMOVED_FROM_STAGE,destroy);
bitmap_data_copy.dispose();
bitmap_data_shape.dispose();
removeChild(loaded_bitmap);
removeChild(shape);
loaded_bitmap=null;
shape=null;
}
}
}
最新新闻:
· 耐克Nike+ GPS应用 无配件即可记录运动(2010-09-07 22:49)
· Google真相:决策贡献及其艰苦抉择(2010-09-07 22:46)
· 谷歌CEO宣布今秋将在美国推出电视服务(2010-09-07 22:13)
· 环球企业家:亚马逊出手(2010-09-07 21:39)
· Google 代码搜索升级,新增 Chromium 订制版(2010-09-07 21:31)
编辑推荐:博客园电子期刊2010年8月刊发布
- If the first byte of the file is OxFE OxFF and the second is, the encoding is interpreted as UTF-16 BE (Big Endian). This encoding is used for systems
Macintosh. - If the first byte of the file is OxFF OxFE and the second is, the encoding is interpreted as UTF-16 LE (Little Endian). This encoding is used for systems
Windows.
Unicode and Flash Player
作者: Seven_Yuan 发表于 2010-09-03 17:15 原文链接 阅读: 125 评论: 0
Flash Player 6 (and later) supports Unicode text encoding. Any user who installed Flash Player 6 or later can display text in multiple languages, regardless of the language used by the operating system running Flash Player, provided the computer
are installed the correct characters.
Flash Player assumes that all external text files associated with an application in Flash Player are encoded with Unicode, unless it is otherwise noted.
For applications in Flash Macromedia Flash Player 5 or earlier, that were created in Flash MX or earlier, Flash Player 6 (and earlier) displays the text using the traditional code of the operating system running the player.
For more information about Unicode, visit www.unicode.org.
Text encoding in Flash Player
By default, Flash Player 7 requires that all text is encoded with Unicode.
If the charging document text file or external XML files, the text of these files should be encoded in UTF-8.
Create these files using the Strings panel or a text editor or HTML, which can save files in Unicode.
Unicode encoding formats supported by Flash Player
When reading text data in Flash, Flash Player looks at the first two bytes in the file to detect a BOM (Byte Order Mark, mark byte order), a standard formatting convention used to identify the format of Unicode.
If no BOM is detected, the text encoding is interpreted as UTF-8 (an 8-bit encoding format). It is advisable to use UTF-8 in their applications.
If Flash Player detects any of the following BOM, the encoding format of the text is interpreted as follows:
Most text editors can save files in UTF-16 BE or LE automatically add the BOMs to the files.
Note: if you set the property system.useCodepagesu true, the text is interpreted using the traditional code of the operating system on which Flash Player is running, is not interpreted as Unicode.
Encoding in external XML files
You can not change the encoding of an XML file by changing the encoding tag.
The Flash Player identifies the encoding of an external XML file using the same rules used for all external files.
If not detected any BOM at the beginning of the file, it is assumed that the file is encoded in UTF-8.
If a BOM is found, the file is interpreted as encoded in UTF-16 BE or LE.
最新新闻:
· 耐克Nike+ GPS应用 无配件即可记录运动(2010-09-07 22:49)
· Google真相:决策贡献及其艰苦抉择(2010-09-07 22:46)
· 谷歌CEO宣布今秋将在美国推出电视服务(2010-09-07 22:13)
· 环球企业家:亚马逊出手(2010-09-07 21:39)
· Google 代码搜索升级,新增 Chromium 订制版(2010-09-07 21:31)
编辑推荐:博客园电子期刊2010年8月刊发布
Stop all sounds with Actionscript 3.0
作者: Seven_Yuan 发表于 2010-09-03 17:14 原文链接 阅读: 127 评论: 0
import flash.media.SoundMixer; SoundMixer.stopAll();
最新新闻:
· 耐克Nike+ GPS应用 无配件即可记录运动(2010-09-07 22:49)
· Google真相:决策贡献及其艰苦抉择(2010-09-07 22:46)
· 谷歌CEO宣布今秋将在美国推出电视服务(2010-09-07 22:13)
· 环球企业家:亚马逊出手(2010-09-07 21:39)
· Google 代码搜索升级,新增 Chromium 订制版(2010-09-07 21:31)
编辑推荐:博客园电子期刊2010年8月刊发布
- 第一站:上海,2010年9月28日
- 第二站:成都,2010年10月20日
- 一个完善的系统 — 借助专业的工具、开放源代码框架、无处不在的客户端和可伸缩的服务器, 将应用程序和内容从原型转为制作、将视频从规划转为回放。
- 表现力、一致性和范围 — 交付具有表现力的内容和应用程序, 它们可以跨最广的浏览器、操作系统和设备实现一致运行。
- 灵活的设计与开发 — 借助集成工具和灵活的工作流程缩短上市时间, 这些工具和流程支持独立但同步的前端设计和后端开发, 并且多个叠代快速循环。
- 轻松集成 — 与领先工具及浏览器的兼容性、开放标准支持以及与知名行业合作伙伴的合作开发意味着 Flash 平台可以与您的现有基础结构轻松集成。
奥多比开发者技术日,9月28日上海,10月20日成都
尊敬的开发伙伴:
我们诚挚地邀请您参加即将于2010年9月和10月举行的奥多比开发者技术日 !此技术大会将在以下两个城市举行:

奥多比开发者技术日 是由奥多比公司举办的面向 Flash 平台应用及Web应用开发者的技术研讨培训活动。旨在为开发者介绍和讲解有关 Adobe Flash 平台技术及其应用开发的相关知识和开发技巧,以及 Adobe Flash 平台技术的发展趋势等。同时也为开发者搭建一个互相学习和交流的平台,在此与奥多比公司的技术专家和资深的开发者们分享各自的开发经验和创新设计理念,共同推动 RIA 技术的发展。
光临此次开发者技术日,您将在第一时间聆听最新发布的 Adobe Flash Builder 4 和 Adobe Flash Catalyst 的新功能和新特性,欣赏炫酷的应用演示,还有机会免费获得大会礼品和Adobe开发工具软件的产品序列号一个。还等什么?赶快注册吧!
立即注册参会!
* 座位有限,先来先得!
关于Adobe Flash 平台
出众的创新, 合适的技术 — Adobe Flash 平台是一套全方位的技术, 外围是一个由支持程序、业务合作伙伴和热情的用户社区构成的可靠的生态系统。它们共同为您提供了为最广的观众群创建和交付最引人注目的应用程序、内容和视频所需的一切。
New ways to embed swf (falsh) into html website
-
Preparing your website to handle the Microsoft changes to Internet Explorer Note: On November 8, 2007, Microsoft announced that, as a result of recent technology licenses acquisitions, the “click to activate” restrictions are no longer mandat...
- Adobe 平台技术主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。
- 程序接口的另类理解与使用主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com
- Flash Media Server 开发经验谈主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
- Flash RIA的可用性主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me
- 麻球大赛优秀作品介绍主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com
- 麻球参赛游戏蛛蛛冒险的开发与设计经验分享主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。
- 麻球参赛游戏DNF,梦幻塔防,吖凡哒哒技术与美工经验分享主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
商文烨的博客: http://t.qq.com/shangwenye
- 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
-
2010-09-02
第5届 FLASH开发者交流会 暨FLASH CAMP 2010

活动在线报名地址:http://www.wedoswf.com/events/1
主讲者和专题介绍
议程安排
2010年9月18日 星期六
抽奖活动
为感谢大家对活动的关注与支持,本次活动特设精美礼品抽奖赠送。

会议地点
畅星大厦•上海
地址:上海浦东新区碧波路888号畅星大厦3楼会议厅
电话:021-38984558
交通:地铁2号线张江站(步行5-10分钟即到),161



历届活动回顾
FlashInspector 0.1.6更新
增加了错误列表面板,用于记录swf运行后错误历史。
- Adobe 平台技术
主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。 - 程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com - Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin - Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me - 麻球大赛优秀作品介绍
主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com - 麻球参赛游戏蛛蛛冒险的开发与设计经验分享
主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。 - 麻球参赛游戏DNF,梦幻塔防,吖凡哒哒技术与美工经验分享
主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
商文烨的博客: http://t.qq.com/shangwenye - 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
- flash 直播的相关问题北京奥运会期间用Flash做电视直播 http://pqoct.com/2008/08/13/1485.html 自从上次写了一个关于flash + flash...
- 帮助文档adobe cs5 系统开发软件帮助文档【文中】【英文】 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html 帮助文档...
9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010
活动在线报名地址:http://www.wedoswf.com/events/1
主讲者和专题介绍
议程安排
2010年9月18日 星期六
抽奖活动
为感谢大家对活动的关注与支持,本次活动特设精美礼品抽奖赠送。

会议地点
畅星大厦•上海
地址:上海浦东新区碧波路888号畅星大厦3楼会议厅
电话:021-38984558
网站:http://www.changxing.sh.cn
交通:地铁2号线张江站(步行5-10分钟即到),161

相关文章:
- Adobe 平台技术
主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。 - 程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com - Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin - Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me - 麻球大赛优秀作品介绍
主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com - 麻球参赛游戏蛛蛛冒险的开发与设计经验分享
主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。 - 麻球参赛游戏DNF,梦幻塔防,吖凡哒哒技术与美工经验分享
主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
商文烨的博客: http://t.qq.com/shangwenye - 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
活动宣传 9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010

活动在线报名地址:http://www.wedoswf.com/events/1
主讲者和专题介绍
议程安排
2010年9月18日 星期六
抽奖活动
为感谢大家对活动的关注与支持,本次活动特设精美礼品抽奖赠送。

会议地点
畅星大厦•上海
地址:上海浦东新区碧波路888号畅星大厦3楼会议厅
电话:021-38984558
网站:http://www.changxing.sh.cn
交通:地铁2号线张江站(步行5-10分钟即到),161



历届活动回顾
-
2010-09-01
9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010
9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010
报名参加
活动在线报名地址:http://www.wedoswf.com/events/1
主讲者和专题介绍
Adobe 平台...
收藏到:Del.icio.us
Flash开发者交流会
-
Flash开发者交流会:
详细信息请进入:http://www.wedoswf.com/events/1
µÚ5½ì FLASH¿ª·¢Õß½»Á÷»á ôßFLASH CAMP 2010
http://www.wedoswf.com/events/1
¿´µ½ÁÎÏæÄþµÄÃû×Ö£¬µÚ2´ÎµÄʱºò¼ÇµÃËû»¹ÔÚÍÁ¶¹£¬Ã»Ïëµ½Õâ´Î¾Íµ½ÁËÊ¢´ó¡£¡£¡£µ½ÂéÇòÈ¥ÁË¡£¡£¡£
Õâ¸öȦ×Ó̫СÁË£¬×ßÀ´×ßÈ¥¶¼ÈƲ»³öÈ¥
ºÃ¾ÃûÀ´ÁË£¬Ë³±ã¸øÎ¬¶È×ö¸öÍÆ¹ã
- Adobe 平台技术
主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。 - 程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com - Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin - Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me - 麻球大赛优秀作品介绍
主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com - 麻球参赛游戏蛛蛛冒险的开发与设计经验分享
主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。 - 麻球参赛游戏DNF,梦幻塔防,吖凡哒哒技术与美工经验分享
主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
商文烨的博客: http://t.qq.com/shangwenye - 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
9月18日 第5届 FLASH开发者交流会
活动在线报名地址:http://www.wedoswf.com/events/1
主讲者和专题介绍
议程安排
2010年9月18日 星期六
-
2010-08-31
FlashInspector 0.1.5更新
如果你正在使用FlashInspector,建议更新到该版本。特别是Firefox 3.6.6后的版本。
主要更新:
添加了“全局处理错误“,Flash Player的报错会在Flash里面弹出”错误信息面板“。注意这个功能是针对Flash Player 10.1的,默认是开启的。
错误信息面板除了显示错误的信息,还显示了错误发生的时间,包括UTC时间、从swf运行时长(getTimer())。
”错误信息面板“会在下一个版本加强。可以记录错误的历史。

FlashInspector 0.1.5在Firefox另外一个比较重要的更新是JS部分的,增加了DOMContentLoaded和MozAfterPaint事件的处理。
20个最酷的Adobe AIR应用程序
Adobe AIR允许开发人员充分利用不用的技术手段来进一步开发他们的应用程序。 这些应用程序运行在Web浏览器之外,并且可以跨多个平台运行。 Adobe AIR是免费的,众多公司在使用它,例如:Nickelodeon,eBay和国家地理。
1. Shrink O’Matic
![]()
这是一个免费的AIR应用程序,它允许用户批量压缩图片,而不是逐个压缩。 拖放PNG图片,JPEG图片或者GIF图片并且可以选择你所希望的压缩方式。
2. Font Picker
![]()
这个免费工具会抓取你所有的字体文件,你只要输入一个短语样本它就可以帮助你选择所需的字体。
3. Klok
![]()
追踪记录个人时间,看看你是如何分配的。
4. Websnapshot
![]()
把一个URL地址拖拽或输入到这个应用程序中就可以得到相应网站的快照。
5. Webkut
![]()
除了还具有为了快照而剪切部分网页的能力,这个应用程序的功能与Websnapshot类似。
6. Icon Generator
![]()
这个应用程序允许用户生成一个Web 2.0或CS3样式图标。 对你而言,产生不同尺寸的图标仅需要3步。
7. Flickr Flipper
![]()
这个应用程序允许用户通过密码或用户名查找Flickr照片。 可以使用Papervision来显示照片和将照片保存在你的本机上,但是它最多只提供100个搜索结果。
8. COLOURlovers Desktop Color Finder
![]()
在近万种不同颜色中搜索你所需要的颜色。
9. Colorbrowser
![]()
使用本应用程序可以组建你最喜爱的调色板。 它提供了一个色板作为初始样板。
10. Kuler
![]()
将颜色主题导入到各Adobe应用程序中使用。
11. RegExr Desktop
![]()
这个应用程序具有测试特殊字符表达式的功能。
12. Snippely
![]()
使用此工具来存储“片断代码”,快速备忘录和笔记,而不是让记事本的多个实例滥用你的硬盘驱动器。 它甚至可以有组织的实现备忘录快速检索。
13. SearchCoders
![]()
这个应用程序因具有帮助开发人员搜索他们所需代码的功能而获奖。 你甚至可以标记和及时追踪各种博文的更新。 更棒的是,它是免费的。
14. MiniTask
![]()
这个免费的应用程序帮你有效的管理时间,它支持你通过拖拽的方式来安排你的日常活动。
15. FEAT
![]()
自由工作者估计协助工具帮助自由工作者统计他们当天工作了多少个小时。
16. JustResizeIt
![]()
这个应用程序使用简单,可以根据选项在你的窗体中重新设置图片大小。 这就方便了网络上传。
17. Xe-IMG Image Editor
![]()
不需要与笨拙的Adobe应用程序打交道,可以直接导入并编辑你的所有图片。
18. ImageSizer
![]()
这个帮助用户重新设置图片的应用程序已经发布了一段时间。 但是在最新发布的版本中,他们已经让这个过程变得更加简单,更清楚的说明信息直接在此应用程序中显示。
19. Contrast-A
![]()
该软件可以使用3维RGB色彩空间,用它来试验色彩组合, 还允许你校验对比度,校验结果可以测试色弱。
20. Fireworks AutoBackup Utility
![]()
在你使用Fireworks时自动帮你备份修改过的PNG文件。 Adobe AIR 绝对是一种独特的开发工具,开发者使用它创造了这么多种让他人的生活更便利的应用程序。
[转]9月18日 第5届 FLASH开发者交流会
-
活动在线报名地址:http://www.wedoswf.com/events/1主讲者和专题介绍 Adobe 平台技术 主讲人:Gary Zhu - Adobe 平台技术总监 Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flas
Copyright © 2008
Android上的实验:AIR与本地程序通信
事实上,标题有点不准确。
几天前,AIR2.5发布了新的版本,Adobe称性能有了很大提高。提高了多少? 哪里提高了? 这个需要去实验才知道。
三个月前,在prerelease的论坛上,有位仁兄做了个实现,https://prerelease.adobe.com/project/forum/thread.html?cap=E30C51D41E3B4960BC4F1EBD76BEE24D&forid={DE38C2EF-3575-45B9-9320-F3D03884447D}&topid={C7E7AC43-D63B-4A68-8112-FCEB5F51CA48},很有趣,创意非凡的Idea,连Adobe也没有想到。
昨天终于有时间试了一把,在最新的版本上,运行良好,效果非常好。将本地程序和AIR程序打包在一起,然后两者使用Socket通信,这样,很多AIR无法实现的功能都可以通过这种方式实现。
-
2010-08-29
Firefox Flash Player插件经常崩溃?
如果Firefox安装的是debug Flash Player,那么最近(从Firefox 3.6.6开始)可能会发现,一旦Flash Player一旦弹出错误警告Firefox就开始没响应过一段时间Firefox网页内开始显示Flash Player已经崩溃。这个可能是Firefox处理插件方式导致的(当然,有时它是真的崩溃了)。
Debug Flash Player虽然可能只是弹出一个错误的警告,但是Firefox却认为Flash Player插件出问题了,然后完全禁用Flash Player插件。
解决方法是:在Firefox的about:config里把dom.ipc.plugins.enabled.npswf32.dll设置为true。
flash开发中提高性能方法的整理
参考:Kenshin’s Flex Blog 8only.cn
如何在flash开发中提高性能,总是一个讨论很热烈的问题。记得每次参加flash技术交流会,性能相关的提问是相当多的。
天地会翻译了一个显示列表与性能相关的帖子,我就想起来理事一下在flash中提高性能的方法。
adobe技术中心:
http://help.adobe.com/zh_CN/as3/mobile/index.html
kenshin对群聊天的整理:
垃圾回收的一些知识总结:
1、被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉。
2、父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除。
3、如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null。
4、本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉。
5、除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失。
6、父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除。
7、如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除。
8、注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
9、父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
10、当触发了某个event后,不再使用的话,请将其remove掉。
11、能不使用Effect就不要使用Effect。
内存泄露举例:
1、引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null。
2、系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
3、效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
4、SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null。
5、图片泄露:当Image对象使用完毕后要把source置null。
6、声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null。
内存泄露解决方法:
1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类的清除方法) 先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净。
2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。
众所周知,由于Flash Player的垃圾回收机制是自动进行的,因此就算是上述内容的内容都符合要求,那么还是会产生内存“高居不下”的情况。
因此,我接下来介绍一个非常规的方式,让Flash Player的垃圾回收机制在我的控制之中。(以下的内容也不是我首创的,但是特此总结说明一下)
下面是8only.cn上的方法与经验总结
一优化计算方法
1.用乘法来代替除法(当除数可转化为有限数的时候)。比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差别并不是很大。只有在需要大量计算情况下,比如3D引擎中差别才比较明显。
2.用位运算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几乎比乘除快一倍,但是一般情况下,我们不能选择位运算,比如我们就不能用13>>1来代替13/2,尽管前者比后者运算速度更快,但2者的运算结果却不一样。所以还是要看具体情况。
3.用unit()或int()代替取整运算Math.floor()和Math.ceil()。比如var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。如果是Math.floor(),还可以用位运算(>>0)来代替。比如var test:uint =1.5>>0,比unit()或int()更快。
4.用乘-1来代替Math.abs()方法。比如var nn:Number = -23;var test:Number= nn < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。
当然还有更多的优化计算的方法。一般来说,低级运算要比高级运算速度;内部方法比调用其他方法速度快。另外要注意的是,这些方法有的时候可能并一定适用.
二 Actionscript 优化指南
何时进行优化
对现有程序进行优化的过程,有时十分的冗长与困难,这与原始代码的非优化程度有关,所以在投入大量时间进行代码优化之前,最重要的是要估计出要在什么地方对代码做出修改或替换。
一个游戏代码的最重要的部分就是主循环体,通常情况下该循环体要在flash的每一帧上执行,并控制游戏中的角色属性和重要的数据参数。而对于主循环体以外的部分,也可能是次要循环部分,同样要注意是给其否分配了过多的资源,而没有分配给那些更需要资源的核心部分。
通过积累在各处节约出来的时间(可能每处仅仅是几个毫秒),您会明显发现自己的swf运行得更加稳定,并且游戏感也大大加强。
简洁与高效的代码
书写出十分简洁、可以再次调用的代码(有时可能是面向对象的)是一项精细的工作,但这需要多年的编程经验。对于OOP(object oriented programming,面向对象的程序设计),有些场合根本利用不到它的优势,这使得它显得十分奢侈。在有限的资源条件下(可能是flash播放器的原因),通过更先进的方法,像刚刚提到的OOP,就可能反而导致令人不满意的结果。
我们并不是说OOP对游戏编程不好,只是在某些场合它显得过于奢侈和多余。毕竟有时候“传统的方法”却能得到更好的结果。
大体而言,用OOP是比较好的,因为它让代码维护更加简单。但在后文中,你会看到有时为了充分发挥flashplayer性能,而不采用OOP技术。例如:处理快速滚动或者计算十分复杂的数学问题。
基本的优化
一提及代码优化,我们马上会联想到执行速度的改进,而很少去考虑系统资源的分配。这是因为当今,即使是将被淘汰的计算机,都有足够的内存来运行我们大部分的flash游戏(128M的内存足以满足大多数情况的需要,况且,512M的内存是当今新电脑的基本配置)
变量
在各种重要的代码优化手段中,有这么一条:在定义局部变量的时候,一定要用关键字var来定义,因为在Flash播放器中,局部变量的运行速度更快,而且在他们的作用域外是不耗占系统资源的。
aw附:var变量仅仅在花括号对中才有“生命”,个人认为没有系统学过编程的人容易出错的一个地方:
awMC.onLoad = function(){
var aw = 1;
}
awMC.onEnterFrame = function(){
//不存在aw这个变量
}
一段非优化代码:
function doSomething()
{
mx = 100
my = 100
ar = new Array()
for (y=0; y < my; y++)
{
for (x=0; x < mx; x++)
{
i = (y * mx) + x
arr[i] = i
}
}
return arr
}
这段代码中,并未声明函数体内的那些变量(那些仅仅在函数内使用的变量)为局部变量,这使得这些变量被播放器调用的速度更慢,并且在函数执行完毕的时候仍然耗占系统资源。
下面列出的是经过改进的同样功能的代码:
function doSomething()
{
var mx = 100
var my = 100
var ar = new Array()
for (var y=0; y < my; y++)
{
for (var x=0; x < mx; x++)
{
var i = (y * mx) + x
arr[i] = i
}
}
return arr
}
这样一来所有的变量均被定义为了局部变量,他们能够更快地被播放器调用。这一点在函数大量(10,000次)循环运行时显得尤为重要!当一个函数调用结束的时候,相应的局部变量都会被销毁,并且释放出他们占有的系统资源。
onEnterFrame 事件
onEnterFrame事件对于游戏开发者而言是非常有用的,它使得我们能够快速、反复地按照预设帧频(fps)运行一段程序。回想在Flash5的时代,这(onEnterFrame实时监控)是一种非常流行的技术,用这样的事件来控制机器游戏对手的逻辑,又或者我们可以在每一个子弹上设置这样的事件来监测子弹的碰撞。
实际上,我们并不推荐给过多的MoveClip添加这样的事件,因为这样做会导致“无头绪码(spaghetti code)”的出现,并且容易导致程序效率明显降低。
大多数情况下,用单独一个onEnterFrame事件就可以解决问题了:用这一个主循环来执行你所需要的操作。
另一个简单的办法是设置一个合适的帧频:要知道帧频越高,CPU资源就越紧张。
在帧频为25-35(fps)之间时,onEnterFrame足以很好地执行较复杂代码,哪怕你的计算机配置较低。因此,在没有特殊要求的场合,我们不推荐使用高于60(fps)的帧频。
矢量图与位图
在处理图形前,我们一定要做出正确的选择。Flash能对矢量图和位图进行完美的兼容,然而矢量图和位图在播放器中的表现实质却完全不同。
在用到矢量图的时候,我们要尽可能简化它们的形状,去除多余的端点。这样做将大大降低播放器用于呈现矢量图所要进行的计算量。另一个重要方面在于线条的运用,尽量减少和避免冗陈的线条结构,因为它们会直接影响到flash的播放效率。
当某个实例透明度小于100时,也会对播放速率造成影响,所以如果你发现自己的Flash播放速率过慢,就去挑出这些透明的实例来吧!
那么,如果真的需要呈现比较复杂的场景时,你就最好考虑使用位图实现。虽然Flash在对位图的渲染效率上并不是最优越的(比如和Flash的“兄长”Director比起来),但丰富的视觉内容呈现只能靠位图(与位图同复杂度的矢量图形渲染速率非常低)了,这也是很多基于区块的游戏中广泛采用像素图作为背景的原因。顺便要提到的是,Flash虽然对GIF,JPG和PNG都有所支持,但是渲染速度上PNG还是占有绝对优势,所以我们建议flash中的位图都尽可能采用PNG格式。
影片剪辑(MovieClip)的可视性[下面将MovieClip简称为mc]
您可能会经常碰到这样一种情况:有大量不可见/屏幕外的mc等待出场(比如游戏中屏幕外的地图、人物等等)。
要知道,播放器仍然要消耗一定的资源来处理这些不可见/屏幕外的mc,哪怕他们是单帧,非播放的状态。
最好的解决办法之一是给这些mc一个空白帧,当他们不出现在屏幕上时,你能用gotoAndStop()语句跳转到这一帧,从而减少播放器对资源的需求。
请务必记住,这种情况下,简单的设置可见度属性为不可见( _visible = false )是无效的,播放器将继续按照这些mc所停留或播放的帧的复杂度来分配资源。
数组
数组在各种需要记录数据的应用程序和游戏中都被广泛的使用。
一个典型的例子就是基于区块的Flash游戏,在这样一类的游戏中,地图有时被存放成形如arr[y][x]的二维数组。虽然这是一种很常见的方法,但是如果用一维数组的话,却能提高程序的运行效率。另一个重要的方法来提高数组效率是在数组遍历的时候使用for in 循环来代替传统的 for 或者while循环语法。
例如:
一段代码如下
for (var i in arr)
{
if (arr[i] > 50)
{
// 进行某些操作
}
}
它的执行速度明显高于这一段代码:
for (var i=0; i < 10000; i++)
{
if (arr[i] > 50)
{
// 进行某些操作
}
}
前者的效率比后者提高了30%,这个数字在你的游戏要逐帧执行这一段代码的时候显得更加宝贵!
高级优化:
1) for循环 和 while循环
用while循环将会得到比for循环更好的效率。然而,从数组中读取数据,用for in循环式最好的选择!
所以我们不推荐使用:
for (var i=0; i < 1000; i++)
{
//进行某些操作
}而推荐使用
var i=-1
while (++i < 1000)
{
//进行某些操作
}
2) 从数组中读取数据
我们通过测试发现,for in循环的效率大大高于其他的循环方式。参看:
arr = []
MAX = 5000
//数组赋值
for (i=0; i < MAX; i++)
{
arr[i] = i
}
var item = null
// For 循环
for (var i=0; i < MAX; i++)
{
item = arr[i]
}
// For 循环
for (var i in arr)
{
item = arr[i]
}
// While 循环
i = -1
while(++i < MAX)
{
item = arr[i]
}
3) 向数组中写入数据(while , for)
可以看到while循环稍占优势。
4) _global(全局)变量同Timeline(时间轴)变量
我们猜测采用全局变量能提高变量调用速度,然而效果并不像预计的那样明显。
5) 单行、多行变量赋值
我们发现单行变量赋值效率大大高于多行。比如:
a = 0
b = 0
c = 0
d = 100
e = 100
效率就不如:
a = b = c = 0
d = e = 100
6) 变量名寻址
这个测试反映了变量名的预寻址是非常重要的,尤其是在循环的时候,一定要先给丁一个指向。这样大大节约了寻址时间。
比如:
var num = null
t = getTimer()
for (var i=0; i < MAX; i++)
{
num = Math.floor(MAX) – Math.ceil(MAX)
}
t1.text = “Always lookup: ” + (getTimer() – t)
就不如:
t = getTimer()
var floor = Math.floor
var ceil = Math.ceil
for (var i=0; i < MAX; i++)
{
num = floor(MAX) – ceil(MAX)
}
7) 短变量名和长变量名
变量名越短,效率越高。考虑到长变量名也有它的好处(比如,便于维护等),因此建议在关键部位(比如大量循环出现的时候)使用短变量名,最好就1-2个字符。
8)循环前、后声明变量
在测试前,我们认为循环前声明变量会更加节约时间,不料测试结果并不明显,甚至还恰恰相反!
// 内部声明
t = getTimer()
for (var i=0; i < MAX; i++)
{
var test1 = i
}
t1.text = “Inside:” + (getTimer() – t)
// 外部声明
t = getTimer()
var test2
for (var i=0; i < MAX; i++)
{
test2 = i
}
9) 使用嵌套的if结构
当用到复杂的条件表达式时。把他们打散成为嵌套的独立判断结构是最佳方案。下面的代码我们进行了测试,发现这种效果改进明显!
MAX = 20000
a = 1
b = 2
c = -3
d = 4
var i=MAX
while(–i > -1)
{
if (a == 1 && b == 2 && c == 3 && d == 4)
{
var k = d * c * b * a
}
}
//下面的判断更加节省时间
var i=MAX
while(–i > -1)
{
if (a == 1)
{
if (b == 2)
{
if (c == 3)
{
if (d == 4)
{
var k = d * c * b * a
}
}
}
}
}
10) 寻找局部变量(this方法同with方法比较)
局部变量的定位方法很多。我们发现用with比用this更加有优势!
obj = {}
obj.a = 1
obj.b = 2
obj.c = 3
obj.d = 4
obj.e = 5
obj.f = 6
obj.g = 7
obj.h = 8
obj.test1 = useThis
obj.test2 = useWith
MAX = 10000
function useThis()
{
var i = MAX
while(–i > -1)
{
this.a = 1
this.b = 2
this.c = 3
this.d = 4
this.e = 5
this.f = 6
this.g = 7
this.h = 8
}
}
function useWith()
{
var i = MAX
while(–i > -1)
{
with(this)
{
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7
h = 8
}
}
}
11) 循环监听键盘事件
同刚才所提到的寻址一样,我们实现给一个指向会得到更好的效率,比如:
keyDown = Key.isDown
keyLeft = Key.LEFT
//我们再用 if (keyDown(keyLeft))
附:我们测试了按键代码和键值常量的效率发现并无太大差别。
12) Math.floor()方法与int()
这个问题曾在Flashkit的论坛被提出讨论过。测试表明,旧的int方法反而效率更高。我们的测试结果也反映了这一点。
13)eval表达式与中括号语法
我们并没有发现明显的差别,并不像刚才所述那样,旧的eval表达式比起中括号方法并没有太大的优势
var mc = eval_r(“_root.myMc” + i)
var mc = _root["myMc" + i]
//两者效率差不多16) 涉及MC的循环:ASBroadcaster 同欢同循环的差别
结论
我们从这些测试结果中发现,对于不同的需求,采用不同的代码,我们可以大大提高脚本的执行效率。虽然我们在这里罗列了许多的优化代码的方法,需要大家自己测试、实验的还有很多(考虑到每个人的需求不同).如果你想更加深入地讨论这类问题。可以来我们的论坛。
aw附:
终于翻译完了,自己也学到很多好东西,大家又什么问题可以去gotoAndPlay的官方,也可以来我的Blog提出!
三黑羽AS心得:浅释ActionScript的代码优化
来源:Kingda blog
本文既为浅谈代码优化,那么就不深入到OOP设计层面。仅涉及Flash8帮助里面提到的一些代码编写优化原则,并加以解释。
准则来源于Flash8 帮助,我做了一些解释:
1.避免从一个循环中多次调用一个函数。
在循环中包含小函数的内容,可使效果更佳。小函数生命期短,利于资源释放。尤其是在大的循环中时。
2.尽可能使用本机函数。
本机函数要比用户定义的函数运行速度更快。本机函数即Flash中内有的一些函数(intrinsic),比如hitTest(),你没必要自己写一个类似的。
3.不要过多使用 Object 类型。
数据类型注释应力求精确,这样可以提高性能。只有在没有适当的备选数据类型时,才使用 Object 类型。同时也便于代码管理,时刻知道对象的类型和作用。
同时也有利于编译器编译时优化。
4.避免使用 eval_r() 函数或数据访问运算符。
通常,较为可取且更有效的做法是只设置一次局部引用。不得已时才用eval,比如转换_droptarget为MovieClip时。
5.在开始循环前将 Array.length 赋予变量,尤其是大的循环。
在开始循环前将 Array.length 赋予变量(比如var iLength:Number),将其作为条件使用,而不是使用 myArr.length 本身。
原因,在循环中,iLength是Number变量,会被放入寄存器使用,效率远比访问Array再得到length高。例如,应使用
var fontArr:Array = TextField.getFontList();
var arrayLen:Number = fontArr.length;
for (var i:Number = 0; i < arrayLen; i++) {
trace(fontArr[i]);
}
来代替:
var fontArr:Array = TextField.getFontList();
for (var i:Number = 0; i < fontArr.length; i++) {
trace(fontArr[i]);
}
6.注重优化循环及所有重复动作。
Flash Player 花费许多时间来处理循环(如使用 setInterval() 函数的循环)。
7.在局部变量够用时,不要使用全局变量。类静态变量也要少用。
全局变量是开发者的恶梦。实在需要全局变量的话,我建议使用singleton设计模式来进行管理。
8.声明变量时,添加 var 关键字。
这是为了编译时让编译器知道你的变量类型,优化编译。
黑羽补充一点:对关键字的使用要谨慎。
不赞成使用关键字作为自己的method和属性名,除非你确认后续开发不会用到相同的事件名和属性名。
但你怎么知道flash使用了多少隐藏关键字?太多了!比如说 className, invalidate, refresh, mouseOver等等不常用的关键词。好的方法是使用SEPY编辑器来写代码,那里面加亮了所有公布的和没有公布的关键词。
而且因为很有可能和start,load,等这些常用的事件名重复,带来代码不必要的修改和麻烦。
9.对涉及到调用绘图资源的函数时,尽量先多判断再调用。
所有渐变,位置变化,创建删除MC,组件等函数都涉及到绘图资源的调用。在很多情况下,尽量先用逻辑判断变量或者对象的属性,必要时再调用这些函数。这样可以节省较多的计算资源。
下面是天地会翻译:
降低显示列表上的复杂性来提高性能
增加Flash应用程序性能的一种最简单方法是,移除显示列表中所有的隐藏对象,同时使用最少数量的显示对象。 代码将 通过遍历整个显示列表来执行,即从显示列表最上层(舞台),到主应用程序类。 Flash Player执行代码,并从上到下重绘显示列表中的所有的孩子,直到到达显示对象。 容器可以使任何继承自DisplayObjectContainer的类,如UIComponent,Group或者Sprite。
尤其是在MXML中,很容易就嵌套了显示对象,但是每次嵌套对象时都是非常耗性能的,因为每个添加到现实对象列表的对象都继承了一个类,这个类又继承另一个,如此等等。 为了理解为什么嵌套是高消耗的, 让我们看一下显示列表类的层次结构。

AS3
当谈到显示列表,对于AS3来说,所有的显示对象过去曾经是MovieClip。 在Flash Pro中早期的Flash版本(AS1和AS2)中,MovieClip类都是动画的核心类。 每一个MovieClip符号包含了显示对象的行为和功能,以及操作时间轴的附加属性。 许多时候你并不需要多余的图层以及时间轴的开销,而事实上AS3提供了一种能的对象叫做DisplayObject。 DisplayObject是低层的为那些能够被添加到显示列表的所有对象的基类,它继承了EventDispatcher(它是基于对象的)。 它包括一些类来帮助管理对象(如cacheASBitmap) 和可视属性。 显示对象容器是一种这样的对象,在它们里面可以包含子对象(这些子对象是显示对象)。 DisplayObjectContainer包含了一些方法,来管理它们的孩子对象,例如AddChild(向容器中添加对 象),numChildren(容器所包含的孩子对象的个数)和removeChild(移除子对象)。
有些时候,你需要显示图形但又不需要时间轴。 这时你需要使用Sprite,它继承自DisplayObjectContainer类。 一般原则,你最好使用Bitmap,Shape和Sprite类或者它们的子类,而不要选择MovieClip。
Flex3
下面是最小化的Flex。 Flex对于显示对象的核心类是FlexSprite,除了能够返回一个字符串表示这个对象的位置外,和Sprite没什么两样。 接下来是UIComponent,它继承了FlexSprite,也是Flex3中每个可视组件的基类。 UIComponent包括了键盘和鼠标交互,同时也允许在不需要的时候关闭这些交互,例如label。 它也包含了许多特征,例如accessibility(可访问性),Style(样式),State(状态),Invalidation和Validation(合法性),DataBinding(数据绑定),Effect(效果),嵌入字体等等。
Flex4
下面是Flex4. Flex4使用Group作为Spark(相当于MX中的UIComponent)中可视元素的容器基类。然后你可以使用一系列的组件,如Skin,Graphic,HGroup和VGroup。
除了Group之外,也可以使用SkinnableComponent,它是所有Spark组件的超类,它为skinnable组件定义了基类。 使用SkinnableComponent类的皮肤是Skin类的典型子类。
以Spark按钮为 例。 ButtonBase类是所有Spark按钮组件的基类。 Button和ToggleButtonBase是ButtonBase的子类。 同样,诸如CheckBox和RadioButton类是ToggleButtonBase的子类。 按钮组件继承了ButtonBase,同时使用了默认皮肤,包含了一个文本label。 你可以自定义皮肤类来添加图像到控制或其他任何你需要的东西。 默认按钮皮肤是spark.skins.spark.ButtonSkin,它继承自Skin。 最后提到的是Spark中的组件,它们很容易改变,但是也非常重要。
下面做一些测试。 关于显示对象的内存使用情况:
Shape: 224 bytes
Sprite: 392 bytes
MovieClip: 428 bytes
UIComponent: 1036 bytes
Group: 1200 bytes
下面,看一下Flash Player代码在帧上的执行时间。 建议使用“我”前几天开发的FrameStats工具。 所做的工作是创建一个快速测试,然后添加方法到
FrameStats 工具 它允许你查看在一帧或几帧上代码执行时间(毫秒单位)的信息。 我将把帧率设为1秒(这样测试的更清楚,也便于观察结果),然后调用一个将被添加到显示对象的方法,添加显示对象到显示列表。 然后可以在控制台里跟踪帧的生命周期。
protected function creationCompleteHandler():void
frameStats = new FrameStats(FlexGlobals.topLevelApplication, false );
frameRateControl = new FrameRateControl( FlexGlobals.topLevelApplication, false, false, 1, 1);
var componenent:UIComponent = new UIComponent();
componenent.addChild( frameStats );
frameStatsHolder.addElement( componenent );
trace( "Sprite: " + getSize(new Group()) );
uicom.addChild( sprite );
frameStats.testingExecutionTimeOfMethod( methodToTest, 10000 );
private function methodToTest():void
sprite.addChild( new Group() );
显示对象
当添加10000个显示对象是,对于主要基类构造器的代码执行以及子类情况如下:
Shape
Constructor code of children executed: 276
Sprite
Constructor code of children executed: 399
UIComponent
Constructor code of children executed: 1078
Group
Constructor code of children executed: 1195
正如所料,构造器代码和每个构造器的执行在拥有较多嵌套对象时,将花费更长时间。 如果你知道Flash Player经常将构造器方法放到自身代码的概念,这是有益的,因此在构造器上的执行时间会比其他类更长,我们应该尽量减少构造函数中的代码。
添加1000个显示对象
按钮:
虽然我添加了10000个SimpleButton的显示对象,Player在帧率为1fps时也只用了33毫秒,原因是SimpleButton在显示 对象树的层次上比较靠上,所以是较少的嵌套结构。 SparkButton在构造器代码上执行时间要比Halo更长,但有趣的是,SpariButton对于显示列表的渲染时间要短一些。
SimpleButton
Constructor code of children executed: 33
Final user code executed: 730
Player renders changes display list: 304
mx.Button
Constructor code of children executed: 820
Player renders changes display list: 7075
s:Button
Constructor code of children executed: 2392
Player renders changes display list: 4539
Text
添加文本的结果也非常有趣。 Spark Label在渲染的时间上做的还不错,但是在构造函数的执行时间上还是不如Halo组件。 TLF在渲染上做的很差,但是构造器时间上非常好。
TextField
Constructor code of children executed: 68
Player renders changes display list: 168
mx:Text
Constructor code of children executed: 743
Player renders changes display list: 685
S:Label
Constructor code of children executed: 1136
Player renders changes display list: 198
s:RichText
Constructor code of children executed: 416
Player renders changes display list: 3224
结论
–使用低层次(即位于结构树的靠近根的位置)的类,例如TextField,SimpleButton(如果可能的话),而不是Halo和Spark 它可能需要更多的代码,但是将提高性能。
–避免使用TLF
–使用Halo组件而不是Spark组件
–自定义组件时,Sprit > MovieClip & UIComponent > Group
–在创建矢量图形是,建议使用Shape显示对象
next version flex ,odenamed “Hero”
hope , the flex will be support fully to android ,
Adobe is currently building new mobile development capabilities into the Flex framework. The next version of Flex, codenamed “Hero”, will enable developers to create application experiences that translate well across platforms, and make it easy to build applications that work well on a wide variety of mobile devices. “Hero” will augment a number of existing Flex components with mobile- and touch-optimized skins and functional
-
2010-08-28
麻球网第一届flash游戏开发大赛官方素材上线【第一批】
各位开发者,麻球网第一届flash游戏开发大赛官方素材【第一批】终于上线了,这一批包括两款盛大游戏的素材文件:
热血传奇
梦幻国度
素材下载地址如下:
热血传奇.rar 04ffdc0685f14999216c97fe7a859aec
梦幻国度.rar e2fba5b15c6e7de197a1a67d02fc0890
麻球flash游戏开发大赛于8月1日开幕已来,麻球平台的开放性,开发者+发布商+广告商模式的完整性,以及麻球立足开发者的发展路线已经渐渐为广大开发者所了解并深入人心。
现在大赛已经进行了近一个月了,大赛得到了众多开发者的支持,越来越多的开发者报名参赛,并提交了自己的优秀作品来参加比赛。在这期间大部分的参赛开发者与支持麻球发展的开发者聚集到麻球官方群,热情讨论游戏开发的宝贵经验,探讨小游戏的行业现状与生存之道,并对麻球的各方面工作提出了许多意见。在此感谢大家了,也期待大家继续支持麻球。
麻球为了激励大家创作中文游戏踊跃参赛,特整理了一系列盛大具有自主版权的游戏素材,免费提供给大家,大家可以自由用于创作。
处于尽量支持开发者的游戏创作,同时也希望开发者支持麻球大赛的考虑,目前大赛阶段素材只授权用于参赛游戏,大赛结束后会再作调整,希望大家理解支持,祝大家开发出优秀的游戏作品,摘取各项大奖。
//————————————–
麻球官方群1:121304476
麻球官方群2:100592316
社区经理围脖:t.sina.com.cn/iscat
-
2010-08-26
Use custom tooltip instead of default validate error in flex
-
We may use the validator default in flex framework to check user’s input in our application . You may notice that you are probably doing something wrong (as indicated by the red borders around the form items that begin to appear) but you have no ...
Flash SEO Tool Synopsis
-
Flash SEO Tool Make your content visible for Google, Bing, Yahoo, etc. Prepare keywords and meta description Automatically make sitemap indexable by spider Create new SEO-friendly Flash website or add this feature to Your existing site Use friendly URLs ...
- 启动Extension Manager时指定语言,再安装组件:给Extension Manager的快捷方式中添加一个启动参数:
-locale lang="en_US"
- 从Flash CS5中启动Extension Manager,方法是Flash CS5菜单栏:Help – Manager Extension…,然后再安装组件。
组件安装后没有显示在Flash面板中
情形是这样的:在中文的系统上安装英文版的Flash CS5,那么用Adobe Extension Manager安装mxp后,Flash CS5中的组件面板没有显示出刚装的组件。
问题在于Adobe Extension Manager会把组件安装在系统语言(中文)的路径下,像这样:
".../Flash CS5/zh_CN/Configuration/Components/..."
而Flash CS5读取的组件时安装自身语言版本的,像这样:
".../Flash CS5/en_CN/Configuration/Components/..."
解决方法是,让Extension Manager把组件安装在Flash CS5语言的路径下,方法有两个:
相关文章:
-
2010-08-25
FP9下的图文混编组件RichTextField 2.0
RichTextField是一个基于TextField的图文混编的组件。跟上一个版本相比,新版重写了显示元素的渲染方法,效率得到提升;增加了对html文本的支持;还可以导入和导出XML格式的内容,方便保存和传输等等。
功能演示:
项目首页: http://code.google.com/p/richtextfield
下载地址:http://code.google.com/p/richtextfield/downloads/list
API文档:http://www.riaidea.com/projects/richtextfield/api/
欢迎提交任何bug和建议。
在URLRequest中构造HTTP协议发送数据
有一点经验的AS开发者都知道,要发送数据用URLRequest,要POST数据用URLVarialbes。一切都非常好,直到碰到了发送图片+数据的时候···
因为图片BitmapData一般都Encode成了ByteArray,以流的形式传至后台,而变量是以值对的形式POST过去,这就造成了后台无法区分二进制和值对。
以前的做法是先把图片单独发过去,然后等服务器返回URL,再将URL与其他数据以值对的形式发送至后台。(比较Stupid,但是Work!!)
其实抓包分析之后,发现Flash其实也是以标准的HTTP协议发送数据的,我们完全可以构造URLRequest的内容来构造一个标准的HTTP协议。
首先分析一个简单的HTTP协议例子(截取自FileReference的例子):
POST /handler.cfm HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
User-Agent: Shockwave Flash
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
MyFile.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
Content-Type: application/octet-stream
FileDataHere
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Upload"
Submit Query
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--
其中:
POST /handler.cfm HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
User-Agent: Shockwave Flash
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
这一串是HTTP头,一般我们不用管太多,URLRequest会自动构造,但是有几个参数要留意一下:
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
第一个是类似页面表单的数据类型。而boundary则定义了分界符的字符(这个可以自己定义)。
所以我们在AS3代码中应该写如下语句:
this.request.contentType = "multipart/form-data; boundary=---------------------------Ij5ae0ae0KM7GI3KM7" ;
就是要构造在HTTP协议中添加了这两段内容。
接下来是内容部分:
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
MyFile.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
上下两段是分割符(细心的同学可能已经发现其实就是我们刚刚定义的boundary的值)。一般都是这样括住我们需要的数据(结尾除外)
Content-Disposition: form-data;
说明的是数据的类型,这个可以上网去查看,一般比较常用的有例如image/jpeg,image/x-png,当然还有非常多的其他值。
name="Filename"
这个就是POST的变量的变量名。
MyFile.jpg
这个就是变量的值。
所以上面的全句的意思可以理解为Filename = MyFile.jpg;
在AS3里我们可以这样写:
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name +"\"\r\n\r\n" + $value);
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
(这里为了方便看写了三句,其实可以一句写完)
同理,对于图片数据,HTTP协议有一些不同:
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
Content-Type: application/octet-stream
FileDataHere
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
(实践证明其实不用这么写,只要按我下面的写法就OK了,但还是把比较标准的格式给大家看看)
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name + "\"; filename=\"" + $filename + "\"\r\nContent-Type: " + $type + "\r\n\r\n");
_byteArray.writeBytes($content);
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
最后一个变量的结尾记得换成结尾的分割符(跟我们一直写的分割符有那么一点点不同)
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--
即:
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "--");
然后把我们一直在编辑的赋值给URLRequest,即:
_request.data = _byteArray;
我们就大功告成了,同时后台同学也可以很轻松的按标准的格式去获取我们发送过来的数据。
下面附上我自己对应整合的一个小类,没测试过,只是做个范例吧 :)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package com.dannycheung
{
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.utils.ByteArray;
/**
* @author DannyCheung
*/
public class HttpRequestBuilder
{
//构造的URLRequest
private var _request:URLRequest;
//构造的二进制ByteArray
private var _byteArray:ByteArray;
//Http协议分割符
private var _separator:String;
//标志位
private var PROTOCAL_END_SET:Boolean = false; //是否填写HTTP文件尾
public function HttpRequestBuilder ($url:String, $separator:String = "7d86d710144a") {
//初始化
this.separator = $separator;
this.request = new URLRequest($url);
this.request.method = URLRequestMethod.POST;
this.request.contentType = "multipart/form-data; boundary=---------------------------" + separator;
this._byteArray = new ByteArray();
}
/*
* 写入变量
* @param $name 写入的变量名
* @param $value 写入的变量值
*/
public function writeVariable($name:String, $value:String):void {
writeSeparator();
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name +"\"\r\n\r\n" + $value);
}
/*
* 写入图片
* @param $name 变量名
* @param $filename 图片文件名
* @param $type 图片类型,在HttpRequestBuilderConsts下定义
* @param $content 图片二进制数据
*/
public function writeImage($name:String, $filename:String, $type:String, $content:ByteArray):void {
writeSeparator();
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name + "\"; filename=\"" + $filename + "\"\r\nContent-Type: " + $type + "\r\n\r\n");
_byteArray.writeBytes($content);
}
/*
* 构造HTTP分割线
*/
public function writeSeparator():void {
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
}
/*
* 构造HTTP结尾,只能调用一次,二次调用会抛出错误
*/
public function writeHttpEnd():void {
if (!PROTOCAL_END_SET) {
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "--");
} else {
throw(new Error("Write the Http End More Than Once"));
}
}
/*
* 获取构造好的URLRequest
*/
public function getURLrequest():URLRequest {
return this.request;
}
//get set
public function get separator():String { return _separator; }
/*public function set separator(value:String):void
{
//TODO 替换之前写入的内容
_separator = value;
}*/
/*
* 获取前会检查是否写入HTTP结尾,未调用的话会报错
*/
public function get request():URLRequest {
if (!PROTOCAL_END_SET) throw(new Error("Havn't Write the Http End Yet")); //??还是应该自动构造
_request.data = _byteArray;
return _request;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package com.dannycheung
{
/**
* ...
* @author DannyCheung
*/
public class HttpRequestBuilderConsts
{
public static const JPG:String = "image/jpeg";
public static const PNG:String = "image/x-png";
public function HttpRequestBuilderConsts() {
}
}
}
3D引擎动态减面
-
成熟的3D游戏引擎都会做这么一个事情
就是“动态减面”
对于越来越远的3D事物没有必要还保持太多的面
比如很远处的一个球,只需要12个面 甚至更少就可以了,不影响视觉效果
今日看到个DEMO
http://blog.teleranek.org/wp-content/uploads/2010/07/xwing.swf
SVN : http://code.google.com/p/bartekz/source/browse/
对于3D项目的效率肯定是大有帮助
-
2010-08-24
JavaScript闭包
要理解闭包···要先搞清楚一个概念,在JavaScript里,函数可以当作“函数”,“匿名函数”,“一段执行的代码”,“类模板”。函数可以作为参数,函数可以作为返回值。
然后要知道闭包出现的原因,是因为JS里面,块对象是没有局部变量的概念,只有函数有局部变量值。为了避免命名对象的冲突,所以需要函数闭包。
函数:
function A(vars) {
}
匿名函数:
var A = function(vars) {
}
一段执行的代码(定义跟调用同时进行):
function(vars){
return xxx;
}();
类模板:
function() {
var _a;
function A() { };
}
一个闭包的例子:
var o = {};
o.fun = function () {
return function () {
}
}();
其中执行了蓝色函数,返回匿名红色函数被o的动态fun引用。(是不是很绕)
阅读全文类别:一起来学javascript 查看评论
在URLRequest中构造HTTP协议发送数据
有一点经验的AS开发者都知道,要发送数据用URLRequest,要POST数据用URLVarialbes。一切都非常好,直到碰到了发送图片+数据的时候···
因为图片BitmapData一般都Encode成了ByteArray,以流的形式传至后台,而变量是以值对的形式POST过去,这就造成了后台无法区分二进制和值对。
以前的做法是先把图片单独发过去,然后等服务器返回URL,再将URL与其他数据以值对的形式发送至后台。(比较Stupid,但是Work!!)
其实抓包分析之后,发现Flash其实也是以标准的HTTP协议发送数据的,我们完全可以构造URLRequest的内容来构造一个标准的HTTP协议。
首先分析一个简单的HTTP协议例子(截取自FileReference的例子):
POST /handler.cfm HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
User-Agent: Shockwave Flash
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
MyFile.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
Content-Type: application/octet-stream
FileDataHere
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Upload"
Submit Query
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--
其中:
POST /handler.cfm HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
User-Agent: Shockwave Flash
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
这一串是HTTP头,一般我们不用管太多,URLRequest会自动构造,但是有几个参数要留意一下:
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7
第一个是类似页面表单的数据类型。而boundary则定义了分界符的字符(这个可以自己定义)。
所以我们在AS3代码中应该写如下语句:
this.request.contentType = "multipart/form-data; boundary=---------------------------Ij5ae0ae0KM7GI3KM7" ;
就是要构造在HTTP协议中添加了这两段内容。
接下来是内容部分:
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
MyFile.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
上下两段是分割符(细心的同学可能已经发现其实就是我们刚刚定义的boundary的值)。一般都是这样括住我们需要的数据(结尾除外)
Content-Disposition: form-data;
说明的是数据的类型,这个可以上网去查看,一般比较常用的有例如image/jpeg,image/x-png,当然还有非常多的其他值。
name="Filename"
这个就是POST的变量的变量名。
MyFile.jpg
这个就是变量的值。
所以上面的全句的意思可以理解为Filename = MyFile.jpg;
在AS3里我们可以这样写:
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name +"\"\r\n\r\n" + $value);
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
(这里为了方便看写了三句,其实可以一句写完)
同理,对于图片数据,HTTP协议有一些不同:
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
Content-Type: application/octet-stream
FileDataHere
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
(实践证明其实不用这么写,只要按我下面的写法就OK了,但还是把比较标准的格式给大家看看)
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name + "\"; filename=\"" + $filename + "\"\r\nContent-Type: " + $type + "\r\n\r\n");
_byteArray.writeBytes($content);
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
最后一个变量的结尾记得换成结尾的分割符(跟我们一直写的分割符有那么一点点不同)
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--
即:
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "--");
然后把我们一直在编辑的赋值给URLRequest,即:
_request.data = _byteArray;
我们就大功告成了,同时后台同学也可以很轻松的按标准的格式去获取我们发送过来的数据。
下面附上我自己对应整合的一个小类,没测试过,只是做个范例吧 :)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package com.dannycheung
{
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.utils.ByteArray;
/**
* @author DannyCheung
*/
public class HttpRequestBuilder
{
//构造的URLRequest
private var _request:URLRequest;
//构造的二进制ByteArray
private var _byteArray:ByteArray;
//Http协议分割符
private var _separator:String;
//标志位
private var PROTOCAL_END_SET:Boolean = false; //是否填写HTTP文件尾
public function HttpRequestBuilder ($url:String, $separator:String = "7d86d710144a") {
//初始化
this.separator = $separator;
this.request = new URLRequest($url);
this.request.method = URLRequestMethod.POST;
this.request.contentType = "multipart/form-data; boundary=---------------------------" + separator;
this._byteArray = new ByteArray();
}
/*
* 写入变量
* @param $name 写入的变量名
* @param $value 写入的变量值
*/
public function writeVariable($name:String, $value:String):void {
writeSeparator();
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name +"\"\r\n\r\n" + $value);
}
/*
* 写入图片
* @param $name 变量名
* @param $filename 图片文件名
* @param $type 图片类型,在HttpRequestBuilderConsts下定义
* @param $content 图片二进制数据
*/
public function writeImage($name:String, $filename:String, $type:String, $content:ByteArray):void {
writeSeparator();
_byteArray.writeUTFBytes("Content-Disposition: form-data; name=\"" + $name + "\"; filename=\"" + $filename + "\"\r\nContent-Type: " + $type + "\r\n\r\n");
_byteArray.writeBytes($content);
}
/*
* 构造HTTP分割线
*/
public function writeSeparator():void {
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "\r\n");
}
/*
* 构造HTTP结尾,只能调用一次,二次调用会抛出错误
*/
public function writeHttpEnd():void {
if (!PROTOCAL_END_SET) {
_byteArray.writeUTFBytes("\r\n-----------------------------" + separator + "--");
} else {
throw(new Error("Write the Http End More Than Once"));
}
}
/*
* 获取构造好的URLRequest
*/
public function getURLrequest():URLRequest {
return this.request;
}
//get set
public function get separator():String { return _separator; }
/*public function set separator(value:String):void
{
//TODO 替换之前写入的内容
_separator = value;
}*/
/*
* 获取前会检查是否写入HTTP结尾,未调用的话会报错
*/
public function get request():URLRequest {
if (!PROTOCAL_END_SET) throw(new Error("Havn't Write the Http End Yet")); //??还是应该自动构造
_request.data = _byteArray;
return _request;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package com.dannycheung
{
/**
* ...
* @author DannyCheung
*/
public class HttpRequestBuilderConsts
{
public static const JPG:String = "image/jpeg";
public static const PNG:String = "image/x-png";
public function HttpRequestBuilderConsts() {
}
}
}
类别:as3常用代码 查看评论
- 开始找工作了-有招人的朋友,帮忙推荐推荐 (2010-9-5 13:1:46)
- AS3版Flash Remoting客户端类-Service类 (2010-8-3 14:41:53)
- 有关在Remoting通信中对于返回值是list就会报错的解决方法 (2010-7-16 18:0:28)
- [转发]3月28日•上海浦东•中国Flash开发者交流会 (2010-3-12 14:56:5)
- 转载火山的“FLASH WEB GAME”的经验文章 (2010-2-25 10:51:41)
优化Flash平台的性能(Adobe提供)
-
今正好看到了“优化Flash平台的性能”文档,初看了一下,蛮有感觉的,以后编程要注意了中文版:在线地址 PDF下载英文版:在线地址 PDF
Copyright © 2008
继续阅读《优化Flash平台的性能(Adobe提供)》的全文内容...
分类: Flash技术 | Tags: flash 优化 性能 | 添加评论(0)
相关文章:
- Adobe 平台技术
主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。
- 程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com
- Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin
- Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me
- 麻球大赛优秀作品介绍
主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com
- 麻球参赛游戏蛛蛛冒险的开发与设计经验分享
主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。
- 麻球参赛游戏DNF,梦幻塔防,吖凡哒哒技术与美工经验分享
主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
商文烨的博客: http://t.qq.com/shangwenye
第5届 FLASH开发者交流会 暨FLASH CAMP 2010
报名地址: http://www.wedoswf.com/events/1
..................................
9月18日 第5届 FLASH开发者交流会 暨FLASH CAMP 2010
-
主讲者和专题介绍
Adobe 平台技术
主讲人:Gary Zhu - Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。
程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com
Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin
Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户
- Adobe 平台技术
主讲人:Gary Zhu -
Adobe 平台技术总监
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。 - 程序接口的另类理解与使用
主讲人:孙毅
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com - Flash Media Server 开发经验谈
主讲人:沈先彬
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin - Flash RIA的可用性
主讲人:刘轩飞
晒台网首席产品管,10年前端设计和开发经验,信仰互联网,以提供最佳互联网用户体验为己任
刘轩飞的博客:http://www.xuanfei.me - 麻球大赛优秀作品介绍
主讲人:廖湘宁
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com - 麻球参赛游戏蛛蛛冒险的开发与设计经验分享
主讲人:徐黎明
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。 - 麻球参赛游戏DNF,梦幻塔防技术与吖凡哒哒美工设计经验分享
主讲人:商文烨
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队! - 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
第5届 FLASH开发者交流会 暨FLASH CAMP 2010

>>报名参加
主讲者和专题介绍
议程安排
2010年9月18日 星期六
抽奖活动
为感谢大家对活动的关注与支持,本次活动特设精美礼品抽奖赠送。

会议地点
畅星大厦•上海
地址:上海浦东新区碧波路888号畅星大厦3楼会议厅
电话:021-38984558
网站:http://www.changxing.sh.cn
交通:地铁2号线张江站(步行5-10分钟即到),161

- 活动时间:2010年9月18日 星期六
- 活动地点:上海浦东新区碧波路888号畅星大厦3楼会议厅
- 报名地址:http://www.wedoswf.com/events/1
- 议程安排:
- 12:30 ~ 13:00 参会人员签到,入场
- 13:15 ~ 15:00 主题讨论
- 15:00 ~ 15:15 茶歇和聊天
- 15:15 ~ 17:30 主题讨论
- 18:00 技术交流和讨论
第五届Flash开发者交流会(我是演讲嘉宾)
-
这次活动,很荣幸我被邀请作为演讲嘉宾,我选的主题是《程序接口的另类理解与使用》,到时候欢迎大家去听听,随后我会在我博客公布演讲使用的PPT文档以及演示代码等。如果会前,会中,会后有任何建议,可以告诉我,可以通过博客,或者大会现场提问,谢谢大家支持。
Gary 多年工作于 Adobe 公司工作,从事软件产品和平台技术的发展与推广工作。此次Gary远道而来,将为我们介绍 Adobe 平台技术的发展和Flash移动应用软件的开发。
曾就职五分钟,任Flash部门主管,并开发《绿豆蛙—漂流岛社区》等项目;现就职八方视界,任Flash部门高级主管,并负责其产品《唯智学园》Flash部分主程,以及Flash性能等各方面研究。
孙毅的博客:http://www.xiaos8.com
从事FLASH 游戏与AIR应用开发,参与开发项目有 梦境世界 三十六计等,目前在开发WEBGAME。
沈先彬的博客:http://blog.sina.com.cn/shenxianbin
廖湘宁多年来从事视频互动创意与游戏开发,目前在麻球网担任开发者社区经理,负责麻球网(Mochi Media)平台的本土化研发与推广工作。
廖湘宁的博客: http://www.xncat.com
曾任TCL教育互联 研发主管,广州市远程教育中心 开发主管。涉足麻球平台之后,钟情于游戏开发,创办Tinime 工作室。
中国第三代闪客,个人作品获得过无数奖项并在中央电视台播出,06年担任搜狐17173频道主管并连续4年获得搜狐最佳称号,2009年成立传奇网科,旗下传动力工作室便是当今最脍炙人口的休闲小游戏开发团队!
我如何看其它广告平台与麻球比较之优劣
开发者喜欢比较,比较中文游戏与英文游戏ecpm的差异, 比较麻球与其它游戏内广告(4399,7k7k)价格差异, 甚至比较谷歌跟麻球广告。
作这些比较之前先问一问下面几个问题:
是否会专注小游戏市场?
是否有成熟的开发者,发布商,广告商自助方案?
是否有充分的开发者自主权利,开放的游戏版权协议?
是否裹足于一时的圈利(图一时发展,盗取开发者游戏,践踏版权)
是否立足于小游戏市场的繁荣?
一个平台的发展,以及它跟其它平台的差异,这是一个靠说解决不了的问题,麻球正在做中国本土化工作,宣传推广发展都在进行中。。。希望开发者多多支持,这毕竟是一个广告商,发布商,开发者全部自助的平台。
积累中文游戏数量,提升中文游戏品质。这是目前麻球在做的事,
接下来会解决麻球版游戏版权问题,
再接下来会解决发布商屏蔽广告问题,
再接下来会越来越多的渠道发布麻球的正版游戏,
接下来,市场做大了,市场成熟了。不论开发者是接赞助,卖广告,卖版权,anyway!
如果开发者们支持配合,事情按上面的路线发展,flash游戏开发会迎来一个高潮。加油各位。
-
2010-08-23
Experience the tencent’s magical image builder
-
Tonight , I take some photos for a experience the tencent’s magical image builder. Seems good. Excellent! 随机文章 Flex Chart图表及其提示字体大小之CSS( 2 ) 敏捷开发应用于游戏原型创作( 0 ) 如何成为一名游戏...
优化Flash平台的性能
How to config global style in popup condition in flex
-
If we have a popup window in flex application , how can we config the style of the application behind. such as the background color? You can config the global selector in flex with four attributes: modalTransparencyBlur, modalTransparency, modalTrans...
为什么大家都用变量"i"?
-
今天在写for循环的时候,突然想到为什么一定要用变量"i"来迭代呢?如果用a,b,c等变量命名也不会冲突啊。
相信大部分人都是因为,前辈都用"i",因此我们这些后学的晚生也就用它了。
抱着刨根究底的恶心思想,纠结了几分钟后,突然想起来有个单词叫index,是索引的意思。
然后问了一下周边的C++程序员们,本来还是各抒己见,有个人说应该是index的缩写吧。
于是所有人都一致认为就是这个意思了。这个问题可能讨论起来没什么意义,不过还是可以无聊的考虑一下,那么你觉得会是什么原因呢?另外第一个用变量"i"的程序员,他当时是不是就是这样想的呢?
植物大战僵尸George Fan访谈【麻球大赛评委之一】
一款《植物大战僵尸》可以说是现在最为炙手可热的小游戏,而这款游戏的制作人George Fan则是因此为众人所知。最近他更是加盟盛大旗下麻球网所举办的首届“麻球Flash开发者大赛”担任评委一职,就此,我们记者特此向他进行了一次采访。
你最喜欢的小游戏是什么?
如果《Vasebreaker》可以计算在内的话,那么应该就是这个了。如果不算的话,我必须得说像《Column Like you See ‘EM》这种让你同时种植5棵植物的游戏绝对是我看过最神奇的游戏了。
请介绍一下《植物大战僵尸》的制作团队和构成。
《植物大战僵尸》的核心团队规模其实很小:George Fan,也就是我,负责游戏策划;Tod Semple负责编程;Rich Werner负责美术,而Laura Shigihara则负责音效和背景音乐。但是,为了让这个游戏能够成功的发行倒是动用了多得多的人力。像是QA,好几个美工、游戏测试、销售团队以及一切你可以想象出来的名字!在宝开,所有的成员都会参与游戏测试,而来自所有人的关心和爱都会融合到每一款最终的游戏中去。《植物大战僵尸》之所以能成为现在的样子,都是因为这些人所投注的热情。
如果你想制作一款适合每个人的游戏,那么让不同类型的人参与开发就变得十分重要。而宝开就可以提供这样的资源,每个人都是潜在的休闲游戏玩家,所提出的意见也非常的不同。因此,在制作游戏的过程中,我们尽可能的听取融入不同细分市场用户的意见和建议。
据说这款游戏被推翻重新制作过,请问你们在产品没有上市之前,如何对自己产品的质量进行评估呢?
就像很多宝开游戏一样,《植物大战僵尸》在制作工程之中经历了多次的推倒重来的过程。我们进行了对各种不同的项目进行了多次的测试,使得游戏最终能够进化到现在的样子。在制作这款游戏之前,我刚完成了《怪怪水族馆》,正在各种不同的游戏创意之间犹疑。其中之一就是为《怪怪水族馆》增加更多防卫元素的续作。当时我正在玩《魔兽争霸III》中的塔防模式。于是我就想,“如果我用植物来代替塔呢?植物是一个很好的选择,我们可以赋予它们各种角色,而且也没有人会期待植物能够移动。”于是鱼就被排除在外,植物正式进入视野。但是正好在那个时期,大量的园艺游戏开始充斥休闲游戏领域,但是,你知道,我就是无法接受那些游戏!我不希望游戏会和其他的园艺类游戏混成一团。这两方面的思考才促成了《植物大战僵尸》的诞生。我当时的思路是“没有其他任何人想过在同一个游戏里同时存在‘植物’和‘僵尸’!”而事实证明,这个想法是对的!
游戏上市后,对于如何扩展这个游戏的内容和可玩性,有什么样的打算呢?
由于我们的公司政策,我们通常不讨论游戏的未来计划。不过,我们始终把游戏做的兼具创新性和趣味性作为优先考虑的事。在《植物大战僵尸》这个项目中,毫无疑问我们并不缺少玩家。我们做的就是持续不断的增加新的内容。就此同时,我们的另一大使命就是保证游戏能在尽可能多的平台上的可玩性,进而让尽可能多的人可以感受原汁原味的游戏体验。到目前为止,《植物大战僵尸》已经进入iPhone及iPad平台,并且在这两大平台上掀起了小游戏的风潮。
你们在这个游戏中的音效是如何制作的?它们非常有趣。
《植物大战僵尸》音乐视频的诞生是源于我曾向我的女朋友Laura提起,我希望能够做一个比较好玩的工作人员表。这就给了她灵感去写出那首震撼人心的片尾曲,进而激发我要去做一款戏谑的卡通动画用来作为视频。接下来的两个礼拜里,我们的团队就直接把整个视频按顺序做成了一个成品。那实在是太棒了!虽然现在《植物大战僵尸》还没有制作原声大碟的计划,但是,谁知道呢!
如何能够从一个基本的方式,衍生出各种各样有趣的关卡?其中有什么样的诀窍呢?
当我们刚开始制作《植物大战僵尸》的时候,塔防游戏还刚刚起步。也是要到最近一段时间,由于flash游戏和网络浏览器的高度兼容性,才促使了塔防游戏渐渐的在市场上浮出水面。而《植物大战僵尸》是一款非常特别的游戏,在我看来拥有很多出色的元素使它能脱颖而出,并且别具一格。
在制作最初,我们的主要工作是对塔防游戏进行简化,使每个人都能轻易地上手。我们把游戏区域做的越来越小,并致力于资源获取这一全球通用的元素上。就像海边嬉戏的小孩那样,建造堡垒,从潮汐的侵袭下保护砂堡,防卫对我们来说非常自然的一种行为。然后再加上一点策略元素,加上看你的炮塔对敌人投掷炮弹的快感作为催化剂,再加上一些有益身心健康的幽默感,就收获了最终的成功。
怎样才能让用户对这个游戏上瘾,或者说如何能不让用户感到厌烦?
我们的宗旨是为所有人制作游戏 —— 也就是休闲玩家和核心玩家。仔细研究流行的游戏,像是《宝石迷阵》、《幻幻石》以及《祖玛》,你可以发现大部分都非常好的把握了“易上手度”和“具有挑战性”之间的平衡。其中的奥妙在于提供足够的内容以及渐进的难度曲线,使休闲玩家可以进入游戏,并在很长的一段时间内享受游戏的乐趣;而核心玩家则能够在合理的时间内进入到“具有难度”的部分,以满足他们对挑战的需求,无论是在策略、速度还是更深的层次。
另外的就是无形的“趣味”元素。作为我们这样一群玩家,我们不希望做一款自己也觉得无聊的游戏,因次会专注于 “休闲”内容的内置,并努力使它对所有玩家都具有吸引力。要有效的达到这一目的,一款游戏必须在初期经历一段缓慢谨慎的制作过程,并最终成为一款极具挑战性的游戏。而我们总是能够第一时间体会到其中的乐趣。
作为首届“麻球Flash开发者大赛”的评审团一员,什么是你评审一款游戏的首要原则?
如果一款游戏能让我沉溺其中,而且想要不断地玩下去,那我很可能会给个高分。我也会比较偏爱那些敢于冒险在游戏中加一点新鲜玩意的游戏,所以在游戏里加入一些小小的革新会有助于你得到我的票数。
了解大赛更多详情,敬请登陆www.mochimedia.com















