flare 3D之加载模型资源见解

来源:互联网 发布:只有程序员才懂的笑话 编辑:程序博客网 时间:2024/06/10 10:02


flare 3D之加载模型资源见解


首先说说在flare 3D中加载模型资源的一些方法:


  1. 通过3d场景对象的url进行加载:

    myScene3D.addChildFromFile("saidao.f3d");

    并且这个方法返回相应的3D模型(Pivot3D)对象,后面可以得到这个返回的3D模型对象进行操作。

  2. 首先加载然后生成Pivot3D对象,然后通过游戏的场景对象进行加入这个3D模型对象:

    Var 3D:Pivot=new Pivot3D(文件资源url);

       myScene.addChild(3D);

    但是经过测试这个方法怎么就不能把3D模型放入到myScene场景中。可能哪里有问题,有待研究,但这是一个方法。

  3. 然后呢,在网上搜了下,竟然还有另外还有以下几种方式,而且搜了好几个,它们又惊人的相似,看来真是一大抄呀,所以我也借鉴学习下它们的所讲的东西。然后去测试了下,果然还行。

    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 3DClass;

               然后使用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 );

                 privatefunction updateEvent(e:Event):void

                 {

                        if(loader.loaded == 1) {

                   

    }

          }

    它即用到了loader对象中的loaded属性来判断。

    而且我还发现,首次加载的资源生成的3D对象加入到Scene3D场景中后,如果你后面使用过程中对它的属性进行改变,然后你再利用这些资源资源生成3D对象加入相同的Scene3D场景后,如果你不恢复它初始的属性的话,它的属性会是你后面修改过的属性。所以每次再要生成时需要重置它的属性。




      1 0