flash 3d flash3d 研究所 pv3d 共享资源  | 经典范例  | 视频教程  | 友情链接  | 联系我们
登陆 | 注册  flash 3d 研究所
讨论区





最近更新:
● 无语瓶阁下在教程区里 回复“《超简易papervision3D基础 ...”(18:09:44)
● payday loan阁下在教程区里 回复“《pv3d, sandy, away3d...”(05:56:23)
● bad credit payday loan阁下在教程区里 回复“《超简易papervision3D基础 ...”(05:56:13)
浏览主题:求救,关于BitmapFileMaterial,load的问题

求救,关于BitmapFileMaterial,load的问题
yzhkof (2008-12-23 22:35:11)

public class EventTest extends Sprite
     {
           public function EventTest()
           {
                 stage.addEventListener(MouseEvent.CLICK,tt);
                 
           }
           private function tt(e:Event):void{
                 
                 var material:BitmapFileMaterial=new BitmapFileMaterial("chessboard.gif",true);
                 material.addEventListener(FileLoadEvent.LOAD_COMPLETE,function(e:FileLoadEvent):void{
                 
                 trace("ok");
                 })
           
           }
     }
---------------------------------------------------------------------
public class EventTest extends Sprite
     {
           public function EventTest()
           {
                 stage.addEventListener(MouseEvent.CLICK,tt);
                 
           }
           private function tt(e:Event):void{
                 
                 var material:Loader=new Loader();
                 material.load(new URLRequest("chessboard.gif"))
                 material.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event):void{
                       
                 trace("ok");
                 
                 })
           
           }
     }
---------------------------------------------------------------------
第一段是用pv3d的load,第二段程序是用系统的loader。。。。

问题来了。。。。第一段只在第一次点击鼠标时有trace出ok........

第二段无论点多少次都能trace出ok

请问这是什么问题?


flash 3d 研究所 DDM君
(2008-12-23 22:44:53)
pv3d的贴图只会被读取一次,而且不用测试是否被读取。
loader每次都在建立新的读取

flash 3d 研究所 fur3
(2008-12-24 00:31:11)
其实我也一直不大清楚这个问题,难道BitmapFileMaterial或mterial3d是一单件类?还是createBitmapFromURL个方法只允许载入一次位图?

flash 3d 研究所 DDM君
(2008-12-24 10:33:38)
当然不可能是单件又不是鼠标=____=,只是它只depatch一次COMPLETE EVENT而已。

flash 3d 研究所 yzhkof
(2008-12-24 10:34:38)
但问题是我在handler里接收不到第二次之后的事件,我很多初始化的代码都写在了那里面,也就是一个包含了3d界面的componet第一次new 出来可以被显示,remove之后再new 出来就无法显示了,因为接收不到loadcomplete的事件,而事实上在pv源码中不管material第几次load,它都会抛出FileLoadEvent.LOAD_COMPLETE事件,所以我第一段程序的效果应该是无论按几次鼠标都能trace出ok来的,DDM君你可以到BitmapFileMaterial的源码里去看一下。。。。方法名就叫作loadComplete

当一个BitmapFileMaterial被初始化的时候就会执行createBitmapFromURL方法,但这个createBitmapFromURL方法,除非路径名为空,否则不管什么情况(不管贴图有没有load过),最后都会执行到loadComplete方法。但我在外面确接收不到第二次之后的事件,我就奇怪了。

flash 3d 研究所 水明
(2008-12-24 10:50:46)
感觉是不是material.addEventListener这句话放置的地方太晚了,因为设置listener的时候已经load完毕了,第一次可以出现trace是不是因为第一次load比较慢,后面几次可能作了优化……
对action script不熟,纯属猜测~~

flash 3d 研究所 yzhkof
(2008-12-24 10:56:04)
想想确实像水明君说的那样。。。。。

BitmapFileMaterial在构造的时候已经判断是否已经load过贴图了,所以在 var material:BitmapFileMaterial=new BitmapFileMaterial("chessboard.gif",true);
这句它已经抛出事件了,所以到下一句addListener之后就接收不到了。

呵呵,烦了我一个晚上,一下就被你想到了。

flash 3d 研究所 yzhkof
(2008-12-24 11:11:18)
但这个问题要如何解决呢?。。。。我想让它事件抛出的时间稍微晚点

flash 3d 研究所 水明
(2008-12-24 11:11:26)
厚厚~~能帮上忙就好。
其实我觉得可以为整个类BitmapFileMaterial绑定一个处理函数,而不是为每一个实例都绑定一个啦,这样只需要在外面写一次addEventListener就可以了,只执行一遍。在处理函数里面再用this指针进行各个实例的操作就好了。不知道这样做可以不?

flash 3d 研究所 DDM君
(2008-12-24 11:24:28)
谢谢水明君
yzhkof君试一试同时加两个listener呢:
addEventListener(FileLoadEvent.LOAD_COMPLETE,方法);
addEventListener(FileLoadEvent.LOAD_COMPLETE,方法,true);

看看有没有什么变化?


flash 3d 研究所 水明
(2008-12-24 11:30:05)
刚才看了下BitmapFileMaterial的文档,你看看这个属性能不能帮上你:
callback : Function
[static] Function to call when the last image has loaded.

flash 3d 研究所 yzhkof
(2008-12-24 11:31:09)
DDM君你说的方法不行啊。。。

我已经确定了水明君的说法了,确实事件的抛出时间是早于设置listener

flash 3d 研究所 DDM君
(2008-12-24 11:33:25)
根据你们的思路,又看了一遍代码,bitmapfilematerial里控制延迟的应该是这个timer
protected function setupAsyncLoadCompleteCallback() : void
{
var timer : Timer = new Timer(1,1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, dispatchAsyncLoadCompleteEvent);
timer.start();
           

flash 3d 研究所 yzhkof
(2008-12-24 12:03:14)
呵呵,刚才吃饭去了,先试试你们说的方法看看

flash 3d 研究所 yzhkof
(2008-12-24 12:13:27)
哈哈,用timer的方法解决了!!

3Q你们了

flash 3d 研究所 DDM君
(2008-12-24 12:15:53)
呵呵 解决了就好 很高兴看到这样的讨论 感谢yzhkof和水明君^_^
一起加油!

flash 3d 研究所 yzhkof
(2008-12-24 12:17:11)
不过问题是改了PV的源码。。。不知道会不会造成一些负面的影响。。。。T_T

flash 3d 研究所 DDM君
(2008-12-24 13:18:43)
嗯 是有问题 比如说我们出了新的傻瓜包 那么可能就会被变更回去。
可以自己写一个类,比如bitmapFileMaterial2,继承bitmapfilematerial,构造方法里面super(参数1,2...) 然后override这个类,就不会改变源码了,以后声明的时候记着用new bitmapFileMaterial2
替换其他包也不会有问题。

flash 3d 研究所 水明
(2008-12-24 15:22:15)
ddm kun给出的方法莫非是修改timer的执行时间?那应该改到多少合适呢?因为你也不能确定下条语句需要占用多少时间啊?
所以我看源码啊看源码,发现一个方法,把函数tt改成这样应该就可以了:(我手头没编译环境,不保证编译正确……)
private function tt(e:Event):void{
   
    var material:BitmapFileMaterial=new BitmapFileMaterial("",true);
    material.addEventListener(FileLoadEvent.LOAD_COMPLETE,function(e:FileLoadEvent):void{
   
    trace("ok");
    })
material.url = "chessboard.gif";
material.texture = "chessboard.gif"; //不知道这句能不能通过
 
  }

因为load的实际操作是在set texture的时候做的,所以可以保证load之前就set好了EventListener

flash 3d 研究所 DDM君
(2008-12-24 15:55:03)
感觉是很有道理的,水明君真是一有创意的好青年~晚上回去试试^_^

flash 3d 研究所 yzhkof
(2008-12-24 15:55:44)
我想水明你说的方法应该是没问题的,但我程序里已经有太多地方用到这个BitmapFileMaterial了。。。

每个用到的地方都要加句
material.url = "chessboard.gif";
material.texture = "chessboard.gif";
就不太好找了

用timer确实也很难把握时间,不是解决问题的根本,哈= =

flash 3d 研究所 DDM君
(2008-12-24 16:31:25)
timer随便留个1秒,半秒的应该能解决所有情况。不过说实话具体是要达成什么目的呢,非要用这个方法吗

flash 3d 研究所 yzhkof
(2008-12-24 17:21:44)
要达成的目的其实很简单,就像一个游戏大厅,你进去一个游戏,然后退出游戏,再进那个游戏。。。

就是在再进的时候遇到了问题。。。也就是第二次load已经load过的material的时候

flash 3d 研究所 DDM君
(2008-12-24 20:02:34)
既然明知道载入速度比半秒都还快了,还侦听什么呢?直接进入不就行了呢。

flash 3d 研究所 yzhkof
(2008-12-24 20:34:46)
嘛。。。这个要怎么说呢。。。。= =

第一次的速度就不一定了。。。

flash 3d 研究所 山紫水明
(2008-12-24 20:40:25)
以后可以为BitmapFileMaterial的构造函数扩展一个参数,在构造函数里可以分配处理函数。
不过我觉得最好的还是弄个static方法用来作为各种消息的回调啦,然后我们只要实现这个static方法就可以了,就像之前我说的那样,为整个类做一个消息处理函数。

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了