`
ch_kexin
  • 浏览: 899296 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

egret跨域解决方案

 
阅读更多

1.简述

受限于同源策略。egret在加载跨域素材时,极大的受限。如,canvas下无法二次draw跨域图片,webgl下,无法显示跨域图片,想把资源放到cdn上,但是又没有同域cdn,等等一系列问题。
   哦,对了,还有,release出来的文件,无法直接双击运行(需要http服务器才能运行)。

2.实现原理
   原理是js文件不受同源策略限制。利用jsonp我们就可以把所有非js/css的资源,转成js文件(图片转base64),由egret加载并解析。
   本方案提供转js脚本工具,用于将所有素材转换为js文件。
   同时提供针对egret的解析库,通过Analyzer注入。完全不影响现有的工作流。

3.操作步骤
   a.在egret项目中引入CrossdomainLib.ts和AssetAdapter.ts2个库文件(见后面示例附件)
   b.修改index.html文件如下:

 

<script>
        //是否开启跨域支持,只建议在release版本中开启
        var needCross = false;
        var resourcePath = 'http://www.nofastfat.com/h5/test/crossdomainSource/';//读CDN等跨域资源 
        // var resourcePath = '';//读本地资源
             
        egret.runEgret({renderMode:"webgl"});
    </script>

  c.修改Main.ts文件如下,根据各个项目不同,可能略有差异,重点就是使用AssetAdapter管理素材,和使用 startCross(this.stage, true, window['resourcePath']); 开启跨域支持

 

 

public constructor() {
        super();
        this.once( egret.Event.ADDED_TO_STAGE, this.__addedHandler, this );
    }
 
    private __addedHandler( e: egret.Event ): void {
        if ( !egret.Capabilities.isMobile ) {
            this.stage.scaleMode = egret.StageScaleMode.SHOW_ALL;
            this.stage.orientation = egret.OrientationMode.AUTO;
        }
  
        this.stage.registerImplementation( "eui.IAssetAdapter", new AssetAdapter() );
        var vc: RES.VersionController = new RES.VersionController();
 
        vc.getVirtualUrl = function ( url: string ): string {
            return url + '?v=' + '0.0.1';
        }
         
        RES.registerVersionController( vc );
         
        //绕开egret同域策略的关键代码,只建议在release后,设置needCross = true,以便跨域生效
        if(window && window['needCross']){
            startCross(this.stage, true, window['resourcePath']); 
        }
           
        this.startLoadSource();
    }

  d.发布你的项目

 

  e.安装脚本工具(见附件,安装一次即可):修改installScript.cmd中INSTALL为你的egret安装目录,然后双击该文件,即可安装成功

 

f.在发布的release项目目录下打开cmd命令行工具,并输入 egret crossdomain(如提示找不到该命名,请返回上一步骤重新安装)。此时所有需要的跨域资源已经自动生成。

 

 e.修改release目下index.html中的设置,needCross为true,并根据需要设置跨域素材的位置,如果是加载本地资源,则设置为空。
如果需要放置资源到CDN上,则复制完整的resource目录到cdn,如下图(下图为测试用http服务器的目录结构,对应:http://www.nofastfat.com/h5/test/crossdomainSource/),并设置resourcePath为对应的URL地址。

 

  f.操作结束,你会发现,修改处理后的html文件不仅可以直接双击访问,还可以访问跨域CDN上的资源。

4.写在最后
   a.由于使用base64转图片,性能会有一定损耗,因此不建议在中大型游戏上使用。
    b.该工具并没有经历上线项目检验。 (2017-4.17 更新:经过多位朋友QQ反馈,本工具已经历不同的上线项目,基本稳定)  

    c.引擎版本最高支持到3.2.6。4.0由于Analyzer兼容行问题,暂不支持(2017-4.17 更新:经过实测,由于4.0.3版本对RES的保留,依旧可用,目前版本可支持到4.0.3)  
    d.使用本工具可以衍生出很多玩法,比如使用apicloud等工具可以在线打包出ipa和apk文件(而不用去到native上各种悲催)。使用C#打壳在windows桌面上跑(electron打包有100M+),等等玩法。(2017-4.17 更新:经过本人实际使用,建议使用HBuilder+htmlplus框架打包app,稳定高效,本地api丰富)  

 

当项目中有fnt位图字体时,会有BUG,需要做如下处理
1.*.fnt文件中, {"file":"/fnt.png",中的斜杠(/)一定要去掉,一定要去掉,位图字体工具的坑
2.不要在default.res.json中手动加载fnt.png文件,因为*.fnt文件自己就会加载对应的fnt.png文件

分享到:
评论

相关推荐

    跨域加载资源

    解决跨域问题的方法有多种,主要包括以下几种: 1. **CORS(Cross-Origin Resource Sharing)**:这是一种现代浏览器支持的跨域方式,服务器通过设置响应头`Access-Control-Allow-Origin`来指定哪些源可以访问其...

    基于Egret30搭建的HTML5游戏极速开发解决方案

    Egret 3.0 是一个强大的HTML5游戏开发框架,专为构建高性能、跨平台的游戏应用而设计。...EgretAir-master文件可能是这个解决方案的一个实例,通过研究它,我们可以更好地掌握Egret 3.0的开发实践。

    基于 Egret 3.0 搭建的 HTML5 游戏极速开发解决方案.zip

    【EgerAir:Egret的移动端解决方案】 EgerAir 在压缩包文件名中提及,它是Egret针对移动设备推出的一个重要组件。EgerAir集成了Egret Engine,并且添加了对原生功能的封装,如推送通知、本地存储、硬件加速等,使得...

    egret 下拉框的制作

    在本文中,我们将深入探讨如何在Egret游戏引擎中创建一个下拉框。Egret是一个基于TypeScript的2D游戏开发框架,它提供了一套完整的开发工具链,包括编辑器、编译器和运行时环境,适用于移动和桌面平台。 首先,我们...

    EgretScreenFit:使用Egret引擎开发Html5游戏屏幕适配解决方案

    Egret开发游戏屏幕适配解决方案,适配不同分辨率,两种适配模式。 适配库是基于Egret的屏幕适配策StageScaleMode.NO_BORDER开发,采用NO_BORDER是因为他没有黑边,而且游戏内容是等比例拉伸。可以把NO_BORDER理解为...

    egret小游戏示例

    10. **社区与文档**:Egret有一个活跃的开发者社区,提供了丰富的教程、示例和API文档,方便开发者快速上手和解决问题。 通过对"balls"这个文件的猜测,我们可能能够了解到如何在Egret中实现球体的碰撞检测、运动...

    完整的egret实例库

    Egret 是一个强大的开源...这个实例库提供了从基础到进阶的全面示例,无论是想要学习Egret的新手,还是寻求灵感和解决方案的开发者,都能从中受益。通过实际操作这些代码,可以加深对Egret框架的理解,提高开发技能。

    Egret 引擎学习资料

    最后,Egret社区活跃,拥有大量的教程、示例和插件,开发者可以通过参与社区交流,获取最新资讯和解决方案,加速自己的学习进程。 总的来说,Egret引擎是HTML5游戏开发的一个强大选择,通过深入学习“Egret HTML5...

    Egret Engine游戏框架 v5.4.1.zip

    这个文件很可能是关于Egret Engine v5.4.1的使用指南或说明文档,包含了安装步骤、API参考、常见问题解答等内容,是初学者入门和解决问题的重要参考资料。 总的来说,Egret Engine v5.4.1提供了全面的游戏开发工具...

    Egret手势识别库egret_gesture-master.zip

    本库旨在为Egret封装常用的手势操作,因本人能力有限,有的实现并不完善,欢迎批评指正。Egret手势识别库egret_gesture目前已实现的手势: 1. Tap(点一下) 2. Double Tap (双击) 3. Pinch(二指往內或往外拨动,平时...

    22_游戏egret_

    Egret 提供了完整的解决方案,包括编辑器、引擎、构建工具以及社区支持,帮助开发者高效地创建高质量的跨平台游戏。 在这款名为 "22_游戏egret" 的项目中,我们可以看到几个关键文件: 1. **index.html**:这是...

    egret图集拆分工具.zip

    总的来说,Egret图集拆分工具是Python编程技术与Egret游戏开发实践相结合的产物,它为解决特定的资源管理问题提供了便利,体现了编程在游戏开发中的实用性与灵活性。对于Egret开发者来说,掌握这类工具的使用方法...

    Egret官网声音项目

    Egret是一个基于HTML5的开源游戏开发框架,它提供了一整套完整的2D和3D游戏开发解决方案,包括图形渲染、动画系统、事件处理以及音频管理等。在这个项目中,"120-media-audio"可能是一个示例或教程,专门讲解如何在...

    egret-core egret 官方示例代码

    Egret Core 是一款基于 TypeScript 开发的2D游戏开发框架,它为开发者提供了高效、便捷的游戏开发工具链。这个压缩包包含的是Egret官方提供的示例代码,可以帮助开发者理解和学习如何使用Egret Core 进行游戏开发。 ...

    egret p2 物理引擎

    Egret游戏引擎是一款广泛应用于开发2D游戏的开源框架,其强大的功能和高效性能使得开发者能够轻松构建高质量的游戏。在Egret引擎中,P2 Physics是一个重要的组件,它为游戏提供了物理模拟的支持,使游戏对象能够表现...

    egret弹珠游戏源码

    Egret 引擎是一款强大的 HTML5 游戏开发框架,由白鹭时代公司推出,它提供了全面的 2D 游戏开发解决方案。这个“egret弹珠游戏源码”是一个利用Egret引擎构建的弹珠小游戏,非常适合开发者进行学习和参考。下面将...

    egret摄像机移动

    Egret 是一个强大的HTML5游戏开发框架,它提供了一套完整的解决方案来帮助开发者构建高性能的2D和3D游戏。"egret摄像机移动"这个主题涉及到的是在Egret中如何操纵游戏场景中的摄像机,让玩家可以观察和跟随游戏世界...

    EgretWing-v3.2.6.exe

    EgretWing-v3.2.6

    egret-core-1.0_rc2

    Egret Engine是一个基于TypeScript语言的游戏开发框架,它提供了一个全面的解决方案,包括渲染引擎、资源管理、事件系统、动画系统、网络通信以及游戏开发工具链等。由于TypeScript是JavaScript的超集,因此开发者...

    egret做的游戏

    7. **调试和优化工具**:Egret Workbench 是 Egret 的官方集成开发环境,提供了一整套的调试和性能分析工具,帮助开发者找出并解决问题。 在这个测试游戏中,我们可以通过查看源代码来学习如何利用 Egret 引擎实现...

Global site tag (gtag.js) - Google Analytics