使用SharedObject缓存游戏框架到本地和版本更新的demo
2010-11-22 10:12
435 查看
源码
中有两个工程,一个是VersionLoader
。一个是mainFrame。
VersionLoader负责加载
frame、和进行版本辨识。
VersionLoader通过xml文件
取得服务器文件版本。与SharedObject存储在本地的文件对比,判断是重新加载MainFrame,还是在SharedObject中取得。
使用了一个xml标志服务器版本。
希望对大家有帮助。
下面是源码:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.net.SharedObject;
import flash.net.SharedObjectFlushStatus;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(width="1000", height="600", frameRate="31")]
public class VersionLoader extends Sprite
{
private var configLoader : URLLoader;
private var frameLocalLoader : Loader;
private var frameRemoteLoader : URLLoader;
//版本标识
private var version : String;
private static const MAIN_FRAME_URL : String = "MainFrame.swf";
/**
* 构造函数
*/
public function VersionLoader()
{
super();
loadConfig();
}
/**
* 加载配置文件
*/
private function loadConfig():void
{
configLoader = new URLLoader();
configLoader.load(new URLRequest(("version.xml?v=" + new Date().getTime())));
configLoader.addEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.addEventListener(IOErrorEvent.IO_ERROR, configLoadError);
}
/**
* 配置文件完成处理
*/
private function configLoadCompleted(evt : Event) : void
{
trace("config load completed");
configLoader.removeEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.removeEventListener(IOErrorEvent.IO_ERROR, configLoadError);
configLoader.close();
var xmlData : XML = XML(evt.target.data);
version = xmlData.version;
loadMainFrame();
}
/**
* 加载配置文件失败
*/
private function configLoadError(evt : Event) : void
{
trace("config load error");
}
/**
* 加载主框架
*/
private function loadMainFrame() : void
{
var mainFrameData : ByteArray = (readLocal("MainFrame", version) as ByteArray);
// 本地加载到数据
if (mainFrameData)
{
trace("load shell from local sharedObject");
loadFrameFromBytes(mainFrameData);
}
// 重新加载数据
else
{
trace("load new Shell");
loadFrameFromRemote();
}
}
/**
* 以bytes方式加载主框架
*/
private function loadFrameFromBytes(byteData : ByteArray) : void
{
frameLocalLoader = new Loader();
frameLocalLoader.contentLoaderInfo.addEventListener(Event.INIT, frameLocalLoadCompleted);
frameLocalLoader.loadBytes(byteData);
}
/**
* 本地加载主框架完成
*/
private function frameLocalLoadCompleted(evt : Event) : void
{
addChildAt(frameLocalLoader, 0);
}
/**
* 远程加载主框架
*/
private function loadFrameFromRemote() : void
{
frameRemoteLoader = new URLLoader();
frameRemoteLoader.dataFormat = URLLoaderDataFormat.BINARY;
frameRemoteLoader.addEventListener(Event.COMPLETE, frameRemoteLoadCompleted);
frameRemoteLoader.addEventListener(IOErrorEvent.IO_ERROR, frameRemoteLoadError);
frameRemoteLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, frameRemoteLoadError);
frameRemoteLoader.load(new URLRequest((MAIN_FRAME_URL + "?v=" + version)));
}
/**
* 远程加载主框架完成
*/
private function frameRemoteLoadCompleted(evt : Event) : void
{
trace("load frame from remote completed");
var date:ByteArray = evt.target.data as ByteArray;
loadFrameFromBytes(date);
saveLocal("MainFrame", date, version)
}
/**
* 远程加载主框架失败
*/
private function frameRemoteLoadError(evt : Event) : void
{
trace("load frame from remote error");
}
/**
* 保存到本地
*/
private function saveLocal(name : String, data : Object, version : String) : void
{
trace("save data to local name:" + name + ",version:" + version);
var shared : * = null;
var flushResult : * = null;
var name : * = name;
var data : * = data;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
shared.data["version"] = version;
shared.data["data"] = data;
flushResult = shared.flush();
if (flushResult == SharedObjectFlushStatus.PENDING)
{
shared.addEventListener(NetStatusEvent.NET_STATUS, sharedNetStatus);
}
}
}
catch(err : Error)
{
trace("save to local error");
}
}
/**
* 从本地读取
*/
public function readLocal(name : String, version : String) : Object
{
trace("read data from local name:" + name + ",version:" + version);
var shared : * = null;
var name : * = name;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
if (shared.data["version"] != version)
{
shared.clear();
}
else
{
if (shared.data.hasOwnProperty("data"))
{
return (shared.data["data"]);
}
}
}
}
catch(err : Error)
{
trace("read from local error");
}
return (null);
}
private function sharedNetStatus(event : NetStatusEvent) : void
{
}
}
}
中有两个工程,一个是VersionLoader
。一个是mainFrame。
VersionLoader负责加载
frame、和进行版本辨识。
VersionLoader通过xml文件
取得服务器文件版本。与SharedObject存储在本地的文件对比,判断是重新加载MainFrame,还是在SharedObject中取得。
使用了一个xml标志服务器版本。
希望对大家有帮助。
下面是源码:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.net.SharedObject;
import flash.net.SharedObjectFlushStatus;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(width="1000", height="600", frameRate="31")]
public class VersionLoader extends Sprite
{
private var configLoader : URLLoader;
private var frameLocalLoader : Loader;
private var frameRemoteLoader : URLLoader;
//版本标识
private var version : String;
private static const MAIN_FRAME_URL : String = "MainFrame.swf";
/**
* 构造函数
*/
public function VersionLoader()
{
super();
loadConfig();
}
/**
* 加载配置文件
*/
private function loadConfig():void
{
configLoader = new URLLoader();
configLoader.load(new URLRequest(("version.xml?v=" + new Date().getTime())));
configLoader.addEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.addEventListener(IOErrorEvent.IO_ERROR, configLoadError);
}
/**
* 配置文件完成处理
*/
private function configLoadCompleted(evt : Event) : void
{
trace("config load completed");
configLoader.removeEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.removeEventListener(IOErrorEvent.IO_ERROR, configLoadError);
configLoader.close();
var xmlData : XML = XML(evt.target.data);
version = xmlData.version;
loadMainFrame();
}
/**
* 加载配置文件失败
*/
private function configLoadError(evt : Event) : void
{
trace("config load error");
}
/**
* 加载主框架
*/
private function loadMainFrame() : void
{
var mainFrameData : ByteArray = (readLocal("MainFrame", version) as ByteArray);
// 本地加载到数据
if (mainFrameData)
{
trace("load shell from local sharedObject");
loadFrameFromBytes(mainFrameData);
}
// 重新加载数据
else
{
trace("load new Shell");
loadFrameFromRemote();
}
}
/**
* 以bytes方式加载主框架
*/
private function loadFrameFromBytes(byteData : ByteArray) : void
{
frameLocalLoader = new Loader();
frameLocalLoader.contentLoaderInfo.addEventListener(Event.INIT, frameLocalLoadCompleted);
frameLocalLoader.loadBytes(byteData);
}
/**
* 本地加载主框架完成
*/
private function frameLocalLoadCompleted(evt : Event) : void
{
addChildAt(frameLocalLoader, 0);
}
/**
* 远程加载主框架
*/
private function loadFrameFromRemote() : void
{
frameRemoteLoader = new URLLoader();
frameRemoteLoader.dataFormat = URLLoaderDataFormat.BINARY;
frameRemoteLoader.addEventListener(Event.COMPLETE, frameRemoteLoadCompleted);
frameRemoteLoader.addEventListener(IOErrorEvent.IO_ERROR, frameRemoteLoadError);
frameRemoteLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, frameRemoteLoadError);
frameRemoteLoader.load(new URLRequest((MAIN_FRAME_URL + "?v=" + version)));
}
/**
* 远程加载主框架完成
*/
private function frameRemoteLoadCompleted(evt : Event) : void
{
trace("load frame from remote completed");
var date:ByteArray = evt.target.data as ByteArray;
loadFrameFromBytes(date);
saveLocal("MainFrame", date, version)
}
/**
* 远程加载主框架失败
*/
private function frameRemoteLoadError(evt : Event) : void
{
trace("load frame from remote error");
}
/**
* 保存到本地
*/
private function saveLocal(name : String, data : Object, version : String) : void
{
trace("save data to local name:" + name + ",version:" + version);
var shared : * = null;
var flushResult : * = null;
var name : * = name;
var data : * = data;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
shared.data["version"] = version;
shared.data["data"] = data;
flushResult = shared.flush();
if (flushResult == SharedObjectFlushStatus.PENDING)
{
shared.addEventListener(NetStatusEvent.NET_STATUS, sharedNetStatus);
}
}
}
catch(err : Error)
{
trace("save to local error");
}
}
/**
* 从本地读取
*/
public function readLocal(name : String, version : String) : Object
{
trace("read data from local name:" + name + ",version:" + version);
var shared : * = null;
var name : * = name;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
if (shared.data["version"] != version)
{
shared.clear();
}
else
{
if (shared.data.hasOwnProperty("data"))
{
return (shared.data["data"]);
}
}
}
}
catch(err : Error)
{
trace("read from local error");
}
return (null);
}
private function sharedNetStatus(event : NetStatusEvent) : void
{
}
}
}
相关文章推荐
- 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
- 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
- 基于Metronic的Bootstrap开发框架经验总结(15)-- 更新使用Metronic 4.75版本
- 《连载 - 物联网框架ServerSuperIO教程》- 15.数据持久化接口的使用。附:3.2发布与版本更新说明。
- 请求网络图片缓存到本地 ,还有一些现成的图片加载框架的使用 Ace网络篇(一)
- 使用NSun(框架)快速开发项目(三)NSun1.0.0.1版本更新
- windows简易版本 Redis 使用 demo样例(ssm框架下)
- 《连载 | 物联网框架ServerSuperIO教程》- 16.集成OPC Server,及使用步骤。附:3.3 发布与版本更新说明。
- Universalimageloader图片加载框架缓存本地图片的使用
- 《连载 | 物联网框架ServerSuperIO教程》- 15.数据持久化接口的使用。附:3.2发布与版本更新说明。
- Android数据库框架-----GreenDao3的相关使用和版本升级更新
- Android数据库框架-----GreenDao3的相关使用和版本升级更新
- 《连载 | 物联网框架ServerSuperIO教程》- 15.数据持久化接口的使用。附:3.2发布与版本更新说明。
- Silverlight:xap包(或本地缓存)下载版本更新的解决思路
- 使用rsync将本地文件更新到远程游戏服
- 《连载 | 物联网框架ServerSuperIO教程》- 16.OPC Server的使用步骤。附:3.3 发布与版本更新说明。
- jQuery上传插件Uploadify使用Demo、本地上传(ssm框架下)
- webgame:版本更新与本地缓存
- Git的使用 强制放弃本地所有修改,获取master中最新版本更新本地
- Android数据库框架-----GreenDao3的相关使用和版本升级更新