Project1

标题: 【自用·测试】图块遮挡角色半透明 [打印本页]

作者: andrewx    时间: 2016-1-2 10:19
标题: 【自用·测试】图块遮挡角色半透明
本帖最后由 andrewx 于 2016-1-2 10:37 编辑

各位新年快乐噜~
这次是为了练习处理sprite写的插件,能实现被图块遮挡的角色呈现半透明的效果,帮助玩家确认被遮挡的角色的位置。原理很简单,就是为所有的角色(包括主角,跟随队友,事件,交通工具)在与高层图块相同的层级(z = 4)上建立半透明的sprite。感谢@汪汪 之前提供的思路。

截图:



食用方法:

1. 安装:直接在插件管理器中启用。

2. 设定参数:

Default Opacity Rate:
图块上半透明角色sprite的不透明度将为Opacity Rate与角色原本的不透明度的乘积。此处设定的是默认的Opacity Rate。
有效参数是[0, 1]之间的小数。
本参数默认值为0.2。

Opacity Percentage Variable ID:
你也可以使用一个游戏内变量来动态地控制高层角色sprite。本参数接收一个游戏内变量的ID,sprite的不透明度将由该变量的值决定。由于RM中内建游戏变量只能是整数,所以变量里的有效值为百分比的整数部分,即在[0, 100]之间的整数。实际Opacity Rate将为该值除以100。
如果你使用变量控制不透明度,那么Default Opacity Rate将被忽略。记得调节相应的变量数值以使高层sprite生效。
该参数设定为0表示不启用这项功能。
本参数默认值为0。

Enable by Default:
设定高层角色sprite是否默认起效。如果设定为false,那么默认不会显示任何高层角色sprite。你需要使用下面的插件指令或事件注释标签来手动开启。
本参数默认值为true。

3. 插件指令:
插件指令可以临时调整某角色上是否显示高层sprite。

代码复制
  1. HighLayerCharacterSprite EventID true       #开启以EventID为ID的事件的高层角色sprite


代码复制
  1. HighLayerCharacterSprite EventID false       #关闭以EventID为ID的事件的高层角色sprite


其中EventID为-1时代表主角和跟随队友,0为当前事件,或者其他具体事件ID。

4. 事件注释标签
通过设置事件注释标签可以修改某事件默认是否显示高层角色sprite。
注意这里的事件注释标签不是事件窗口上方的备注(Note)区,而是事件执行内容内通过流程控制->注释(comment)指令加入的注释内容。使用事件注释而非备注可以允许你为同一个事件的不同页面定义不同的高层角色sprite的可见性。你可以在注释指令里使用如下标签(包括尖括号):

代码复制
  1. <Enable High Layer Character Sprite>       #开启这个事件的高层角色sprite

代码复制
  1. <Disable High Layer Character Sprite>       #关闭这个事件的高层角色sprite




注意事项:








插件内容:
Ver 0.10


自吐槽:为毛这么简单一个效果做这么多设定选项,根本不会有人调整这玩意儿。。。都说了是在练习插件的写法啦XD
作者: 夏末渐离    时间: 2016-1-2 10:25
哎哟不错喔
作者: 汪汪    时间: 2016-1-2 11:52
Default Opacity Rate:
图块上半透明角色sprite的不透明度将为Opacity Rate与角色原本的不透明度的乘积。此处设定的是默认的Opacity Rate。
有效参数是[0, 1]之间的小数。
本参数默认值为0.2。
对这种参数我觉得
设置为 0 - 255
在脚本里对这个数除以255
这样比较好.

作者: 夏末渐离    时间: 2016-1-2 13:56
本帖最后由 夏末渐离 于 2016-1-2 14:09 编辑
关于副作用,想到一个笨方法


原本想法是获取【可通过的高层图块的XY】,然后与角色们的当前XY值比较,相等则绘制半透明,不等则不绘制。

因为不懂如何获取【可通过的高层图块的XY】,而且每一帧都要获取角色们的XY值会觉得很卡。

便直接用地区ID判定,只能辛苦使用这个插件的人去设置【可通过的高层图块的地区ID】了。


作者: andrewx    时间: 2016-1-2 14:51
汪汪 发表于 2016-1-2 11:52
Default Opacity Rate:
图块上半透明角色sprite的不透明度将为Opacity Rate与角色原本的不透明度的乘积。此 ...

感谢提出建议,但是我使用0~1的比值是希望这个半透明的sprite的不透明度是基于角色实际不透明度计算得出的,比如Opacity Rate=0.2时,如果角色本身不透明度255,那么实际不透明度为51,如果角色的不透明度变成了100,那么半透明sprite的透明度则自动变为20。如果参数得当,就不会出现半透明sprite比角色原本sprite还明显的情况。
如果按照0~255来设置,会给使用者一种这是在设定半透明sprite的真实不透明度的印象,毕竟本身设置Opacity就是0~255这么设置的。
作者: andrewx    时间: 2016-1-2 15:04
夏末渐离 发表于 2016-1-2 13:56
[fold=关于副作用,想到一个笨方法]

if (characters._character._showHighLayerCharaSprite === true&&cha ...

感谢提供思路~确实可以这样避免平时角色重叠的问题,但是在高层图块后面重叠的话还是会糊在一起囧。其实我觉得Opacity Rate不设的太离谱重叠在一起影响也不是很大,而且不是有些人喜欢用事件来画一些地图上的大型或者可动元素比如树木什么的,留着这个副作用的话角色在这些元素后行走也会有半透明效果。
作者: 夏末渐离    时间: 2016-1-2 15:53
本帖最后由 夏末渐离 于 2016-1-2 15:55 编辑
andrewx 发表于 2016-1-2 15:04
感谢提供思路~确实可以这样避免平时角色重叠的问题,但是在高层图块后面重叠的话还是会糊在一起囧。其实 ...


在高层图块后面也糊在一起这点不仔细看还真看不出来。
毕竟事件作图,船只什么的跟角色们是处于同一层的所以无法区别对待实施透明化……
看来只能往this._highLayerCharaSprites.z 这项细分了。
作者: andrewx    时间: 2016-1-2 17:11
本帖最后由 andrewx 于 2016-1-2 17:16 编辑
夏末渐离 发表于 2016-1-2 15:53
在高层图块后面也糊在一起这点不仔细看还真看不出来。
毕竟事件作图,船只什么的跟角色们是处于同一层的 ...


可以每次都根据事件的x,y去找该处的图块是否包含高层图块,然而这个高层图块的判定系统本身有,只是看图块是否含星形。但我在写墙壁后行走插件时用了自己新写的方法了加入了其他判定,使得A组图块也能被当成高层图块。因此实际上还是不知道图块到底被在绘制的时候被当成了高层还是低层ORZ。。。
作者: 汪汪    时间: 2016-1-2 18:20
本帖最后由 汪汪 于 2016-1-2 18:48 编辑

于是......针对副作用,
把高层元件做出半透明遮挡物就好了,
高层元件在显示时在人物下面,
高层元件的半透明遮挡在人物的上面,
这样人物不需要半透明了.
于是饶了以又绕回来了{:2_276:}


缺点,不能控制单独的事件......
JAVASCRIPT 代码复制
  1. (function() {
  2.  
  3.  
  4. Tilemap.prototype._paintTiles = function(startX, startY, x, y) {
  5.     var tableEdgeVirtualId = 10000;
  6.     //现在x = 开始x + x
  7.     var mx = startX + x;
  8.     //现在y = 开始y + y
  9.     var my = startY + y;
  10.     //dx = 现在x * 图块宽(48)  除 层宽(912)的余数  -- 以层宽为基础的 现在图块坐标 x
  11.     var dx = (mx * this._tileWidth).mod(this._layerWidth);
  12.     //dy = 现在y * 图块高(48)  除 层高(720)的余数  -- 以层宽为基础的 现在图块坐标 y
  13.     var dy = (my * this._tileHeight).mod(this._layerHeight);
  14.     //层x
  15.     var lx = dx / this._tileWidth;
  16.     //层y
  17.     var ly = dy / this._tileHeight;
  18.     var tileId0 = this._readMapData(mx, my, 0);
  19.     var tileId1 = this._readMapData(mx, my, 1);
  20.     var tileId2 = this._readMapData(mx, my, 2);
  21.     var tileId3 = this._readMapData(mx, my, 3);
  22.     var shadowBits = this._readMapData(mx, my, 4);
  23.     var upperTileId1 = this._readMapData(mx, my - 1, 1);
  24.     var lowerTiles = [];
  25.     var upperTiles = [];
  26.  
  27.     if (this._isHigherTile(tileId0)) {
  28.         upperTiles.push(tileId0);
  29.         lowerTiles.push(tileId0);
  30.     } else {
  31.         lowerTiles.push(tileId0);
  32.     }
  33.     if (this._isHigherTile(tileId1)) {
  34.         upperTiles.push(tileId1);
  35.         lowerTiles.push(tileId1);
  36.     } else {
  37.         lowerTiles.push(tileId1);
  38.     }
  39.  
  40.     lowerTiles.push(-shadowBits);
  41.  
  42.     if (this._isTableTile(upperTileId1) && !this._isTableTile(tileId1)) {
  43.         if (!Tilemap.isShadowingTile(tileId0)) {
  44.             lowerTiles.push(tableEdgeVirtualId + upperTileId1);
  45.         }
  46.     }
  47.  
  48.     if (this._isOverpassPosition(mx, my)) {
  49.         upperTiles.push(tileId2);
  50.         upperTiles.push(tileId3);
  51.         lowerTiles.push(tileId3);
  52.         lowerTiles.push(tileId2);
  53.     } else {
  54.         if (this._isHigherTile(tileId2)) {
  55.             upperTiles.push(tileId2);
  56.             lowerTiles.push(tileId2);
  57.         } else {
  58.             lowerTiles.push(tileId2);
  59.         }
  60.         if (this._isHigherTile(tileId3)) {
  61.             upperTiles.push(tileId3);
  62.             lowerTiles.push(tileId3);
  63.         } else {
  64.             lowerTiles.push(tileId3);
  65.         }
  66.     }
  67.  
  68.     var lastLowerTiles = this._readLastTiles(0, lx, ly);
  69.     if (!lowerTiles.equals(lastLowerTiles) ||
  70.             (Tilemap.isTileA1(tileId0) && this._frameUpdated)) {
  71.         this._lowerBitmap.clearRect(dx, dy, this._tileWidth, this._tileHeight);
  72.         for (var i = 0; i < lowerTiles.length; i++) {
  73.             var lowerTileId = lowerTiles[i];
  74.             if (lowerTileId < 0) {
  75.                 this._drawShadow(this._lowerBitmap, shadowBits, dx, dy);
  76.             } else if (lowerTileId >= tableEdgeVirtualId) {
  77.                 this._drawTableEdge(this._lowerBitmap, upperTileId1, dx, dy);
  78.             } else {
  79.                 this._drawTile(this._lowerBitmap, lowerTileId, dx, dy);
  80.             }
  81.         }
  82.         this._writeLastTiles(0, lx, ly, lowerTiles);
  83.     }
  84.  
  85.     var lastUpperTiles = this._readLastTiles(1, lx, ly);
  86.     if (!upperTiles.equals(lastUpperTiles)) {
  87.         this._upperBitmap.clearRect(dx, dy, this._tileWidth, this._tileHeight);
  88.         for (var j = 0; j < upperTiles.length; j++) {
  89.             this._drawTile(this._upperBitmap, upperTiles[j], dx, dy);
  90.         }
  91.         this._writeLastTiles(1, lx, ly, upperTiles);
  92.     }
  93. };
  94.  
  95. Tilemap.prototype._createLayers = function() {
  96.         //宽 856
  97.     var width = this._width;
  98.     //高 664
  99.     var height = this._height;
  100.     //页边 20
  101.     var margin = this._margin;
  102.     //图块列  19  大于等于 宽/图块宽 的最小整数 +1  
  103.     var tileCols = Math.ceil(width / this._tileWidth) + 1;
  104.     //图块行  15  大于等于 高/图块高 的最小整数 +1
  105.     var tileRows = Math.ceil(height / this._tileHeight) + 1;
  106.     //层宽 912
  107.     var layerWidth = tileCols * this._tileWidth;
  108.     //层高 720
  109.     var layerHeight = tileRows * this._tileHeight;
  110.     //下层位图
  111.     this._lowerBitmap = new Bitmap(layerWidth, layerHeight);
  112.     //上层位图
  113.     this._upperBitmap = new Bitmap(layerWidth, layerHeight);
  114.     this._layerWidth = layerWidth;
  115.     this._layerHeight = layerHeight;
  116.  
  117.     /**--------------------------------------------------------------------------
  118.      * Z coordinate:
  119.      * 0 : Lower tiles  较下层图块
  120.      * 1 : Lower characters  较下层人物
  121.      * 3 : Normal characters  正常人物
  122.      * 4 : Upper tiles   较上层图块
  123.      * 5 : Upper characters  较上层人物
  124.      * 6 : Airship shadow  飞艇影子
  125.      * 7 : Balloon      气球
  126.      * 8 : Animation    动画
  127.      * 9 : Destination  目的地
  128.      *--------------------------------------------------------------------------
  129.      */
  130.  
  131.     //创建下层
  132.     this._lowerLayer = new Sprite();
  133.     //下层移动到 -20,-20
  134.     this._lowerLayer.move(-margin, -margin, width, height);
  135.     //下层z 为0
  136.     this._lowerLayer.z = 0;
  137.  
  138.     //创建上层
  139.     this._upperLayer = new Sprite();
  140.     //上层移动到 -20,-20
  141.     this._upperLayer.move(-margin, -margin, width, height);
  142.     //上层z 为0
  143.     this._upperLayer.z = 4;
  144.  
  145.     //添加4个子项精灵到层
  146.     for (var i = 0; i < 4; i++) {
  147.         this._lowerLayer.addChild(new Sprite(this._lowerBitmap));
  148.         this._upperLayer.addChild(new Sprite(this._upperBitmap));
  149.     }
  150.     this._upperLayer.opacity=125//修改透明度在这里.目前没有添加在游戏里修改的方法,不过在 SceneManager_scene往下一级找children应该就能找到它.......我觉得.什么时候出一个children表就好看了.
  151.  
  152.     //添加下层  
  153.     this.addChild(this._lowerLayer);
  154.     //添加上层
  155.     this.addChild(this._upperLayer);
  156. };
  157. })();

作者: andrewx    时间: 2016-1-2 18:56
汪汪 发表于 2016-1-2 18:20
于是......针对副作用,
把高层元件做出半透明遮挡物就好了,
高层元件在显示时在人物下面,

试了下发现没法跟墙壁后行走插件兼容(必然),
果然是绕回来了,一开始我也想过这么做TvT
作者: 汪汪    时间: 2016-1-2 19:28
本帖最后由 汪汪 于 2016-1-2 19:30 编辑
andrewx 发表于 2016-1-2 18:56
试了下发现没法跟墙壁后行走插件兼容(必然),
果然是绕回来了,一开始我也想过这么做TvT ...
忽然想到一个缺点.............人物太高的话....会很奇怪吧(话说,本来人物很高就会很奇怪好吧................我要xp)
作者: 汪汪    时间: 2016-1-2 20:17
  1. //=============================================================================
  2. // ceshi.js
  3. //=============================================================================
  4. /*:
  5. * @plugindesc 名称
  6. * @author wangwang作者信息
  7. *
  8. * @param cs
  9. * @desc 默认参数
  10. * @default 汪汪
  11. *
  12. * @help
  13. * 帮助的信息
  14. * 就像这样...........
  15. *
  16. */


  17.   
  18. (function() {


  19. })();
复制代码

作者: andrewx    时间: 2016-1-2 20:36
汪汪 发表于 2016-1-2 19:28
[fold][/fold]忽然想到一个缺点.............人物太高的话....会很奇怪吧(话说,本来人物很高就会很奇怪好 ...

是说满两格及更高的角色会被切头吗?噫这是痛处
附带插件里面有个CP_Large_Sprite_Fix可以解决,但是用了以后帧速明显会拖慢。。。。。
作者: 死伤殆尽    时间: 2016-1-2 22:05
本帖最后由 死伤殆尽 于 2016-1-2 22:06 编辑

这个插件的想法好
但是楼主你有没有发现最后一张截图里,角色和宝箱的位置,跟右边的阴影位置是矛盾的?
虽然细究起来有点问题,但软件预设墙体上方是只可以往下走进一格的
再结合角色高度啊等等问题,我觉得这些需要统合起来考虑一下
作者: andrewx    时间: 2016-1-2 22:43
本帖最后由 andrewx 于 2016-1-2 22:54 编辑
死伤殆尽 发表于 2016-1-2 22:05
这个插件的想法好
但是楼主你有没有发现最后一张截图里,角色和宝箱的位置,跟右边的阴影位置是矛盾的?
虽 ...


我在墙壁同行插件里的算法是对于同一纵列连续墙壁自动元件,如果从上面数有n块顶部元素,那么从下面数n块不能通行。实际上正方体斜上方透视不也是这样的么,顶面宽度=底面宽度,允许行走的部分正好等于墙壁正面高度。

本身VX之后墙壁根本就不给通行,xp也只是墙壁往下一格,但我觉得不是很科学。

对于阴影...你可以认为是光线与地面135度夹角投影后偏移了,但是系统又画不出斜向的阴影什么的。说真的,自动阴影这个设计蠢爆了,又不智能又丑。你可以试着画一个顶面一格,正面多格的柱子,你会发现自动阴影还是那么愚蠢地产生一条。。。。
我都准备开插件全程屏蔽这东西。。。。
作者: andrewx    时间: 2016-1-3 21:10
汪汪 发表于 2016-1-2 18:20
于是......针对副作用,
把高层元件做出半透明遮挡物就好了,
高层元件在显示时在人物下面,

在这个思路基础上想到可以不管tile的分层而是直接多创建一层upperLayer并添加对其的更新,这样似乎兼容性更好一点点

JAVASCRIPT 代码复制
  1. Tilemap.prototype._createLayers = function() {
  2.         var width = this._width;
  3.         var height = this._height;
  4.         var margin = this._margin;
  5.         var tileCols = Math.ceil(width / this._tileWidth) + 1;
  6.         var tileRows = Math.ceil(height / this._tileHeight) + 1;
  7.         var layerWidth = tileCols * this._tileWidth;
  8.         var layerHeight = tileRows * this._tileHeight;
  9.         this._lowerBitmap = new Bitmap(layerWidth, layerHeight);
  10.         this._upperBitmap = new Bitmap(layerWidth, layerHeight);
  11.         this._layerWidth = layerWidth;
  12.         this._layerHeight = layerHeight;
  13.  
  14.         /*
  15.          * Z coordinate:
  16.          *
  17.          * 0 : Lower tiles
  18.          * 1 : Lower characters
  19.          * 3 : Normal characters
  20.          * 4 : Upper tiles
  21.          * 5 : Upper characters
  22.          * 6 : Airship shadow
  23.          * 7 : Balloon
  24.          * 8 : Animation
  25.          * 9 : Destination
  26.          */
  27.  
  28.         this._lowerLayer = new Sprite();
  29.         this._lowerLayer.move(-margin, -margin, width, height);
  30.         this._lowerLayer.z = 0;
  31.  
  32.         this._upperLayer = new Sprite();
  33.         this._upperLayer.move(-margin, -margin, width, height);
  34.         this._upperLayer.z = 4;
  35.  
  36.         for (var i = 0; i < 4; i++) {
  37.                 this._lowerLayer.addChild(new Sprite(this._lowerBitmap));
  38.                 this._upperLayer.addChild(new Sprite(this._upperBitmap));
  39.         }
  40.  
  41.         this.addChild(this._lowerLayer);
  42.         this.addChild(this._upperLayer);
  43.  
  44.         // 更改原始upperLayer的z值为0,并添加半透明的upperLayerNew
  45.         this._upperLayer.z = 0;
  46.         this._upperLayerNew = new Sprite();
  47.         this._upperLayerNew.move(-margin, -margin, width, height);
  48.         this._upperLayerNew.z = 4;
  49.         this._upperLayerNew.opacity = 200;
  50.         for (var i = 0; i < 4; i++) {
  51.                 this._upperLayerNew.addChild(new Sprite(this._upperBitmap));
  52.         }
  53.         this.addChild(this._upperLayerNew);
  54. };
  55.  
  56. Tilemap.prototype._updateLayerPositions = function(startX, startY) {
  57.         var m = this._margin;
  58.         var ox = Math.floor(this.origin.x);
  59.         var oy = Math.floor(this.origin.y);
  60.         var x2 = (ox - m).mod(this._layerWidth);
  61.         var y2 = (oy - m).mod(this._layerHeight);
  62.         var w1 = this._layerWidth - x2;
  63.         var h1 = this._layerHeight - y2;
  64.         var w2 = this._width - w1;
  65.         var h2 = this._height - h1;
  66.  
  67.         for (var i = 0; i < 2; i++) {
  68.                 var children;
  69.                 if (i === 0) {
  70.                         children = this._lowerLayer.children;
  71.                 } else {
  72.                         children = this._upperLayer.children;
  73.                 }
  74.                 children[0].move(0, 0, w1, h1);
  75.                 children[0].setFrame(x2, y2, w1, h1);
  76.                 children[1].move(w1, 0, w2, h1);
  77.                 children[1].setFrame(0, y2, w2, h1);
  78.                 children[2].move(0, h1, w1, h2);
  79.                 children[2].setFrame(x2, 0, w1, h2);
  80.                 children[3].move(w1, h1, w2, h2);
  81.                 children[3].setFrame(0, 0, w2, h2);
  82.         }
  83.  
  84.         // 增加对upperLayerNew的更新
  85.         var children = this._upperLayerNew.children;
  86.         children[0].move(0, 0, w1, h1);
  87.         children[0].setFrame(x2, y2, w1, h1);
  88.         children[1].move(w1, 0, w2, h1);
  89.         children[1].setFrame(0, y2, w2, h1);
  90.         children[2].move(0, h1, w1, h2);
  91.         children[2].setFrame(x2, 0, w1, h2);
  92.         children[3].move(w1, h1, w2, h2);
  93.         children[3].setFrame(0, 0, w2, h2);
  94. };

作者: 死伤殆尽    时间: 2016-1-3 22:21
本帖最后由 死伤殆尽 于 2016-1-3 22:23 编辑
andrewx 发表于 2016-1-2 22:43
我在墙壁同行插件里的算法是对于同一纵列连续墙壁自动元件,如果从上面数有n块顶部元素,那么从下面数n块 ...


我知道,所以我才说只能走进去一格的系统预设细想起来是有问题的
但这个预设又是为了确保默认设置下角色在被墙壁遮盖时能至少露出一个头顶
虽然VX开始的地图编辑器功能弱化导致连一格都走不进去
但自动阴影的算法也跟着这个预设走
然后这又导致了自动阴影在很多情况下违和感十分严重
而VX系的地图图层功能又无法在没有自动阴影的情况下解决地图阴影问题
因此VX Ace开始增加了阴影笔这个功能用来修改自动生成的阴影

这样解释之后不知道你能不能理解VX系地图编辑器在这方面有多混乱
如果要针对其中一点下手的话,其他牵连到的要素也要一并解决才行
屏蔽自动阴影其实没有太大必要,毕竟这方面的问题靠阴影笔也能解决就是了……
改造自动阴影的算法又不知道可行性有多少……

顺带一提RM默认地图图块素材的光线基本上预设是从左向右直射的,不需要去考虑什么斜方向阳光

总而言之还是那句话,我不是针对MV,但VX系的地图编辑器真的都是垃圾啊!
作者: 死伤殆尽    时间: 2016-1-3 22:28
其实细究起来第一张截图的房子阴影也有问题,然后角色应该也不止能走进去一格……
以前用XP画地图时碰到这种地方的处理我一般都被迫抛弃常识不管多高的墙后面永远设成只能走进一格
就游戏性的角度来考虑还是能接受的……

楼主加油吧,期待你想出能解决这个问题的方法
作者: andrewx    时间: 2016-1-4 10:21
本帖最后由 andrewx 于 2016-1-4 10:23 编辑
死伤殆尽 发表于 2016-1-3 22:28
其实细究起来第一张截图的房子阴影也有问题,然后角色应该也不止能走进去一格……
以前用XP画地图时碰到这 ...


对的,是不止一格,按理说墙壁多高就应该能往下几格,然而这默认地图就给房顶这个元件做了一格的星形通行,也是很奇怪。

如果用了半透明遮挡的话最后那张图尽管露不出头也是能看到角色位置,实际跑起来感觉还是可以的。

MV这次地图图块数据在同一格内做了六层,0是A类基础图块,1是A类装饰图快,2,3是B~E类图块叠加,4是阴影bit,5是区域id,而这个默认阴影bit又是编辑器自动算出来的,如果要改算法大概要对编辑器本身动刀了。另外自动阴影对于常用Shift画地图的简直是摧残啊Orz

我对V系地图编辑器都是垃圾这句话不能同意更多,这次所谓的六层地图数据依然被xp完爆。且不论自动原件没了解析窗口,当我发现v系自动元件精度从3*3变成了2*2,我真想骂这tm什么鬼。。。
作者: 汪汪    时间: 2016-1-5 20:45
......对mv的地图太不熟悉了,求教几个语句
   为什么这里是 -shadowBits
    lowerTiles.push(-shadowBits);

   (this._isTableTile(upperTileId1) && !this._isTableTile(tileId1))  这个什么意思,实现什么效果?

    if (this._isTableTile(upperTileId1) && !this._isTableTile(tileId1)) {
      
        if (!Tilemap.isShadowingTile(tileId0)) {   这句又是要干啥..................
            lowerTiles.push(tableEdgeVirtualId + upperTileId1);  完全看不懂这个要做啥
        }
    }
   这是啥东西.....  
  this._isOverpassPosition

(想通过sprite实现 tilemap中....)
作者: andrewx    时间: 2016-1-5 22:58
本帖最后由 andrewx 于 2016-1-5 23:09 编辑
汪汪 发表于 2016-1-5 20:45
......对mv的地图太不熟悉了,求教几个语句
   为什么这里是 -shadowBits
    lowerTiles.push(-shadowBits) ...


(this._isTableTile(upperTileId1) && !this._isTableTile(tileId1))
这一部分是绘制柜台图块下面那一块,因为按照F1所说,(柜台图块)绘制时,底部的12像素会有向下的偏移。也就是桌子边和腿那一部分会延伸到下面一块tile,当然如果下面的图块是墙壁类(A3A4会产生自动阴影的)或者本身还是柜台,则不会往下延伸。用tableEdgeVirtualId + upperTileId1后,下面绘制的时候如果发现tileId大于tableEdgeVirtualId,就知道应该绘制柜台边缘(以及这一块本来的内容)了。

shadowBits就是一个tile上四个位置阴影的分布,按照右下-左下-右上-左上的顺序的四个比特位。然后根据比特位的值生成对应阴影的图像。这里用负值,下面在绘制的时候遇到tileId<0的就知道是阴影了。

那个OverpassPosition 我也不清楚,我查到的_isOverpassPosition只能返回false,总感觉是永远执行不到的语句块ORZ




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1