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

Project1

 找回密码
 注册会员
搜索

【自用·测试】图块遮挡角色半透明

查看数: 10302 | 评论数: 20 | 收藏 12
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-1-2 10:19

正文摘要:

本帖最后由 andrewx 于 2016-1-2 10:37 编辑 各位新年快乐噜~ 这次是为了练习处理sprite写的插件,能实现被图块遮挡的角色呈现半透明的效果,帮助玩家确认被遮挡的角色的位置。原理很简单,就是为所有的角色(包 ...

回复

andrewx 发表于 2016-1-5 22:58:37
本帖最后由 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

点评

准备尝试sprite不直接放在下面而是放在层上,z改变时就把sprite转到另一个层.  发表于 2016-1-7 14:43
确实,计算量和内存估计都要的不少。每个格子分sprite感觉也不能很好解决遮挡,最好是画的同一个物体(比如一整块墙)算作一个个体。  发表于 2016-1-7 09:19
当然一格n个……这样才能有层次……然而失败了,看起来效率太低了……  发表于 2016-1-7 06:25
一个tile一个sprite?还是一格tile有n个sprite叠加?  发表于 2016-1-7 00:45
sprite太多,完全卡死.......  发表于 2016-1-7 00:18
汪汪 发表于 2016-1-5 20:45:57
......对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-4 10:21:37
本帖最后由 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什么鬼。。。

点评

之前看到那个插件,不过好像当时还有bug,不知道现在如何了,回头研究下,实在不行用PS画多层远景图得了ORZ  发表于 2016-1-4 14:42
然后支持tiledmap的插件已经有了。  发表于 2016-1-4 13:09
可以考虑使用tiledmap这个软件,不过好像不能自动原件,目前要考虑的是对地图的格式转化……(其实.抛开mv就好。  发表于 2016-1-4 13:09
死伤殆尽 发表于 2016-1-3 22:28:28
其实细究起来第一张截图的房子阴影也有问题,然后角色应该也不止能走进去一格……
以前用XP画地图时碰到这种地方的处理我一般都被迫抛弃常识不管多高的墙后面永远设成只能走进一格
就游戏性的角度来考虑还是能接受的……

楼主加油吧,期待你想出能解决这个问题的方法
死伤殆尽 发表于 2016-1-3 22:21:18
本帖最后由 死伤殆尽 于 2016-1-3 22:23 编辑
andrewx 发表于 2016-1-2 22:43
我在墙壁同行插件里的算法是对于同一纵列连续墙壁自动元件,如果从上面数有n块顶部元素,那么从下面数n块 ...


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

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

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

总而言之还是那句话,我不是针对MV,但VX系的地图编辑器真的都是垃圾啊!
andrewx 发表于 2016-1-3 21:10:59
汪汪 发表于 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. };
andrewx 发表于 2016-1-2 22:43:44
本帖最后由 andrewx 于 2016-1-2 22:54 编辑
死伤殆尽 发表于 2016-1-2 22:05
这个插件的想法好
但是楼主你有没有发现最后一张截图里,角色和宝箱的位置,跟右边的阴影位置是矛盾的?
虽 ...


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

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

对于阴影...你可以认为是光线与地面135度夹角投影后偏移了,但是系统又画不出斜向的阴影什么的。说真的,自动阴影这个设计蠢爆了,又不智能又丑。你可以试着画一个顶面一格,正面多格的柱子,你会发现自动阴影还是那么愚蠢地产生一条。。。。
我都准备开插件全程屏蔽这东西。。。。
死伤殆尽 发表于 2016-1-2 22:05:08
本帖最后由 死伤殆尽 于 2016-1-2 22:06 编辑

这个插件的想法好
但是楼主你有没有发现最后一张截图里,角色和宝箱的位置,跟右边的阴影位置是矛盾的?
虽然细究起来有点问题,但软件预设墙体上方是只可以往下走进一格的
再结合角色高度啊等等问题,我觉得这些需要统合起来考虑一下
andrewx 发表于 2016-1-2 20:36:42
汪汪 发表于 2016-1-2 19:28
[fold][/fold]忽然想到一个缺点.............人物太高的话....会很奇怪吧(话说,本来人物很高就会很奇怪好 ...

是说满两格及更高的角色会被切头吗?噫这是痛处
附带插件里面有个CP_Large_Sprite_Fix可以解决,但是用了以后帧速明显会拖慢。。。。。

点评

但是角色究竟有多高,什么情况下会被遮挡感觉也比较难把握。另外我这个插件遇到八方向行走问题更多。。。我也想要XP的地图。。。  发表于 2016-1-2 21:03
看了一下,其实可以考虑把第一种方法用上,不过设置为1 , 然后如果需要遮盖就把上面这个消失掉,这样可以避免不少计算,不过效果可能不好  发表于 2016-1-2 20:46
估计参考xp的那种把所有图块都用sprite绘制,靠z值和y值控制高下效果 会效率更低.......  发表于 2016-1-2 20:40
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-11-28 21:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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