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

Project1

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

[原创发布] 【自用·测试】图块遮挡角色半透明

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
跳转到指定楼层
1
发表于 2016-1-2 10:19:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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




注意事项:
    对于事件,插件指令和事件注释标签的效果将持续到地图切换,对于主角和队友效果则切换地图后依然持续。

    插件指令和事件注释标签的效果会互相覆盖。

    当某事件的某一页被激活,该页面的事件注释标签就会被执行,假如该页没有定义标签,那么高层角色sprite的可见性维持不变。

    副作用:角色重叠的话半透明的sprite也会重叠在一起…这个目前感觉无解,如果有解决思路可以留言,谢~





插件内容:
Ver 0.10


自吐槽:为毛这么简单一个效果做这么多设定选项,根本不会有人调整这玩意儿。。。都说了是在练习插件的写法啦XD

评分

参与人数 2星屑 +300 梦石 +1 收起 理由
余烬之中 + 1 原创发布
taroxd + 300 精品文章

查看全部评分

Lv1.梦旅人

梦石
0
星屑
60
在线时间
306 小时
注册时间
2014-8-5
帖子
416
2
发表于 2016-1-2 10:25:29 | 只看该作者
哎哟不错喔
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
3
发表于 2016-1-2 11:52:37 | 只看该作者
Default Opacity Rate:
图块上半透明角色sprite的不透明度将为Opacity Rate与角色原本的不透明度的乘积。此处设定的是默认的Opacity Rate。
有效参数是[0, 1]之间的小数。
本参数默认值为0.2。
对这种参数我觉得
设置为 0 - 255
在脚本里对这个数除以255
这样比较好.

评分

参与人数 1星屑 +5 收起 理由
夏末渐离 + 5 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
306 小时
注册时间
2014-8-5
帖子
416
4
发表于 2016-1-2 13:56:11 | 只看该作者
本帖最后由 夏末渐离 于 2016-1-2 14:09 编辑
关于副作用,想到一个笨方法


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

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

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

  点我进入    
       ↓      
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
5
 楼主| 发表于 2016-1-2 14:51:54 | 只看该作者
汪汪 发表于 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这么设置的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
6
 楼主| 发表于 2016-1-2 15:04:58 | 只看该作者
夏末渐离 发表于 2016-1-2 13:56
[fold=关于副作用,想到一个笨方法]

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

感谢提供思路~确实可以这样避免平时角色重叠的问题,但是在高层图块后面重叠的话还是会糊在一起囧。其实我觉得Opacity Rate不设的太离谱重叠在一起影响也不是很大,而且不是有些人喜欢用事件来画一些地图上的大型或者可动元素比如树木什么的,留着这个副作用的话角色在这些元素后行走也会有半透明效果。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
306 小时
注册时间
2014-8-5
帖子
416
7
发表于 2016-1-2 15:53:57 | 只看该作者
本帖最后由 夏末渐离 于 2016-1-2 15:55 编辑
andrewx 发表于 2016-1-2 15:04
感谢提供思路~确实可以这样避免平时角色重叠的问题,但是在高层图块后面重叠的话还是会糊在一起囧。其实 ...


在高层图块后面也糊在一起这点不仔细看还真看不出来。
毕竟事件作图,船只什么的跟角色们是处于同一层的所以无法区别对待实施透明化……
看来只能往this._highLayerCharaSprites.z 这项细分了。
  点我进入    
       ↓      
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
8
 楼主| 发表于 2016-1-2 17:11:16 | 只看该作者
本帖最后由 andrewx 于 2016-1-2 17:16 编辑
夏末渐离 发表于 2016-1-2 15:53
在高层图块后面也糊在一起这点不仔细看还真看不出来。
毕竟事件作图,船只什么的跟角色们是处于同一层的 ...


可以每次都根据事件的x,y去找该处的图块是否包含高层图块,然而这个高层图块的判定系统本身有,只是看图块是否含星形。但我在写墙壁后行走插件时用了自己新写的方法了加入了其他判定,使得A组图块也能被当成高层图块。因此实际上还是不知道图块到底被在绘制的时候被当成了高层还是低层ORZ。。。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
9
发表于 2016-1-2 18:20:10 | 只看该作者
本帖最后由 汪汪 于 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. })();

点评

注释请无视.............研究地图绘制时乱写的........  发表于 2016-1-2 18:39
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
388 小时
注册时间
2009-8-4
帖子
219
10
 楼主| 发表于 2016-1-2 18:56:01 | 只看该作者
汪汪 发表于 2016-1-2 18:20
于是......针对副作用,
把高层元件做出半透明遮挡物就好了,
高层元件在显示时在人物下面,

试了下发现没法跟墙壁后行走插件兼容(必然),
果然是绕回来了,一开始我也想过这么做TvT

点评

瞎糊代码的后果XD  发表于 2016-1-3 21:29
比如英日双语的说明在日版MV就会自动只显示日文说明。然而我们现在用的汉化版都是基于美版的,所以并不能读出标记为/*:zh的中文说明ORZ  发表于 2016-1-2 20:28
哦哦,那就是直接在默认说明里写的中文。本来MV插件管理器是可以根据软件语言直接读取插件中对应版本的说明。  发表于 2016-1-2 20:26
额,直接写到里面......就读取了  发表于 2016-1-2 20:15
咦?是可以直接读取插件里标记为/*:zh的说明吗?  发表于 2016-1-2 20:02
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 15:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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