您的位置:首页 > 其它

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的截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐