egret3d的GUI目前还没有,在做3d游戏的时候没有UI可用,只能使用egret2d的EUI组件库,egret3d与egret2d混合开发,canvas3d的大小与位置与canvas2d并没有重合,导致适配ui时总是错位。在做手机屏幕适配的时候必须解决这种问题,我的解决方法是两个属性相同。

我的解决方案为修改源码,在egret2d适配屏幕的时候加入自定义接口,通过事件的方式通知适配canvas3d的大小和位置。

先看下效果如何





转屏适配⬇️


增加Diy接口

打开 egret engine ,跳转到引擎的根目录下,进入src->egret->diy->RMCanvas2DView.tsdiy->RMCanvas2DView.ts为自己创建的文件,目的是为了从引擎底部调出接口。

  1. module RM {
  2. export class RMCanvas2DView {
  3. public static canvasW:number = 0;
  4. public static canvasH:number = 0;
  5. public static canvasX:number = 0;
  6. public static canvasY:number = 0;
  7. public static canvasR:string = 'rotate(0deg)';
  8. public static eventDispatcher:egret.EventDispatcher = new egret.EventDispatcher();
  9. public constructor() {
  10. }
  11. }
  12. }

修改WebPlayer.ts源码

WebPlayer.updateScreenSize函数的最后加上代码:

  1. /**
  2. * @private
  3. * 更新播放器视口尺寸
  4. */
  5. public updateScreenSize():void {
  6. ......
  7. this.player.updateStageSize(stageWidth, stageHeight);//不要在这个方法后面修改属性
  8. //函数的最下面加上以下代码
  9. RM.RMCanvas2DView.canvasW = displayWidth;
  10. RM.RMCanvas2DView.canvasH = displayHeight;
  11. RM.RMCanvas2DView.canvasX = +canvas.style.left.split('px')[0];
  12. RM.RMCanvas2DView.canvasY = +canvas.style.top.split('px')[0];
  13. RM.RMCanvas2DView.canvasR = canvas.style.transform;
  14. RM.RMCanvas2DView.eventDispatcher.dispatchEvent(egret.Event.create(
  15. egret.Event,egret.Event.RESIZE));

编译引擎

通过egret create命令创建的项目,在项目的根目录下执行一次 egret make命令,编译完成后,在项目中看看是否有RMCanvas2DView类,如果没有,请重新看下步骤,重试以下。

监听屏幕适配变化

然后在游戏启动时加入事件监听器回调函数

  1. class WorldCanvas {
  2. private _canvas3d:egret3d.Egret3DCanvas;
  3. private _view3d:egret3d.View3D;
  4. public constructor() {
  5. this.initCanvas();
  6. this.initHtmlCanvas();
  7. }
  8. private initCanvas():void {
  9. this._canvas3d = new egret3d.Egret3DCanvas();
  10. this._canvas3d.width = GameConfig.STAGE_W;
  11. this._canvas3d.height = GameConfig.STAGE_H;
  12. this._canvas3d.x = this._canvas3d.y = 0;
  13. this._view3d = new egret3d.View3D( 0, 0, GameConfig.STAGE_W, GameConfig.STAGE_H );
  14. this._view3d.backColor = 0x00000000;
  15. this._canvas3d.addView3D( this._view3d );
  16. this.onResize();
  17. RM.RMCanvas2DView.eventDispatcher.addEventListener( egret.Event.RESIZE, this.onResize, this );
  18. }
  19. private initHtmlCanvas():void
  20. {
  21. var canvas = document.getElementById( "egret3D" );
  22. if ( canvas ) {
  23. canvas.style[ 'position' ] = 'absolute';
  24. canvas.style[ 'cursor' ] = 'inherit';
  25. canvas.style[ 'bottom' ] = '0px';
  26. canvas.style[ 'right' ] = '0px';
  27. canvas.style[ 'transform-origin' ] = '0% 0% 0px';
  28. }
  29. }
  30. public onResize( $e? ):void {
  31. this._canvas3d.x = RM.RMCanvas2DView.canvasX;
  32. this._canvas3d.y = RM.RMCanvas2DView.canvasY;
  33. var canvas = document.getElementById( "egret3D" );
  34. if ( canvas ) {
  35. canvas.style[ 'transform' ] = RM.RMCanvas2DView.canvasR;
  36. canvas.style['width'] = RM.RMCanvas2DView.canvasW+'px';
  37. canvas.style['height'] = RM.RMCanvas2DView.canvasH+'px';
  38. }
  39. }
  40. }

这样就把2D引擎适配的结果传递给3D了。旋转缩放都没有问题了,可以使用2D下的所有适配模式。

有问题请联系哦!目前我以这种模式已做了2个egret3d项目喽~不过目前并没有上线运营。

egret3D与2D混合开发,画布尺寸不一致的问题的更多相关文章

  1. Qt 5.4正式发布!引入WP,支持HTML5混合开发

    北京时间12月11日消息,Digia全资子公司The Qt Company在其 官方博客上宣布,正式发布Qt 5.4,支持HTML5混合开发,引入对于Windows Phone的支持,以及众多跨桌面. ...

  2. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  3. 基于ionic+angulajs的混合开发实现地铁APP

    基于ionic+angulajs的混合开发实现地铁APP 注:本博文为博主原创,转载时请注明出处. 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一. ...

  4. IOS-Hybrid(混合开发)

    http://www.cnblogs.com/oc-bowen/p/5423902.html 1.1.     APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等 ...

  5. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  6. 移动开发发展方向-----Hybird混合开发3大方案

    移动开发发展方向-----Hybird混合开发3大方案

  7. android混合开发,webview的java与js互操作

    android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ...

  8. (读书笔记)Asp.net Mvc 与WebForm 混合开发

    根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...

  9. Android 混合开发 的一些心得。

    其实所谓这个混合开发,也就是hybird,就是一些简单的,html5和native 代码之间的交互.很多电商之类的app里面都有类似的功能, 这种东西其实还是蛮重要的,主要就是你有什么功能都可以进行热 ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 如何远程关闭一个ASP.NET Core应用?

    在<历数依赖注入的N种玩法>演示系统自动注册服务的实例中,我们会发现输出的列表包含两个特殊的服务,它们的对应的服务接口分别是IApplicationLifetime和IHostingEnv ...

  3. iOS逆向工程之Hopper中的ARM指令

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  4. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  5. C语言中如何判断文件是否存在

    方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io.h filename:可以填写 ...

  6. A*算法应用[转]

    转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ...

  7. Atitit.cto 与技术总监的区别

    Atitit.cto 与技术总监的区别 1. 核心区别1 2. Cto主要职责1 3. 如何提升到cto1 4. CTO五种基本的必备素质:2 5. 2 1. 核心区别 技术总监(Chief Tech ...

  8. VPN连接常见错误汇总

    提示远程服务器没有响应. 这种情况有两种情况,一种是远程服务器出现故障.另一种是自己的电脑出现问题,具体原因我还没有找到,但是可以肯定的是注册表除了问题,一个终极的解决办法就是把注册表替换了.先将HK ...

  9. [Top-Down Approach]Take Notes

    Computer Networking - A Top-Down Approach Six Edition Learn HTTP Using Browser and Proxy 2016-03-20 ...

  10. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...