flare 3D之加载模型资源见解
首先说说在flare 3D中加载模型资源的一些方法:
-
通过3d场景对象的url进行加载:
myScene3D.addChildFromFile("saidao.f3d");
并且这个方法返回相应的3D模型(Pivot3D)对象,后面可以得到这个返回的3D模型对象进行操作。
-
首先加载然后生成Pivot3D对象,然后通过游戏的场景对象进行加入这个3D模型对象:
Var 3D:Pivot=new Pivot3D(文件资源url);
myScene.addChild(3D);
但是经过测试这个方法怎么就不能把3D模型放入到myScene场景中。可能哪里有问题,有待研究,但这是一个方法。
-
然后呢,在网上搜了下,竟然还有另外还有以下几种方式,而且搜了好几个,它们又惊人的相似,看来真是一大抄呀,所以我也借鉴学习下它们的所讲的东西。然后去测试了下,果然还行。
(1)、利用flare3DLoader类加载:
Var loader:Flare3DLoader=new Flare3DLoader(文件资源url);
loader.load();
MyScene3D.addChild(loader);
(2)使用嵌入(Embed)资源的方式来进行加载:
首先通过Embed声明
[Embed(source=”文件url”),mimeType=”application/octet-stream”]
Public var 3D:Class;
然后使用Scene3D场景对象或者Flare3DLoader来进行加载
myScene.addChildFromFile(new3D());
Var loader:Flare3DLoader=new Flare3DLoader(new 3D());
loader.load();
MyScene3D.addChild(loader);
额.......貌似和之前没有什么区别嘛,只是把那个路径内嵌了而已。
然后说完使用的方法加载后,然后就是要注意的就是当初次使用以上这些方法加载这些模型f3d资源时,会统一触发一次Scene3D.COMPLETE_EVENT事件,表示scene已经构建好了。然后就得等着系统把这些资源加载完,然后如果有新的资源加入时才会触发Scene3D.COMPLETE_EVENT事件,如果是加载之前加载过得文件则不会触发Scene3D.COMPLETE_EVENT。
所以在一个游戏生成过程中,如果要生成一个类的两个对象,而且这个类中会加载相应的f3d文件,那么第一次生成对象时相应的资源就需要进行加载,然后我们可以通过Scene3D.COMPLETE_EVENT事件等待着资源的加载完成然后进行事件处理,但是如果你还想继续生成这个类的对象,那么这些资源就不会被加载,那么就没有文件加载完成这个事件即Scene3D.COMPLETE_EVENT事件。
今天的解决方案就是,在每个需要相应资源的类中定义好一个静态属性如flag并且默认设置为false,即还没有被加载,然后一旦有谁实例化这个类(伴随着资源加载),那么就把这个静态属性设置为true,即加载了,然后加一个判断,如果flag==false就添加Scene3D.COMPLETE_EVENT事件,flag==true那么就不用调用这个事件了,代码如下:
if(!flag){
myScene.addEventListener(Scene3D.COMPLETE_EVENT,complete_01);
}else{
this.complete_01(null);
}
然后呢,又在网上发现说还有种用loader的属性来判断的方法,如下:
loader = newFlare3DLoader("eko.f3d");
loader.load();
scene.addEventListener(Scene3D.UPDATE_EVENT, updateEvent );
private function updateEvent(e:Event):void
{
if(loader.loaded == 1) {
}
}
它即用到了loader对象中的loaded属性来判断。
而且我还发现,首次加载的资源生成的3D对象加入到Scene3D场景中后,如果你后面使用过程中对它的属性进行改变,然后你再利用这些资源资源生成3D对象加入相同的Scene3D场景后,如果你不恢复它初始的属性的话,它的属性会是你后面修改过的属性。所以每次再要生成时需要重置它的属性。