![]() |
DDM君 (2008-12-23 22:44:53) |
pv3d的贴图只会被读取一次,而且不用测试是否被读取。 loader每次都在建立新的读取 |
![]() |
fur3 (2008-12-24 00:31:11) |
其实我也一直不大清楚这个问题,难道BitmapFileMaterial或mterial3d是一单件类?还是createBitmapFromURL个方法只允许载入一次位图? |
![]() |
DDM君 (2008-12-24 10:33:38) |
当然不可能是单件又不是鼠标=____=,只是它只depatch一次COMPLETE EVENT而已。 |
![]() |
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方法。但我在外面确接收不到第二次之后的事件,我就奇怪了。 |
![]() |
水明 (2008-12-24 10:50:46) |
感觉是不是material.addEventListener这句话放置的地方太晚了,因为设置listener的时候已经load完毕了,第一次可以出现trace是不是因为第一次load比较慢,后面几次可能作了优化…… 对action script不熟,纯属猜测~~ |
![]() |
yzhkof (2008-12-24 10:56:04) |
想想确实像水明君说的那样。。。。。 BitmapFileMaterial在构造的时候已经判断是否已经load过贴图了,所以在 var material:BitmapFileMaterial=new BitmapFileMaterial("chessboard.gif",true); 这句它已经抛出事件了,所以到下一句addListener之后就接收不到了。 呵呵,烦了我一个晚上,一下就被你想到了。 |
![]() |
yzhkof (2008-12-24 11:11:18) |
但这个问题要如何解决呢?。。。。我想让它事件抛出的时间稍微晚点 |
![]() |
水明 (2008-12-24 11:11:26) |
厚厚~~能帮上忙就好。 其实我觉得可以为整个类BitmapFileMaterial绑定一个处理函数,而不是为每一个实例都绑定一个啦,这样只需要在外面写一次addEventListener就可以了,只执行一遍。在处理函数里面再用this指针进行各个实例的操作就好了。不知道这样做可以不? |
![]() |
DDM君 (2008-12-24 11:24:28) |
谢谢水明君 yzhkof君试一试同时加两个listener呢: addEventListener(FileLoadEvent.LOAD_COMPLETE,方法); addEventListener(FileLoadEvent.LOAD_COMPLETE,方法,true); 看看有没有什么变化? |
![]() |
水明 (2008-12-24 11:30:05) |
刚才看了下BitmapFileMaterial的文档,你看看这个属性能不能帮上你: callback : Function [static] Function to call when the last image has loaded. |
![]() |
yzhkof (2008-12-24 11:31:09) |
DDM君你说的方法不行啊。。。 我已经确定了水明君的说法了,确实事件的抛出时间是早于设置listener |
![]() |
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(); |
![]() |
yzhkof (2008-12-24 12:03:14) |
呵呵,刚才吃饭去了,先试试你们说的方法看看 |
![]() |
yzhkof (2008-12-24 12:13:27) |
哈哈,用timer的方法解决了!! 3Q你们了 |
![]() |
DDM君 (2008-12-24 12:15:53) |
呵呵 解决了就好 很高兴看到这样的讨论 感谢yzhkof和水明君^_^ 一起加油! |
![]() |
yzhkof (2008-12-24 12:17:11) |
不过问题是改了PV的源码。。。不知道会不会造成一些负面的影响。。。。T_T |
![]() |
DDM君 (2008-12-24 13:18:43) |
嗯 是有问题 比如说我们出了新的傻瓜包 那么可能就会被变更回去。 可以自己写一个类,比如bitmapFileMaterial2,继承bitmapfilematerial,构造方法里面super(参数1,2...) 然后override这个类,就不会改变源码了,以后声明的时候记着用new bitmapFileMaterial2 替换其他包也不会有问题。 |
![]() |
水明 (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 |
![]() |
DDM君 (2008-12-24 15:55:03) |
感觉是很有道理的,水明君真是一有创意的好青年~晚上回去试试^_^ |
![]() |
yzhkof (2008-12-24 15:55:44) |
我想水明你说的方法应该是没问题的,但我程序里已经有太多地方用到这个BitmapFileMaterial了。。。 每个用到的地方都要加句 material.url = "chessboard.gif"; material.texture = "chessboard.gif"; 就不太好找了 用timer确实也很难把握时间,不是解决问题的根本,哈= = |
![]() |
DDM君 (2008-12-24 16:31:25) |
timer随便留个1秒,半秒的应该能解决所有情况。不过说实话具体是要达成什么目的呢,非要用这个方法吗 |
![]() |
yzhkof (2008-12-24 17:21:44) |
要达成的目的其实很简单,就像一个游戏大厅,你进去一个游戏,然后退出游戏,再进那个游戏。。。 就是在再进的时候遇到了问题。。。也就是第二次load已经load过的material的时候 |
![]() |
DDM君 (2008-12-24 20:02:34) |
既然明知道载入速度比半秒都还快了,还侦听什么呢?直接进入不就行了呢。 |
![]() |
yzhkof (2008-12-24 20:34:46) |
嘛。。。这个要怎么说呢。。。。= = 第一次的速度就不一定了。。。 |
![]() |
山紫水明 (2008-12-24 20:40:25) |
以后可以为BitmapFileMaterial的构造函数扩展一个参数,在构造函数里可以分配处理函数。 不过我觉得最好的还是弄个static方法用来作为各种消息的回调啦,然后我们只要实现这个static方法就可以了,就像之前我说的那样,为整个类做一个消息处理函数。 |
|
|