设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3170|回复: 3
打印 上一主题 下一主题

[已经解决] 请问窗口只有一层吗?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
跳转到指定楼层
1
发表于 2016-1-2 16:47:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我把2个窗口叠在一起 重叠部分只有上层的内容

Lv1.梦旅人

梦石
0
星屑
70
在线时间
386 小时
注册时间
2007-7-27
帖子
4106

开拓者

2
发表于 2016-1-2 16:52:09 | 只看该作者
首先窗口是WindowLayer负责渲染的
然后WindowLayer在画窗口的时候,会首先该清除矩形区域,造成只有一层的假象

修改很简单
将下面插入一个js文件,作为插件开启
  1. WindowLayer.prototype._canvasClearWindowRect = function(renderSession, window) {

  2.     };

  3.     WindowLayer.prototype._webglMaskWindow = function(renderSession, window) {

  4.     };

  5.     WindowLayer.prototype._renderCanvas = function(renderSession) {
  6.       if (!this.visible) {
  7.         return;
  8.       }

  9.       if (!this._tempCanvas) {
  10.         this._tempCanvas = document.createElement('canvas');
  11.       }

  12.       this._tempCanvas.width = Graphics.width;
  13.       this._tempCanvas.height = Graphics.height;

  14.       var realCanvasContext = renderSession.context;
  15.       var context = this._tempCanvas.getContext('2d');

  16.       context.save();
  17.       context.clearRect(0, 0, Graphics.width, Graphics.height);
  18.       context.beginPath();
  19.       context.rect(this.x, this.y, this.width, this.height);
  20.       context.closePath();
  21.       context.clip();

  22.       renderSession.context = context;

  23.       for (var i = 0; i < this.children.length; i++) {
  24.         var child = this.children[i];
  25.         if (child._isWindow && child.visible && child.openness > 0) {
  26.           this._canvasClearWindowRect(renderSession, child);
  27.           context.save();
  28.           child._renderCanvas(renderSession);
  29.           context.restore();
  30.         }
  31.       }

  32.       context.restore();

  33.       renderSession.context = realCanvasContext;
  34.       renderSession.context.setTransform(1, 0, 0, 1, 0, 0);
  35.       renderSession.context.globalCompositeOperation = 'source-over';
  36.       renderSession.context.globalAlpha = 1;
  37.       renderSession.context.drawImage(this._tempCanvas, 0, 0);

  38.       for (var j = 0; j < this.children.length; j++) {
  39.         if (!this.children[j]._isWindow) {
  40.           this.children[j]._renderCanvas(renderSession);
  41.         }
  42.       }
  43.     };

  44.     WindowLayer.prototype._renderWebGL = function(renderSession) {
  45.       if (!this.visible) {
  46.         return;
  47.       }

  48.       var gl = renderSession.gl;

  49.       if (!this._vertexBuffer) {
  50.         this._vertexBuffer = gl.createBuffer();
  51.       }

  52.       this._dummySprite._renderWebGL(renderSession);

  53.       renderSession.spriteBatch.stop();
  54.       gl.enable(gl.STENCIL_TEST);
  55.       gl.clear(gl.STENCIL_BUFFER_BIT);
  56.       this._webglMaskOutside(renderSession);
  57.       renderSession.spriteBatch.start();

  58.       for (var i = 0; i < this.children.length; i++) {
  59.         var child = this.children[i];
  60.         if (child._isWindow && child.visible && child.openness > 0) {
  61.           gl.stencilFunc(gl.EQUAL, 0, 0xFF);
  62.           child._renderWebGL(renderSession);
  63.           renderSession.spriteBatch.stop();
  64.           this._webglMaskWindow(renderSession, child);
  65.           renderSession.spriteBatch.start();
  66.         }
  67.       }

  68.       gl.disable(gl.STENCIL_TEST);

  69.       for (var j = 0; j < this.children.length; j++) {
  70.         if (!this.children[j]._isWindow) {
  71.           this.children[j]._renderWebGL(renderSession);
  72.         }
  73.       }
  74.     };
复制代码

评分

参与人数 1梦石 +2 收起 理由
余烬之中 + 2 0x0

查看全部评分

吸吸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
3
 楼主| 发表于 2016-1-2 16:58:41 | 只看该作者
本帖最后由 wbsy8241 于 2016-1-2 17:03 编辑
trentswd 发表于 2016-1-2 16:52
首先窗口是WindowLayer负责渲染的
然后WindowLayer在画窗口的时候,会首先该清除矩形区域,造成只有一层的 ...


谢谢 可以了


MV好像对修改Z值很麻烦?
我要做出战斗角色在某一个窗口的上面,其他窗口默认在角色之上
是否可行?
(XP的角色战斗方式,但角色比窗口高, 所以显示2个窗口,底层和 显示状态的顶层
不行就只能画个真窗口显示在角色下面了)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
70
在线时间
386 小时
注册时间
2007-7-27
帖子
4106

开拓者

4
发表于 2016-1-2 17:41:30 | 只看该作者
wbsy8241 发表于 2016-1-2 16:58
谢谢 可以了

并没有Z值
渲染的时候把所有的结构看成一个树:
先渲染父节点,然后渲染子节点,子节点是先渲染先加入的,后渲染后加入的
所以最后加入的在最上面

你的问题是这样的,现在sprite都在SpriteSet里面,window在windowLayer里面,spriteSet在scene里面又比WindowLayer加入的早
解决办法是再加一个windowLayer
吸吸
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-23 06:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表