PV3D加载图片时的事件触发
2009-01-19 09:50
197 查看
最近学习利用PV3D做了一个3d模型的flash,依次加载外域图片,用作bitmapFileMaterials的资源。但是由于外域网站图片路径有时会产生错误,PV3D 1.5的source在判断图片加载错误的时候,就不会再加载后面的图片,那么flash在运行的时候稳定性会很差。本来打算用PV3d 2.0解决这个问题(PV3D 2.0 有自带的事件触发函数),但是因为2.0在建模的方法上面和1.5有蛮大的差别,于是自己动手在原代码里加了触发事件的代码,并在捕捉到错误事件的同时不影响下面图片的加载,保证了flash的稳定。
修改源代码如下:
1.首先在FileLoadEvent.as文件中要加上错误事件的描述:
public static var LOAD_COMPLETE :String = "loadComplete";
public static var COLLADA_MATERIALS_DONE:String = "colladaMaterialsDone";
public static var LOAD_IOERROR:String = "loadIOError";//在原有的事件描述后添加加载错误事件
2.在bitmapFileMaterials.as文件里,在loadNextBitmap函数里添加错误事件的listener:
private function loadNextBitmap():void
{
// Retrieve next filename in queue
var file:String = _waitingBitmaps[0];
currentUrl=file;
var request:URLRequest = new URLRequest( file );
var bitmapLoader:Loader = new Loader();
bitmapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadBitmapCompleteHandler );
try
{
// Load bitmap
bitmapLoader.load( request );
//add EventListener
bitmapLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loadBitmapErrorHandler);
// Save original url
_loaderUrls[ bitmapLoader ] = file;
// Busy loading
_loadingIdle = false;
Papervision3D.log( "BitmapFileMaterial: Loading bitmap from " + file );
}
catch( error:Error )
{
// Remove from queue
_waitingBitmaps.shift();
// Loading finished
_loadingIdle = true;
Papervision3D.log( "[ERROR] BitmapFileMaterial: Unable to load file " + error.message );
}
}
3.添加错误事件触发后执行的函数如下:
private function loadBitmapErrorHandler( e:IOErrorEvent ):void
{
for each(var material:BitmapFileMaterial in _subscribedMaterials[ currentUrl ])
{
material.loadError(currentUrl);//该函数需要在文件中添加
}
// Include in library
_loadedBitmaps[ url ] = bitmap;
// Remove from queue
_waitingBitmaps.shift();
// Queue finished?
if( _waitingBitmaps.length > 0 )
{
// Continue loading
loadNextBitmap();
}
else
{
// Loading finished
_loadingIdle = true;
if( Boolean( callback ) ) callback();
}
}
4.添加函数loadError将事件dispatcher:
private function loadError(http://www.cnblogs.com/wonderfulgloria/admin/String):void{
// Dispatch event
var fileEvent:FileLoadEvent = new FileLoadEvent( FileLoadEvent.LOAD_IOERROR, url);
this.dispatchEvent( fileEvent );
}
附图是我用更改过的PV3D1.5编写的3d flash的截图:
修改源代码如下:
1.首先在FileLoadEvent.as文件中要加上错误事件的描述:
public static var LOAD_COMPLETE :String = "loadComplete";
public static var COLLADA_MATERIALS_DONE:String = "colladaMaterialsDone";
public static var LOAD_IOERROR:String = "loadIOError";//在原有的事件描述后添加加载错误事件
2.在bitmapFileMaterials.as文件里,在loadNextBitmap函数里添加错误事件的listener:
private function loadNextBitmap():void
{
// Retrieve next filename in queue
var file:String = _waitingBitmaps[0];
currentUrl=file;
var request:URLRequest = new URLRequest( file );
var bitmapLoader:Loader = new Loader();
bitmapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadBitmapCompleteHandler );
try
{
// Load bitmap
bitmapLoader.load( request );
//add EventListener
bitmapLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loadBitmapErrorHandler);
// Save original url
_loaderUrls[ bitmapLoader ] = file;
// Busy loading
_loadingIdle = false;
Papervision3D.log( "BitmapFileMaterial: Loading bitmap from " + file );
}
catch( error:Error )
{
// Remove from queue
_waitingBitmaps.shift();
// Loading finished
_loadingIdle = true;
Papervision3D.log( "[ERROR] BitmapFileMaterial: Unable to load file " + error.message );
}
}
3.添加错误事件触发后执行的函数如下:
private function loadBitmapErrorHandler( e:IOErrorEvent ):void
{
for each(var material:BitmapFileMaterial in _subscribedMaterials[ currentUrl ])
{
material.loadError(currentUrl);//该函数需要在文件中添加
}
// Include in library
_loadedBitmaps[ url ] = bitmap;
// Remove from queue
_waitingBitmaps.shift();
// Queue finished?
if( _waitingBitmaps.length > 0 )
{
// Continue loading
loadNextBitmap();
}
else
{
// Loading finished
_loadingIdle = true;
if( Boolean( callback ) ) callback();
}
}
4.添加函数loadError将事件dispatcher:
private function loadError(http://www.cnblogs.com/wonderfulgloria/admin/String):void{
// Dispatch event
var fileEvent:FileLoadEvent = new FileLoadEvent( FileLoadEvent.LOAD_IOERROR, url);
this.dispatchEvent( fileEvent );
}
附图是我用更改过的PV3D1.5编写的3d flash的截图:
![](http://space.flash8.net/space/attachments/2009/01/03/837118_200901032311481OG0k.jpg)
相关文章推荐
- My97DatePicker事件无效,触发事件calendar.js,datepicker.css等文件无法加载
- 新闻客户端首页图片无限循环滚动展示(可点击触发不同事件)初步封装IOS
- Flex中加载多个Module之间的事件监听和触发
- jQuery-iframe加载完成后触发的事件监听
- 上传文件或图片 type=file change事件只触发一次
- 用jQuery的ajax加载的内容无法触发单击事件
- 页面(Page)加载用户控件(UserControl)的事件触发顺序
- HTML5异步上传图片(支持预览和进度条),使用其他按钮触发file onclick事件,解决某些浏览器无法触发的问题
- 加载默认图片,如何避免img标签陷入onerror事件死循环
- 用onerror事件捕获图片显示(加载)异常,并用默认图片替换
- js图片预加载---for与onload事件,图片数据模型到界面的单项绑定,使用interval模拟循环操作
- JS 页面加载触发事件 document.ready和window.onload的区别
- 用src属性动态替换图片;图片预加载---鼠标事件实现图片翻转效果;随机显示图片和onClick事件
- Silverlight关于容器与子控件的加载与事件触发
- 在iframe获取父窗口dom对象,iframe加载完毕后触发事件,父页面调用iframe方法
- js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)
- WPF 鼠标移动到图片变大,移开还原,单击触发事件效果
- IFRAME动态加载触发onload事件(转)
- 图片onerror事件,为图片加载指定默认图片
- js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)