egret3D与2D混合开发,画布尺寸不一致的问题
egret3d的GUI目前还没有,在做3d游戏的时候没有UI可用,只能使用egret2d的EUI组件库,egret3d与egret2d混合开发,canvas3d的大小与位置与canvas2d并没有重合,导致适配ui时总是错位。在做手机屏幕适配的时候必须解决这种问题,我的解决方法是两个属性相同。
我的解决方案为修改源码,在egret2d适配屏幕的时候加入自定义接口,通过事件的方式通知适配canvas3d的大小和位置。
先看下效果如何


转屏适配⬇️

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

module RM {
	export class RMCanvas2DView {
		public static canvasW:number = 0;
		public static canvasH:number = 0;
		public static canvasX:number = 0;
		public static canvasY:number = 0;
		public static canvasR:string = 'rotate(0deg)';
		public static eventDispatcher:egret.EventDispatcher = new egret.EventDispatcher();
		public constructor() {
		}
	}
}
修改WebPlayer.ts源码

在WebPlayer.updateScreenSize函数的最后加上代码:
/**
 * @private
 * 更新播放器视口尺寸
 */
public updateScreenSize():void {
	......
	this.player.updateStageSize(stageWidth, stageHeight);//不要在这个方法后面修改属性
	//函数的最下面加上以下代码
	RM.RMCanvas2DView.canvasW = displayWidth;
	RM.RMCanvas2DView.canvasH = displayHeight;
	RM.RMCanvas2DView.canvasX = +canvas.style.left.split('px')[0];
	RM.RMCanvas2DView.canvasY = +canvas.style.top.split('px')[0];
	RM.RMCanvas2DView.canvasR = canvas.style.transform;
	RM.RMCanvas2DView.eventDispatcher.dispatchEvent(egret.Event.create(
	egret.Event,egret.Event.RESIZE));
}
编译引擎
通过egret create命令创建的项目,在项目的根目录下执行一次 egret make命令,编译完成后,在项目中看看是否有RMCanvas2DView类,如果没有,请重新看下步骤,重试以下。
监听屏幕适配变化
然后在游戏启动时加入事件监听器回调函数
class WorldCanvas {
	private _canvas3d:egret3d.Egret3DCanvas;
	private _view3d:egret3d.View3D;
	public constructor() {
		this.initCanvas();
		this.initHtmlCanvas();
	}
	private initCanvas():void {
		this._canvas3d = new egret3d.Egret3DCanvas();
		this._canvas3d.width = GameConfig.STAGE_W;
		this._canvas3d.height = GameConfig.STAGE_H;
		this._canvas3d.x = this._canvas3d.y = 0;
		this._view3d = new egret3d.View3D( 0, 0, GameConfig.STAGE_W, GameConfig.STAGE_H );
		this._view3d.backColor = 0x00000000;
		this._canvas3d.addView3D( this._view3d );
		this.onResize();
		RM.RMCanvas2DView.eventDispatcher.addEventListener( egret.Event.RESIZE, this.onResize, this );
	}
	private initHtmlCanvas():void
	{
		var canvas = document.getElementById( "egret3D" );
		if ( canvas ) {
			canvas.style[ 'position' ] = 'absolute';
			canvas.style[ 'cursor' ] = 'inherit';
			canvas.style[ 'bottom' ] = '0px';
			canvas.style[ 'right' ] = '0px';
			canvas.style[ 'transform-origin' ] = '0% 0% 0px';
		}
	}
	public onResize( $e? ):void {
		this._canvas3d.x = RM.RMCanvas2DView.canvasX;
		this._canvas3d.y = RM.RMCanvas2DView.canvasY;
		var canvas = document.getElementById( "egret3D" );
		if ( canvas ) {
			canvas.style[ 'transform' ] = RM.RMCanvas2DView.canvasR;
			canvas.style['width'] = RM.RMCanvas2DView.canvasW+'px';
			canvas.style['height'] = RM.RMCanvas2DView.canvasH+'px';
		}
	}
}
这样就把2D引擎适配的结果传递给3D了。旋转缩放都没有问题了,可以使用2D下的所有适配模式。
有问题请联系哦!目前我以这种模式已做了2个egret3d项目喽~不过目前并没有上线运营。
egret3D与2D混合开发,画布尺寸不一致的问题的更多相关文章
- Qt 5.4正式发布!引入WP,支持HTML5混合开发
		北京时间12月11日消息,Digia全资子公司The Qt Company在其 官方博客上宣布,正式发布Qt 5.4,支持HTML5混合开发,引入对于Windows Phone的支持,以及众多跨桌面. ... 
- Unity iOS混合开发界面切换思路
		Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ... 
- 基于ionic+angulajs的混合开发实现地铁APP
		基于ionic+angulajs的混合开发实现地铁APP 注:本博文为博主原创,转载时请注明出处. 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一. ... 
- IOS-Hybrid(混合开发)
		http://www.cnblogs.com/oc-bowen/p/5423902.html 1.1. APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等 ... 
- Hybrid APP混合开发的一些经验和总结
		http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ... 
- 移动开发发展方向-----Hybird混合开发3大方案
		移动开发发展方向-----Hybird混合开发3大方案 
- android混合开发,webview的java与js互操作
		android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ... 
- (读书笔记)Asp.net Mvc 与WebForm 混合开发
		根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ... 
- Android 混合开发 的一些心得。
		其实所谓这个混合开发,也就是hybird,就是一些简单的,html5和native 代码之间的交互.很多电商之类的app里面都有类似的功能, 这种东西其实还是蛮重要的,主要就是你有什么功能都可以进行热 ... 
随机推荐
- HTTP协议系列(1)
			一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ... 
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
			前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ... 
- 从I/O复用谈epoll为什么高效
			上一篇文章中,谈了一些网络编程的基本概念.在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认为epoll效率是最高的.单纯的这么认为 ... 
- ES6模块import细节
			写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ... 
- 关于Layer弹出框初探
			layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,laye ... 
- 通过 floating IP 访问 VIP - 每天5分钟玩转 OpenStack(126)
			前面我们是直接用 curl 测试 VIP,在更为真实的场景中通常会使用 floating IP 访问 VIP. 下面我们给 VIP 关联一个 floating IP,再进行测试. 访问 Project ... 
- JavaScript特性(attribute)、属性(property)和样式(style)
			最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ... 
- spring boot 实战:我们的第一款开源软件
			在信息爆炸时代,如何避免持续性信息过剩,使自己变得专注而不是被纷繁的信息所累?每天会看到各种各样的新闻,各种新潮的技术层出不穷,如何筛选出自己所关心的? 各位看官会想,我们是来看开源软件的,你给我扯什 ... 
- 我理解的MVC
			前言 前一阶段对MVC模式及其衍生模式做了一番比较深入的研究和实践,这篇文章也算是一个阶段性的回顾和总结. 经典MVC模式 经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的 ... 
- HTML5 Page Visibility
			什么是 Page Visibility ? Page Visibility 即页面可见性,通过 visibilityState 的值检测页面当前是否可见.当一个网站是可见或点击选中的状态时 Page ... 
