skip to main |skip to sidebar

2007-12-31

2007年,我 blog 的一年总结

谢谢大家对我 Blog 的关注。我的 Blog 自从 2007-3-24 开通以来,今年共写了 116 篇文章(包含本篇),总共4655人访问

访问内容排行榜

  1. 主页 —— 1121人访问
  2. Fedora 7(Linux)之旅 —— 150人访问
  3. Flex2 Tag for JSP —— 118人访问
  4. [AS3]位图的色阶控制(2) -- 伽玛校正(Gamma Correction) —— 101人访问
  5. Flash CS3 = Flash 8 + AS3.0 + CS3 UI ? —— 92人访问

文章内容排行榜

  1. ActionScript 类 —— 27篇
  2. AIR 类 —— 16篇
  3. flash 类 —— 11篇
  4. flex 类 —— 10篇

历史回顾

2007-12-29

MXNA最近很怪

最近,MXNA 上有很多垃圾信息。

今天中午去查看 Google Reader 时,发现从昨天晚上到今天中午,MXNA 的中文内容有102条。其中"自由鸟的BLOG"与"windflower"占了大多数。其中包含了大量的广告信息。

我一气之下把 MXNA 的中文内容退订了!

2007-12-26

[AI]高级人工智能(2)——结合队伍

[AI]高级人工智能(1)——回避障碍物

结合队伍就是诱导各个人到周围的人的平均位置。这是队伍一起行动的三大步骤之一。通过结合,各个人就会聚合到一起,出现队伍。

效果:

人刚开始是随机移动,但遇到其他的人时,就会跟随他。但碰到障碍物等时有可能无法跟上,而又开始随机移动。当一群(boids)遇到另外一群时有可能结合在一起,也有可能队员发生互换后分开。

得到周围的人

每一个人有一个视野距离与视野范围。比如某个机器人可以看到 100m ,眼睛的夹角在120度 以内的物体。其中"100m"为视野距离(以下称为 r),"120度"为视野范围(以下称为 th)。

核心代码:

//周围的人列表。
internal var aroundList:Array;

//可视列表。
internal var inViewList:Array; //创建可视列表。
public function resetViewList():void {
inViewList = [];
aroundList = [];
for each(var u:C2Unit in onwer.unitsList) {
if(!u.following && u != this) {
if(inAround(u)) {
aroundList.push(u);
if(inView(u)) {
inViewList.push(u);
}
}
}
}
} //判断是否在周围。
public function inAround(u:C2Unit):Boolean {
if(Vector2d.distance(pos, u.pos) > VIEW_DISTANCE) {//VIEW_DISTANCE 为 r
return false;
}
return true;
}

//判断是否在视野范围内。
public function inView(u:C2Unit):Boolean {
var dsu:Vector2d = new Vector2d().sub(u.pos, pos);//dsu = u - pos (pos为自己的坐标)
if(dsu.angle2(pos)>VIEW_WIDTH) {//VIEW_WIDTH 为 th/2
return false;
}
return true;
}

结合

实现结合,其实很简单,就是把速度(方向和长度)设为周围的人的平均速度即可。

核心代码:

//结合。
internal function follow():void {
if(inViewList.length) {
var avg:Vector2d = new Vector2d();
for each(var u:C2Unit in inViewList) {
avg.addTo(u.v);
}
avg.scaleTo(1/inViewList.length);
v.reset(avg);
following = true;
}else{
following = false;
}
}

完整源码下载:结合队伍.rar,或访问我的附件

2007-12-24

[AS3.0]使用":?"运算符来代替"if..else"的函数型编程

在函数型语言中,所有的语句都有返回值,当然 if..else 也不例外。这个功能在命令型语言中是没有的。

比如以下代码:

public function foo(a:int):int {
if(a<0) {
return -1
}else if(a==0) {
return 0
}else{
return 1
}
}

既难读也麻烦。如果使用 haskell(一种函数型语言) 来写的话:

foo a = if a<0 then -1 
else if a==0 then 0
else 1

十分简练。注意,AS3.0 有一个 :? 运算符,可以用它来实现,如果把格式写好的话,可读性会比 if..else 还要好。

public function foo(a:int):int {
return a<0 ? -1 :
a==0 ? 0 :
1;
}

if..else 相套时,可以这样写:

public function foo2(x:int, y:int):int {
return x>0 ? (
y>0 ? 1 :
y<0 ? 4 :
-1
): x<0 ? (
y>0 ? 2 :
y<0 ? 3 :
-1
):
-1;
}

2007-12-23

[AI]高级人工智能(1)——回避障碍物

效果:

在连续动作环境(不是Tile Based 环境)中,回避障碍物是很复杂。因为不像 Tile Based 环境,"点"在理论上有无限多,很难准确地判断。

但不是没有办法的,回避障碍物可以使用 Lenard-Jones potential 函数

它的方程为:

[U = -A/pow(r,n) + B/pow(r,m)]

n、m 为不同常量时的曲线为:

[Graph]

Lenard-Jones potential 函数是物理中的一个函数,他表示分子间的引力与斥力的势能。U 为原子间的势能,它与原子间的距离 r 成反比。AB 就像 mn 一样,是常量,其中 -A/pow(r,n) 表示引力部分,B/pow(r,m) 表示斥力部分。在 r 很小时会产生斥力,当 r 很大时会产生引力。参数 mn 控制曲线的斜率,AB 控制力的强度。

如果在游戏中,把障碍物与人物看成原子的话,就可以使用 Lenard-Jones potential 函数来实现回避障碍物。当十分接近时,会产生很大的斥力,再把 A 设为0,使引力始终为0这样回避障碍物就实现了。

核心代码:

var vo:Vector2d = new Vector2d();//障碍物的坐标
var vp:Vector2d = new Vector2d().reset(player);//人物的坐标
var r:Vector2d = new Vector2d();//人物与障碍物的差
var u:Vector2d = new Vector2d();
var dv:Vector2d = new Vector2d();
var B:Number = 20;//函数的 B 常量
for each(var i:Obstacle in obstaclesList) {
vo.reset(i);//vo = (i.x, i.y)
r.sub(vp, vo);//r = vp - vo
if(r.length >40) {//当 距离>40 时不判断,直接返回。
continue;
}
u.reset(r);//u = r
u.normalize();//把 u 设为单位向量
var d:Number = r.length/i.r;//d = |r| / i.r (i.r为障碍物的半径)
var U:Number = B/Math.pow(d,2.5);//A = 0,n = 1,m = 2.5
u.scaleTo(U);//u *= U
dv.add(player.v, u);//dv = player.v + u (player.v为人物的速度)
dv.length = 5//|dv| = 5
player.v.reset(dv);//player.v = dv
}

源码下载:AI_Avoid.rar

参考文献:AI for Game Developers

[AI for Game Developers]

2007-12-19

[AIR]Adobe AIR 1.0 Beta 3 的变更详情

执行环境

AIR 支持的 OS 有:

  • Windows Vista Home、Ultimate Edition, Windows XP SP2
  • Windows 2000 SP4 (不支持无缝安装)
  • Mac OS 10.5 Leopard 、 Mac OS 10.4.x Tiger (Intel 与 PowerPC)

AIR 1.0 Beta 1 的执行环境将会在 2007-12-15 开始无法使用。AIR 1.0 Beta 1 用的程序应该及时升级为 AIR 1.0 Beta 3。AIR 1.0 Beta 3 预定为发布正式版前的最后一个测试版,今后应该不会有较大的改变。还有,AIR 1.0 Beta 2 将会在 2008-6-1,AIR 1.0 Beta 3 将会在 2008-11-1 过期。在那以前,AIR 1.0 Beta 2 可以与 AIR 1.0 Beta 3 一起使用,但须先安装 AIR 1.0 Beta 2。

AIR 1.0 Beta 1 的卸载在 Windows 里可以使用"添加/删除",Mac 可以使用程序路径里的"AdobeAIR Unistaller"。注意,删除 AIR 1.0 Beta 3 时,以前的版本将会一起被卸载。

无缝安装的改变

无缝安装即为从浏览器里安装。安装 AIR 1.0 Beta 3 后,AIR 1.0 Beta 2 的无缝安装将会失效。要想继续使用无缝安装,需要使用 AIR 1.0 Beta 3 SDK 里的 AIR 1.0Badge.as 来设置。设置需要 Flash CS3,并且要执行 AIR 1.0 Beta 3 的无缝安装需要 Flash Player 9.0.115.0。

程序描述文件的改变

  • xmlns 变为 "http://ns.adobe.com/air/application/1.0.M6"
  • <title> 标签变为 <name> 标签。
  • <name> 标签变为 <filename> 标签。
  • <handleUpdates> 标签变为 <customUpdateUI> 标签。
  • appId 属性从 <application> 标签的属性变为 <id> 标签。
  • version 属性从 <application>标签的属性变为<version> 标签。
  • <application> 标签添加了 <allowBrowserInvocation> 子标签。
  • <fileType> 标签添加了 <icon> 子标签。

数据库的改变

SQL 的 BLOG 类型将会自动序列化为 ActionScript 3.0 的 ByteArray 类型。在以前的版本里,明确使用了 ByteArray 的需要做处理。

并且,ISQLUserDefinedFunctionSQLUserDefinedFunctionType 将不再支持,应该马上停止使用。

2007-12-16

郁闷!自己 ping 自己不通

实在是郁闷,今天我 ping 自己的 IP,却 ping 不通。

不知道怎么的,上网没事,ping 路由器也没事,ping localhost 还是没事,但 ping 192.168.x.x(自己的 IP)却弹出 "Request timed out."。我关掉了防火墙,但还是不行。使用 IPBook 可以查看到自己的 IP,但使用 Wireshark 进行抓包时,不管从哪一台机器来 ping,都没有任何相关的信息。

请为大家,这是为什么?该怎么解决?

[Flash Player]Flash Player 9.0.115.0 的安全策略的变化

前几天公开的 Flash Player 9.0.115.0 的安全策略发生了一些变化,有可能导致安装了新的 Player 后无法正确显示某些内容。

这次变更主要有以下3点:

安全策略文件的格式

如果安全策略文件的格式不是正确的 XML,将会被忽视。比如顶级标签必须为 <cross-domain-policy>

Adobe 已经公开了每个协议的安全策略文件的正确的格式,详细请查看以下的 xsd(XML Schema) 文件。

Flash Player 9.0.115.0 的 Debug 版添加了安全策略文件的历史记录功能,如果有问题可以查看历史记录。

在域名内的重定向

在请求安全策略文件时,如果发生了在域名内的重定向,Flash Player 9.0.115.0 将对重定向后的 URL 使用安全策略。

比如请求 http://example.com/foo/crossdomain.xml 时,如果重定向为 http://example.com/bar/crossdomain.xml,读入的安全策略文件将会对 http://example.com/bar/ 以下的 URL 生效。

这个信息也会写到历史文件里。

Content-type 的值

Flash Player 9.0.115.0 以后,读入的安全策略文件如果不包含以下任意的值的话,将会被忽视。

  • text/*
  • application/xml
  • application/xhtml+xml

这样多少可以保证安全策略文件为文字文件。

Socket的连接

从 Flash Player 9.0.115.0 开始,不管是否在同一个域名,ActionScript 连接Socket 时都必须使用安全策略文件。

但实际上 Flash Player 9.0.115.0 在大多数的情况下只是弹出警告,是可以连接的。但连接本地服务器等时必须按照新的规则来制定安全策略文件。

历史文件

首先需要安装新的 Debug 版的 Player。(下载:Flash Player Support Center

再编辑 mm.cfg 文件(在用户的根目录,如果没有,就创建一个),追加一下2句。

PolicyFileLog=1   # 启用安全策略文件的历史记录
PolicyFileLogAppend=1  # 是否为追加模式,默认为0即不(可要可不要)

启动 Flash Player 9.0.115.0 后将会在以下的地方做成叫 policyfiles.txt 的历史文件。

  • Windows --------- C:\Documents and Settings\username\Application Data\Macromedia\Flash Player\Logs
  • Windows Vista -- C:\Users\username\AppData\Roaming\Macromedia\Flash Player\Logs
  • Macintosh -------- /Users/username/Library/Preferences/Macromedia/Flash Player/Logs
  • Linux -------------- /home/username/.macromedia/Flash_Player/Logs

关于本次变更的详细情况可以参照Security changes in Flash Player 9(e文)

2007-12-15

Adobe BlazeDS 详情

BlazeDS 为 Adobe 的一个新的关于远程(Remoting)与网络信息系统(Web Messaging,类似于 JMS)的开源项目。BlazeDS 是以前的 LCDS ES 的一部分变为开源的。它是基于 LGPL v3 协议发布的。并且同时公开了 AMF(Action Message Format)的格式。

现在从 Adobe Labs 可以下载 BlazeDS 的 Beta 版(BlazeDS@Labs)。Adobe 将会把 BlazeDS 加进 LiveCycle Data Services, Community Edition 里。以前的 LCDS ES 还将继续贩卖。

BlazeDS的主要功能为:

远程(remoting)

它使用 Java 实现了 RPC(Remote procedure call)。并且不写逻辑也可以简单地转换数据格式,还可以利用2进制的 AMF 来减少通讯量,改善性能。

网络信息系统(Web Messaging)

它可以使 Flex 、Ajax 程序等向服务器发送信息,客服端也可以收到从服务器发出的信息,以实现双向通讯。

注意,BlazeDS 的网络信息系统是使用 Comet 方式的持久的 HTTP 连接来实现的。一个CPU大概可以同时处理100~200个连接(与一般的 servlet 差不多)。但 LCDS ES 提供了一个CPU可以处理数千个连接的功能,对于高负荷的环境需要使用 ES 版。RTMP 协议也只有 LCDS ES 支持。

2007-12-09

[AIR]AIR 1.0 = 危险?

今天看了 AIR Security Model(J文),发现 AIR 很危险,比如:

访问系统
AIR可以任意地访问系统。也就是说 AIR等于桌面程序。而 JavaApplet、Google Gear 却为 受限制的访问,这样必究安全。
AIR 1.0 没有提供的
 
AIR 1.0 没有提供安全运行不信任的程序的功能,防止开发者制作安全漏洞的功能,保障绝对安全的沙箱。
安全沙箱不安全
在 AIR 1.0 的两个沙箱(Application 与 Classic)之间有一个桥梁(SandboxBridge),如果被恶用,Classic 沙箱就可以拥有 Application沙箱的功能。(关于沙箱请看这里 [AIR]Adobe AIR Beta 2的安全方面的变化)

因此,AIR 1.0 有可能与桌面程序同样危险!但注意,这指的是 AIR 1.0,不是AIR 1.x。