1. GS.ZipAssetLoader = function(audioContext) {
    this.audioContext = audioContext,
    this.objLoader = new THREE.OBJLoader,
    this.mapLoader = new GS.MapLoader,
    this.fontLoader = new GS.FontLoader,
    this.fontLoader.fontPath = "",
    this.zipPath = "assets.zip",
    this.path = {},
    this.path[GS.AssetTypes.Texture] = "textures/",
    this.path[GS.AssetTypes.CubeTexture] = "textures/",
    this.path[GS.AssetTypes.UIWidget] = "textures/widgets/",
    this.path[GS.AssetTypes.Mesh] = "meshes/",
    this.path[GS.AssetTypes.Sound] = "sounds/",
    this.path[GS.AssetTypes.Map] = "maps/",
    this.path[GS.AssetTypes.Script] = "scripts/",
    this.path[GS.AssetTypes.MusicTrack] = "music/",
    this.reset()
    }
  1. GS.ZipAssetLoader.prototype = {
    reset: function() {
    this.loaded = !1,
    this.assetsToLoad = 0,
    this.queue = [],
    this.assets = {},
    this.assets[GS.AssetTypes.Texture] = {},
    this.assets[GS.AssetTypes.CubeTexture] = {},
    this.assets[GS.AssetTypes.UIWidget] = {},
    this.assets[GS.AssetTypes.Mesh] = {},
    this.assets[GS.AssetTypes.Sound] = {},
    this.assets[GS.AssetTypes.Map] = {},
    this.assets[GS.AssetTypes.Script] = {},
    this.assets[GS.AssetTypes.MusicTrack] = {}
    },
    init: function() {
    for (var j in GS.AssetTypes) {
    var assetDict = GS.Assets[GS.AssetTypes[j]];
    for (var i in assetDict)
    this.add(i, assetDict[i].filename, GS.AssetTypes[j])
    }
    },
    add: function(name, filename, type) {
    this.queue.push({
    name: name,
    filename: filename,
    type: type
    }),
    this.assetsToLoad++
    },
    loadZip: function() {
    var that = this
    , xhr = new XMLHttpRequest;
    xhr.open("GET", this.zipPath, !0),
    xhr.responseType = "arraybuffer",
    xhr.onreadystatechange = function(e) {
    4 == this.readyState && 200 == this.status && (that.zip = new JSZip(this.response),
    setTimeout(function() {
    that._load()
    }, 0))
    }
    ,
    xhr.onprogress = function(e) {
    that.zipOnProgress(e)
    }
    ,
    xhr.send()
    },
    _load: function() {
    var that = this;
    this.totalAssets = this.queue.length + 1,
    this.assetsToLoad++,
    this.fontLoader.load("hudFont", GS.CustomFontFile, function() {
    that.checkIfFullyLoaded()
    });
    for (var asset; this.queue.length > 0; )
    asset = this.queue.pop(),
    asset.name in this.assets[asset.type] ? this.assetsToLoad-- : this.loadAsset(asset)
    },
    load: function() {
    this.loadZip()
    },
    loadAsset: function(asset) {
    switch (asset.type) {
    case GS.AssetTypes.Texture:
    this.loadTexture(asset.name, asset.filename);
    break;
    case GS.AssetTypes.CubeTexture:
    this.loadCubeTexture(asset.name, asset.filename);
    break;
    case GS.AssetTypes.UIWidget:
    this.loadUIWidget(asset.name, asset.filename);
    break;
    case GS.AssetTypes.Mesh:
    this.loadMesh(asset.name, asset.filename);
    break;
    case GS.AssetTypes.Sound:
    this.loadSound(asset.name, asset.filename, GS.AssetTypes.Sound);
    break;
    case GS.AssetTypes.Map:
    this.loadMap(asset.name, asset.filename);
    break;
    case GS.AssetTypes.Script:
    this.loadScript(asset.name, asset.filename);
    break;
    case GS.AssetTypes.MusicTrack:
    this.loadSound(asset.name, asset.filename, GS.AssetTypes.MusicTrack)
    }
    },
    getImageFromZip: function(path) {
    var buffer = this.zip.file(path).asArrayBuffer()
    , blob = new Blob([buffer],{
    type: "image/png"
    })
    , urlCreator = window.URL || window.webkitURL
    , imageUrl = urlCreator.createObjectURL(blob)
    , img = new Image;
    return img.src = imageUrl,
    img
    },
    getTextureFromZip: function(path) {
    var img = this.getImageFromZip(path)
    , tex = new THREE.Texture(img);
    return tex.needsUpdate = !0,
    tex
    },
    loadTexture: function(name, filename) {
    var path = this.path[GS.AssetTypes.Texture] + filename;
    this.assets[GS.AssetTypes.Texture][name] = this.getTextureFromZip(path),
    this.checkIfFullyLoaded()
    },
    loadCubeTexture: function(name, folder) {
    var path = this.path[GS.AssetTypes.CubeTexture] + folder + "/"
    , tex = new THREE.Texture;
    tex.image = [],
    tex.flipY = !1;
    for (var i = 0; i < GS.CubeTextureNames.length; i++)
    tex.image[i] = this.getImageFromZip(path + GS.CubeTextureNames[i] + GS.CubeTextureExtension);
    tex.needsUpdate = !0,
    this.assets[GS.AssetTypes.CubeTexture][name] = tex,
    this.checkIfFullyLoaded()
    },
    loadUIWidget: function(name, filename) {
    var path = this.path[GS.AssetTypes.UIWidget] + filename;
    this.assets[GS.AssetTypes.UIWidget][name] = this.getImageFromZip(path),
    this.checkIfFullyLoaded()
    },
    loadMesh: function(name, filename) {
    var path = this.path[GS.AssetTypes.Mesh] + filename
    , text = this.zip.file(path).asText();
    this.assets[GS.AssetTypes.Mesh][name] = this.objLoader.parse(text).children[0],
    this.checkIfFullyLoaded()
    },
    loadSound: function(name, filename, assetType) {
    var that = this
    , path = this.path[assetType] + filename
    , encodedBuffer = this.zip.file(path).asArrayBuffer();
    this.audioContext.decodeAudioData(encodedBuffer, function(buffer) {
    that.assets[assetType][name] = buffer,
    that.checkIfFullyLoaded()
    })
    },
    loadMap: function(name, filename) {
    var path = this.path[GS.AssetTypes.Map] + filename;
    "testMap" !== name ? this.assets[GS.AssetTypes.Map][name] = this.zip.file(path).asText() : GAME.isTestMap() && (this.assets[GS.AssetTypes.Map][name] = this.mapLoader.loadTestMap()),
    this.checkIfFullyLoaded()
    },
    loadScript: function(name, filename) {
    var path = this.path[GS.AssetTypes.Script] + filename
    , scriptTag = document.createElement("script");
    scriptTag.text = this.zip.file(path).asText(),
    document.body.appendChild(scriptTag),
    this.checkIfFullyLoaded()
    },
    zipOnProgress: function(e) {
    var percentLoaded = e.loaded / e.total * 50;
    this.dispatchEvent({
    type: "progress",
    percentLoaded: percentLoaded.toFixed(0)
    })
    },
    checkIfFullyLoaded: function() {
    this.assetsToLoad--;
    var percentLoaded = 100 * (.5 + (this.totalAssets - this.assetsToLoad) / this.totalAssets * .5);
    this.dispatchEvent({
    type: "progress",
    percentLoaded: percentLoaded.toFixed(0)
    }),
    0 === this.assetsToLoad && (this.loaded = !0,
    this.dispatchEvent({
    type: "load",
    percentLoaded: 100,
    assets: this.assets
    }))
    }
    }

zip loader的更多相关文章

  1. USB Loader使用心得之游戏名称、简介、背景音乐

    我在<WAD独立安装版USB Loader的下载和安装>(链接:http://www.cnblogs.com/duxiuxing/p/4255124.html)开头提到:“任何版本的USB ...

  2. DOL版USB Loader的下载和运行

    下载 在Wii上面玩硬盘版游戏,自然少不了USB Loader,相关教程和下载资源在网上一搜就有. 我在官网(地址:http://gwht.wikidot.com/usb-loader)上找到了一个下 ...

  3. Couldn't load libPassword from loader:NDK开发中C文件编译成cpu对应的so类库时,找不到类库报错的原因之一

    LogCat输出: 03-03 12:42:32.665: E/AndroidRuntime(32432): FATAL EXCEPTION: main03-03 12:42:32.665: E/An ...

  4. java.lang.ClassNotFoundException: org.apache.catalina.loader.DevLoader

    eclipse tomcat报错:org.apache.catalina.loader.DevLoader java.lang.ClassNotFoundException: org.apache.c ...

  5. Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)

    Acknowledgments I would like to thank Jacob Kjome for reviewing early drafts of this document. His c ...

  6. IOS开发创建开发证书及发布App应用(八)——使用Application Loader工具上传应用

    8.使用Application Loader工具上传应用 继续第七步在iTunes所创建的应用,打开应用,如下图 点击详情按钮进去之后,单击右上角Ready to Upload Binary按钮,如下 ...

  7. MySQL5.7以上Zip版官方安装文档(选译)

    前言 在windows上安装Zip版MySQL(选译) 学习mysql的朋友们会发现5.7+版本的mysql变得比以前难安装了许多(当然我们可以选择installer版本,但是这样总感觉对学习mysq ...

  8. Cordova打包vue项目生成Apk (解决cordova build android抛出的zip问题)

    最近对vue前端框架情有独钟.但研究了一下怎么把vue项目打包成android apk来玩玩. 首先讲一下创建vue2.x项目.其实在之前的文章中都有写过,有兴趣的同学可以去看看.http://www ...

  9. Windows下的PHP 5.3.x安装 Zend Guard Loader

    PHP5.3之后不再使用Zend Optimizer而是由Zend Guard Loader替换,而Zend Guard Loader安装比前者方便了很多,只有一个dll: 址:http://down ...

随机推荐

  1. PHP高手干货分享:不能不看的50个细节!【PHP培训教程】

    兄弟连分享PHP高手干货:不能不看的50个细节 1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以 ...

  2. BFC、IFC、GFC和FFC

    基本概念 Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个Box 组成的.元素的类型和 display 属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不 ...

  3. (20)C++项目练习三--------【运动物体视频检测跟踪系统】

    1.功能点 (1)视频监控显示 (2)移动物体标定跟踪(轨迹显示) (3)实时视频保存(以时间戳形式) (4)移动物体触发视频保存.报警 (5)视频文件分类.回放.搜索 进行中............ ...

  4. hihocoder1286 : 子矩阵求和

    http://hihocoder.com/problemset/problem/1286 题解 NB分析题. 首先我们令\(s[i][j]\)表示以\((i,j)\)为左上角的矩形的权值和. 因为\( ...

  5. 进阶3: zookeeper-3.4.9.tar.gz和hbase-1.2.4-bin.tar.gz 环境搭建(hbase 伪分布式)

    前提条件: 成功安装了  jdk1.8,  hadoop2.7.3 注意条件: zookeeper,hbase 版本必须要和hadoop 安装版本相互兼容,否则容易出问题: 本次:安装包 zookee ...

  6. os.environ.get()的用法

    os.environ.get()是python中os模块获取环境变量的一个方法 import os JS_ADDRESS = os.environ.get("PALM_JS_ADDRESS& ...

  7. fedora18 [linux]Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.

    在使用fedora17 系统的yum源的时候出现了如下错误: Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more ...

  8. (转)用C#实现实现简单的 Ping 的功能,用于测试网络是否已经连通

    本文转载自:http://blog.csdn.net/xiamin/archive/2009/02/14/3889696.aspx 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通 1 ...

  9. 20160711--C# 委托的三种调用示例(同步调用 异步调用 异步回调)【转载】

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 代码如下: public delegate int AddHandler(int a,int b); public class 加法类 { p ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_8_LinkedHashMap集合

    linked