电介质 发布于
2009年05月14日 星期四
对于习惯于中学数学坐标系的AS3编程者来说,flash的坐标系总是个令人头疼的问题,player10带来的第三轴z,更把事情搅和的让人头晕,前两天把它整理了一下,绘了图示如下,箭头方向都为正向,包括旋转方向。
仔细思考可以发现旋转方向,适用于右手法则,既大拇指代表要旋转的坐标轴方向,四个手指代表旋转的正向,这个图也适合于每个显示对象和显示容器自身的坐标系统。
对于角度还有一个要人头疼的问题,就是零度是从哪里开始的,同样绘了一张图如下。
可以看到在不同的平面中,零度的起始坐标轴是不同的,xy轴平面,是x轴,yz平面是y轴,zx平面是z轴,可谓风水轮流转明年到我家,每个轴都是平等的,都有做起点的机会。
电介质 发布于
2009年04月08日 星期三
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;
这样你可以为不同的显示对象设置不同的透视投影设置。
电介质 发布于
2009年03月20日 星期五
AIR1.5.1已经出来有些时间了,这里有一篇新特性的介绍。
关于使用InvokeEvent.reason大概意思如下:
Adobe AIR应用程序已经可以确定是如何被调用的,通过监听被NativeApplication发布的InvokeEvent 事件,InvokeEvent 事件类包含了一个新的属性reason,此属性指示:应用程序是由用户手动启动,还是在登录时自动启动。这样应用程序就可以在启动时判断是否显示界面窗口,比如在系统登录时自动启动时不打开窗口,而用户自己启动时打开窗口。
当然要使用这个新的API,需要更新应用程序的描述文件为1.5.1的命名空间。
电介质 发布于
2009年03月01日 星期天
最近在做的一个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();
预载处理代码;
预载完成后可以进行库类的实例化操作,或调用应用的初始化方法;
}
其他方法定义;
}
}
电介质 发布于
2009年01月18日 星期天
今天收到朋友nick的一个mail,就AIR 的尝试这篇文章中提到的一些AIR开发应用中存在的问题,问道“占用内存的问题,不知道是他开发的问题,还是air的通病?”回复mail后感觉这是个常见的疑问,所以把回复整理了一下发上来与同道探讨分享。
1、关于AIR应用占用内存的问题
就realazy开发的这个爱饭Adobe AIR应用,他是用HTML,CSS和javascript方式开发的,这种方式是基于air内嵌的webkit 引擎的(谷歌浏览器和苹果上web浏览器使用的web引擎),所以即使什么都不做,用这种方式开发就相当于打开了一个基于webkit引擎的web浏览器;
另外即使使用Flash AS方式和Flex方式开发,只要在应用中使用了html特性的功能就一样相当于打开了webkit浏览器。
2、三种Adobe AIR应用开发方式中,对内存资源消耗的大小顺序
由小到大的顺序是:单纯使用flash AS3开发(不使用html特性)<单纯使用FLex开发(不使用html特性)<使用html特性的开发:有三种情况HTML+CSS+JAVASCRIPT方式,使用flash as3和flex开发方式中包括html特性的开发)
Flex开发方式中因为使用Flex的框架极大的提高了开发效率和开发的协作性,但Flex框架中的各类组件本身却也事实上使编译结果文件更大,占用计算机的资源也更多,所以这种方式比单纯用flash AS3方式开发要消耗过更多的系统资源。
3、Adobe AIR跨平台开发的透明性
Adobe AIR程序可以跨平台运行的特性,是其优势之一,目前Adobe AIR1.5已经能支持Mac、windows上,和linux环境。
对于开发者来说,跨平台开发的代码透明是最理想的了,但是由于操作系统的管理方式的差异,要做到完全透明是不易的甚至有时是不可能的,具体参看关于Adobe AIR跨平台的透明开发问题。
就realazy开发的这个爱饭Adobe AIR应用在linux下无法给窗口加阴影的问题,那不是Adobe AIR的问题,而是linux显示模式的问题,具体可以看我的这篇文章关于Adobe AIR 1.1 for Linux beta;只要在Adobe AIR应用开发中做些平台能力判断,做差异性处理就可以是Adobe AIR应用的跨平台开发更完美些了。