突然明白这个道理,不必有自我。

顿时感到轻松了很多,哈哈。社会责任、家庭责任,有太多的事情要做。

除了设定必要的allowDomain, allowInsecureDomain之外,注意让LocalConnection.connect(…)名称以下划线开头。
帮助文档它说:

  • 如果 connectionName 字符串不以下划线开头,则 Flash Player 会添加一个包含超级域名称和一个冒号的前缀(例如 myDomain:connectionName)。虽然这可以确保您的连接不会与其它域中具有同一名称的连接冲突,但任何发送方 LocalConnection 对象都必须指定此超级域(例如 myDomain:connectionName)。如果将具有接收方 LocalConnection 对象的 SWF 文件移动到另一个域中,Flash Player 会更改前缀,以反映新的超级域(例如 anotherDomain:connectionName)。必须手动编辑所有发送方 LocalConnection 对象,以指向新超级域。
    这样下来在不同沙箱、域之间的swf就可以通过LocalConnection相互通信了。
  • 如果 connectionName 字符串以下划线开头(例如 _connectionName),Flash Player 不会向该字符串添加前缀。这意味着接收方和发送方 LocalConnection 对象都将使用相同的 connectionName 字符串。如果接收方对象使用 LocalConnection.allowDomain() 来指定可以接受来自任何域的连接,则可以将具有接收方 LocalConnection 对象的 SWF 文件移动到另一个域,而无需更改任何发送方 LocalConnection 对象。

也就是说:不以下划线开头的connectionName会被Flash加上前缀(以区分所在的域),结果就是你在代码里面看到的明明是发送和接收方connectionName完全相同,但就是无法通信。非常的纠结。

当在as3中加载一个含有组件(即含有FocusManager)的as2影片之后,一个焦点问题产生了:as3中的TextField就无法正常获取焦点了。具体的问题可参见:

  1. http://parallaxed.net/bugs/,文章描述:Flash FocusManager Compatibility Probledm
  2. http://flash.9ria.com/viewthread.php?tid=38712

parallaxed.net上找到的解决方法:

我只测试了第一种方法,是可以解决这个问题的。

1. 当给一个TextField.htmlText赋值之后,注意,此时TextField的文字样式、布局就完全来以html的形式来渲染,所以htmlText中必须表现TextField已有样式、布局属性(例如:textColor、autoSize),为了达到这个目的TextField.htmlText会被自动加上两个标签:<p>、<font>。

会输出类似的信息:

可以看到htmlText已经加上了<p>、<font>来表现TextField的字体、大小、颜色等。
(从上面的信息可以看得出来Flash Player的TextField.html应该是对“=”运算符进行了重写(override))
2. 如果在给TextField.htmlText赋值的内容中包含了<p>标签,TextField.htmlText的最终渲染将会忽略这些<p>标签。因为:TextField会自动为htmlText在“根部”加上<p>,而HTML中<p>是不能再嵌套<p>的。
3. 我们在控制TextField的样式中,除了TextField提供有限的几个属性borderColor、backgroundColor、textColor等,还可以通过TextFormat来设置。对于一个设置了TextFormat的TextField来说,它的htmlText中会被加上<textformat>标签来表现TextFormat中的属性。

会输出类似的信息:

不过有个问题:TextField.htmlText提供的属性只支持以下几个是属性:blockindent、indent、leading、leftmargin、rightmargin、tabstops。它没有color,没有font,没有size,没有italic……也就是说并不能完整表现TextFormat的所有属性,那么TextFormat中的color、font、size等这些属性会被加在htmlText中的哪里呢?答案是<p>和<font>标签。

会输出类似的信息:

我们看到标签中有FACE=”Verdana”的信息,这是来自TextField.textFormat的属性。
4. defaultTextFormat + htmlText之Bug。
当对一个TextField设置defaultTextFormat后,一个奇怪的问题出现了:如果你用鼠标点(选)后会发现TextFormat.defaultTextFormat变为null,之后再进来的htmlText就失去了defaultTextFromat的那些样式。简单的解决办法就是先把TextField.defaultTextFormat存到一个变量(tmp),设置TextField.htmlText之后,再吧TextField.defaultTextFormat = tmp。之后再设置的htmlText就有defaultTextFormat中的样式了。

之前写过一个JSFL脚本用于图片的9格打散(scale9Grid),一直找不到取得“当前编辑项”的方法,无奈之下就用了:

也就是必须,在库中选中这个项才能运行这个JSFL
不过gskinner也实现了个同样功能的脚本,我才发现可以通过时间轴名字取得“当前编辑项”:

简单的记录下。

碰到个问题,就是客户端关联数据的更新问题。例如,游戏中的某个建筑必须是资源达到一定量,玩家才能建造的。也就是说“资源”数据与“建筑”数据是相关联的,某一时刻,资源量达到条件时,建筑必须变为可建造的状态。照理来讲,服务端发送给客户端时,“资源”数据与“建筑”数据都发送过来就OK了,但就项目目前的机制来讲,这种做法会导致服务端的负担太大、通信量太大、冗余。

只好尽可能让客户端来优化,尽量减少不必要的通信。简单的更新机制,假设B数据关联到A数据:

  1. 初始收到A、B数据时,建立数据之间的关联。
  2. 当收到A数据的更新时,把关联到A数据上的所有数据(B数据),设置B.needUpdate = true;
  3. 若B数据目前已处于被显示的状态,则向服务端请求B数据。
  4. 在访问B数据时,例如:打开建筑窗口时,若B.needUpdate==true,则向服务端请求B数据。
  5. 设置B.needUpdate = false;

嗯啊,看来客户端、服务端的设计优化永远得注意。

下载、设置tInspector

你可以在tInspectortInspector on Google Code主页上,下载到tInspector的代码。目前的版本是tInspector 1.0.4.5.zip,下载完成解压缩包,然后把tInspector/src目录的路径添加到Flash、FDT、Flex Builder……的类路径下。

解压tInspector代码压缩包:

新建一个.fla文件,打开“发布设置”,在Flash IDE里把tInspector/src目录添加到类路径中,同时建议去掉“警告模式”勾选(并不会影响编译的正确性,而且会编译得更快。另外,tInspector里面的代码有很多类似onMouseDown的写法,这些在Flash的编译器会被提出“警告”-_-!)。

使用tInspector

在刚新建的fla里面随便画个圆,设置个文档类,在类里面添加如下的代码:

你应该会看到大概这样的效果:

Get Adobe Flash player

把鼠标移到绿色圆形上面,会有红色的矩形框,按下鼠标就会看到操作条,试试那几个按钮有什么效果吧。
如果你要关掉tInspector,那么在swf中,点击鼠标右键,然后”Inspector off”吧。

大多数时候,你只需要写这句代码:

Inspector.init函数带了5个参数: