flash10中3D特性之PerspectiveProjection属性设置
PerspectiveProjection类提供了一种在 3D 空间中移动显示对象时应用基本透视的简单方式,它有下列三个主要属性:
fieldOfView 视野属性
projectionCenter 投影中心属性
focalLength 焦距属性
默认的 PerspectiveProjection 对象是基于视野和舞台的高宽比(尺寸)为 root 对象的透视转换定义的框架。要改变透视投影设置,可以通过对root 对象的DisplayObject.transform 属性来更改。但在编程时要改变这些属性,在文档类的构造函数中直接设置是不起作用的,因为这时swf文件还没有完全载入,也就是root显示对象还未完全载入完成,所以要通过this.loaderInfo.addEventListener (Event.COMPLETE, init)方式监听载入完成事件,在swf载入完成后按如下方式来设置:
this.transform.perspectiveProjection.projectionCenter = new Point(0,0);
注:类似的与根显示对象相关的部分其他基本属性的获取和修改都有这个问题需要注意。
要为其他显示对象设置这些透视属性,不能直接用类似上面的DisplayObject.transform.perspectiveProjection.projectionCenter = new Point(0,0)这种直接赋值方式,因为DisplayObject.transform.perspectiveProjection为空,包括root显示对象在内的其他显示对象的透视属性设置可以通过如下方式设置:
var p=new PerspectiveProjection();
p.projectionCenter = new Point(0,0);
p.fieldOfView=55;
DisplayObject.transform.perspectiveProjection=p;
这样你可以为不同的显示对象设置不同的透视投影设置。
关于AS3中预载问题的解决方案
最近在做的一个Flash web交互应用中,所有的交互操作都是由代码控制,元件都是动态的从库中加载到场景中实现的,整个flash场景只有一帧,所有代码都在外部.as文件中,时间轴上无一句代码,虽然最后生成的文件不是很大,但swf预载还是需要实现的,查看了网上关于AS3应用开发中的预载实现,发现大多都不是很完美,有些需要在时间轴的第一帧上加入预载代码,有些用flash隐藏的功能,动态的在第一帧加入代码,而库元件的问题,有些是把在第一帧导入去掉,而在第二帧中隐藏加入所有用到的库元件在场景中…
经过分析和测试,找到一种比较完美的解决方案:
1、将场景分成两帧
2、在发布设置里的flash的脚本设置中,设置类导出在第2帧
3、在文档类的构造函数中写预载代码,类似下例:
this.stop ();//在第一帧停止
loaderInfo.addEventListener (ProgressEvent.PROGRESS, loadProgress);
loaderInfo.addEventListener (Event.COMPLETE, loadComplete);
function loadProgress (event:ProgressEvent):void{
var percentLoaded:Number = event.bytesLoaded / event.bytesTotal;
trace("载入"+ percentLoaded*100 + "%");//可以显示载入进度操作
}
function loadComplete (event:Event):void{
loaderInfo.removeEventListener (ProgressEvent.PROGRESS,loadComplete);
gotoAndStop (2);//载入完成跳到第二帧停止
init ();//进行初始化
}
这样时间轴上不用写任何代码,包括stop()等,所有代码都在外部as文件中,而且由于库元件都在第2帧导入,所以第一帧很小。
注意事项:因为库元件都在第2帧导入,而文档类在第一帧就开始构造了,所以在预加载完成前,不要实例化库中的类,如 new 库元件类(),否则不能正确建立类实例;但可以声明库元件的类变量。
带预载入代码的完整的文档类文件结构如下:
package {
public class 类名 extends MovieClip{
类属性变量声明;//注意不要在这里实例化库中的类,但可以声明库类型的变量
public function 类名(){
stop();
预载处理代码;
预载完成后可以进行库类的实例化操作,或调用应用的初始化方法;
}
其他方法定义;
}
}
RTMFP搭配Adobe Stratus service实现p2p
Flash Player 10 和Adobe AIR 1.5 提供了一个叫RTMFP(Real-Time Media Flow Protocol)的新通信协议,能够方便的低成本的实现p2p能力。
要使用RTMFP的前提是,Flash Player端点必需要连接到一个具备RTMFP能力的服务器,这个服务器主要是用来做端点之间联系约会的中介,而不参与端点间的数据传输,具备这种能力的服务,Adobe Stratus service是一个,还有未来的新版本的FMS也可以。Stratus目前还在beta阶段,这里给了一个视频聊天演示,还有源代码下载,开发教程文章。
使用Adobe Stratus能够建立下列的应用:
- 一个视频聊天室
- 多用户游戏
- Voice Over IP
要使用Adobe Stratus Service还需要注册一个Stratus beta developer key。
另外需要flash player10支持,使用Flex SDK3.2或Flex Build3.02开发,API参考Flash Player10 API文档。
RTMFP是建立在UDP协议之上的实时通信协议,它不同于RTMP是建立在TCP协议之上的。RTMFP有如下特点:
1.它同时提供可靠的和不可靠的两种数据传输服务,当在端点之间传送数据时,它使用可靠的传输(如使用NetStream.send()),当在端点之间传送音频数据时,它使用不可靠传输。
2.RTMFP直接在端点之间传输多媒体信息,而不用象RTMP那样需要通过中心服务器的中转。
3.数据传输的优先级,音频优先级高于视频。
关于防火墙的穿越以及Stratus service等等问题,详见
