这里讲的是关于2D游戏的角色和背景以及物体之间的遮挡关系,用半透明角色处理的讨论和实现方式。这里主要是讨论关于页游《火影忍者》里对于角色和背景物体之间的遮挡处理方式。同时也实现了和他一样的效果(可能)。具体是没分析火影的代码,只是猜测了它的原理然后进行实现的。其他的几种实现方式则简单的讨论,一笔带过(如果有人有兴趣,可以留言,我再单独写篇Blog和相关例子来)
实现语言:ActionScript3.0(传统的显示处理,Stage3D可以做到有些不一样,所以不在讨论范围)
心急的读者可以直接从第三点开始看我们今天的主题实现内容。

一、需要实现遮挡关系的原因

个人推测和分析,不妥之处请之处讨论。
1. 因为AS3传统显示2D图像的时候,没有zbuff缓冲这个概念,所以显示图像的层次关系,是按照addChild的顺序来的.
2. 为了实现最大的渲染效率,一般美术会把游戏场景渲染成大的一张图片,然后再切割成小块进行加载显示。整个场景的所有元件,包括背景、树、建筑、河流等等,都是渲染出一张图。
那么问题来了,建筑和背景树等物体都渲染地图上,那人物走过来的时候,这个时候的遮挡关系怎么处理呢?所以就会衍生出各种处理这种遮挡关系的技术了。

二、角色物体遮挡的几种做法

首先简单讨论几种实现方式。
1. 和角色同层,根据深度重新设置addChild
这是比较消耗性能的做法,也是早期很多游戏的做法,表现效果也很好。同时也是一些3D游戏场景的做法(3D有zbuff缓冲)。出一个地图编辑器,然后把导入背景,把各种元件(树、建筑等等)拖到场景去,最后导出。在游戏中人物就和元件参与深度排序,处理遮挡关系。
现在一般是采用后面的两种做法了,在一些特别需要表现力的时候,才会单独做成元件,不然都是合在背景里了。

2. 地图编辑器打格子表明走到的角色半透
这个是页游红极一时的做法,大部分rpg和arpg都是这么做的。比如《凡人修真2》和雄霸页游天下的《传奇霸业》,下面传奇霸业的表现效果(刚截的图)。

具体的实现方式大概走格子走到这个建筑的时候,会检测格子的属性,如果带有半透效果的参数,则设置角色的alpha值。
3. 背建筑遮挡的部分才半透,效果高大尚。
读者:这个是3D做法吧!
当然不是了,通过2D图像混合一样可以做到。(原理估计也是3D那一套。就是提供的遮罩图来擦出下面的的图片)。这个算是比较新颖的做法,目前我就看腾讯的《火影忍者》,其他的就暂时没去查看了(我自己做的游戏是采用这个最新的做法,潮流嘛)。
开始还担心性能会比较大损耗,做了简单测试,发现没什么影响。先看火影里的表现效果吧

仔细看红框里的那个角色,可以发现角色被那个柱子挡住的一半是半透明效果,没挡住的就是原来的颜色。简直酷毙了!
立马把火影的缓存搞下来,发现它是加了背景遮罩图,然后类似3D混合图形的做法实现的。后来会详细地讲。(啰嗦了这么久,终于开始正题了)

三、火影的角色遮挡半透实现分析

仔细分析了火影的新手村场景,从缓存了除了提取出背景之外,还有另外一些黑色的古怪图片。背景还是跟其他游戏的做法,古怪的是那个黑色怪图。发现是背景里的一些建筑物的黑色图。下面是缩略图。

刚开始还以为是逐像素匹配,自己手动实现的(可以做到的),但是效率会残不忍堵。另外想到的就是3D里
常用的图像混合处理了。查下AS3的Bitmap的API,还真查找到了。这里只列出会用到的API。

DisplayObject.blendMode属性
BlendMode 类中的一个值,用于指定要使用的混合模式。

用到了BlendMode类的两个属性

LAYER : String = "layer"
[静态] 强制为该显示对象创建一个透明度组。
ERASE : String = "erase"
[静态] 根据显示对象的 Alpha 值擦除背景。

其他的API也有趣,有兴趣的同学可以试试。

四、角色遮挡半透的实现的例子资源

整理了一下相关使用到的资源。实际上问过美术,美术说出这个遮罩图非常容易。我们也实际出了相关的资源。
1. 背景图
把火影的背景图给拼起来,合成一张1274 * 768的大背景图方便测试
2. 透明背景遮罩图
同样把透明遮罩剪切出和背景对应部分截取出来,然后对好位置。这个图的透明度决定了角色的显示效果
3. 角色资源图

五、简单的代码实现原理过程

  1. 背景层独立出来,不参与图像混合
  2. 角色和透明遮罩单独一个容器层,但是这两种都在同一个容器A中
  3. 容器A的blendMode属性设置为:
//强制为该显示对象创建一个透明度组
blendMode=BlendMode.LAYER;
  1. 角色容器不用设置blendMode,因为在容器A中设置就可以了
  2. 透明遮罩这个Bitmap需要设置
blendMode=BlendMode.ERASE;

确保透明遮罩Bitmap在角色容器的上层就可以了。下面是具体的代码实现过程。

六、详细的代码

看代码实现起来非常简单,代码也非常简洁

package
{import flash.display.Bitmap;import flash.display.BlendMode;import flash.display.Sprite;import flash.events.Event;import flash.events.MouseEvent;/*** 地图透明角色测试例子*@author sodaChen* Date:2017-2-16*/[SWF(width="1274",height="768")]public class AlphaMapTest extends Sprite{/** 背景 **/[Embed(source = "res/alpha/bg.jpg")]private var bgClass:Class;/** 透明遮罩背景 **/[Embed(source = "res/alpha/alphaBg.png")]private var alphaBgClass:Class;/** 角色 **/[Embed(source = "res/alpha/role.png")]private var roleClass:Class;/** 角色容器 ,用来存放角色和透明图像的**/private var roleContainer:Sprite;/** 角色层,只放角色 **/private var roleLayer:Sprite;public function AlphaMapTest(){super();addEventListener(Event.ADDED_TO_STAGE,onStage);}private function onStage(evt:Event):void{//添加背景addChild(new bgClass());//添加角色容器roleContainer = new Sprite();//强制为该显示对象创建一个透明度组roleContainer.blendMode = BlendMode.LAYER;addChild(roleContainer);//创建角色层,其实角色可以不用单独容器,但是必须保证alphaBg在所有角色的最上面roleLayer = new Sprite();roleContainer.addChild(roleLayer);//创建角色并添加到角色容器中createRole(300,120);createRole(230,550);//不会被遮挡的角色createRole(400,200);//根据显示对象的 Alpha 值擦除背景.这个透明图像必须在最顶层,确保下面的角色会被擦出var alphaBg:Bitmap = new alphaBgClass();alphaBg.blendMode = BlendMode.ERASE;roleContainer.addChild(alphaBg);}//创建角色private function createRole(roleX:int,roleY:int):void{var role:Sprite = new Sprite();var roleBitmap:Bitmap = new roleClass();role.x = roleX;role.y = roleY;role.addChild(roleBitmap);roleLayer.addChild(role);role.addEventListener(MouseEvent.MOUSE_DOWN,onMouse);role.addEventListener(MouseEvent.MOUSE_UP,onMouse);}private function onMouse(evt:MouseEvent):void{var role:Sprite = evt.currentTarget as Sprite;if(evt.type == MouseEvent.MOUSE_DOWN)role.startDrag();elserole.stopDrag();}}
}

最终实现的效果图:

例子代码下载:
2DAS3游戏地图角色遮罩

页游《火影忍者》角色和背景遮挡半透明效果的实现相关推荐

  1. 角色和背景遮挡半透明效果的实现

    这里讲的是关于2D游戏的角色和背景以及物体之间的遮挡关系,用半透明角色处理的讨论和实现方式.这里主要是讨论关于页游<火影忍者>里对于角色和背景物体之间的遮挡处理方式.同时也实现了和他一样的 ...

  2. 底部弹出PopupWindow并且背景变为半透明效果

    来自:http://blog.csdn.net/LANG791534167/article/details/48985101 先来看看运行效果图 [方式一]实现从底部弹出PopupWindow 原理: ...

  3. css背景图片半透明效果

    css 设置背景色半透明效果,参数 background:rgba(x,x,x,x) 最后一个a表示半透明,取值是0-1

  4. 火影忍者手游服务器维护要多久,火影忍者回归木叶多久一次 | 手游网游页游攻略大全...

    发布时间:2016-06-02 九月,全球唯一正版授权火影网游又将迎来新的成员--九月签到忍者奈良鹿丸[忍界大战]与十五年火影忍者人气最高忍者宇智波鼬的[暗部] 形态.同时,中[跨服忍界大战] ... ...

  5. html 游戏 背景音乐,页游广告背景音乐大全_最新页游广告背景BGM音乐大全_快吧游戏...

    在前面的我是大主宰这款游戏广告背景音乐风暴过程中,相信很多小伙伴都找到了许多许多好听的音乐,那么你还想要更多的音乐吗?下面快吧犀利哥就为大家汇总了那些出现在网页游戏广告中的音乐,相信你能够在下面的音乐 ...

  6. 页游中的十大经典游戏题材

    http://xin.07073.com/jiedu/976904.html 武侠题材 "飞雪连天射白鹿,笑书神侠倚碧鸳",豪侠们把酒高歌.快意江湖才是武侠的真谛神髓.在武侠题材的 ...

  7. 妖哲的日常3 QA前线——讨伐!全自动页游

    今天下载了一个微端页游,算是讨伐QA之路的第一步. 登入篇 宣传界面 传统页游都这个套路,美女波霸--反正就是谁大谁用户多的时代.但是这尼玛前端设计师也好歹仔细设计一下自适应好嘛?作为一个第一次接触页 ...

  8. 斗破苍穹文字页游php_浅谈斗破影视化下的网络文学二次创作

    笔者是一个网络文学爱好者,最开始接触这类文化是金庸先生笔下<神雕侠侣>的影视化作品.但是要说真正去接触文字作品的时间,是初三追连载小说<斗破苍穹>的时候. 在那之后的几年内,笔 ...

  9. 页游中的PNG图片资源的裁剪和还原

    图片资源的管理,一直是网页游戏中头疼的问题.在保持图片质量和功能实现的基础上,图片越小越有利于管理,节省带宽,给玩家带来更好的用户体验. 美术在制作图片的时候,考虑到统一性和方便性,一般会对一系列的图 ...

最新文章

  1. php生成表格和读取,phpexcelreader读取excel自动生成表跟字段
  2. 封装请求 request.js
  3. 如何修改来自ERP 系统的product category
  4. 10个小技巧助您写出高性能的ASP.NET Core代码
  5. python升级pip在哪儿打开_Linux下升级python和安装pip的详解
  6. 嵌套访问_利用Idea重构功能及Java8语法特性——优化深层嵌套代码
  7. 工业大数据实施需解决哪些问题
  8. html select ajax,AJAX 动态加载后台数据 绑定select的方法
  9. [转]反射(用反射调用任意.net库中的方法)
  10. Dynamic Web 2021Crack版,文档扫描和图像捕获
  11. 瑞星网络版杀毒软件安装部署
  12. 计算机术语中 1gb等于 mb.,GB、MB、KB分别是什么意思,大小分别是多少?
  13. 自定义log函数@2018-06-07
  14. 【mmdetection】对VOC格式的数据集进行测试
  15. 数据存储---内存列式数据库KDB+(Q)文档
  16. Android N开发 你需要知道的一切
  17. Leetcode1278
  18. 受欢迎的牛(有向图的强连通分量)
  19. 修复Java使用POI合并Excel单元格后,边框不显示的问题
  20. 会员管理小程序实战开发教程(六)-会员查询功能

热门文章

  1. xboxone修改服务器,《方舟 生存进化》XboxOne版可以搭设服务器
  2. 跨域与jsonp及cors解决
  3. python中用len函数获取列表的长度
  4. html背景颜色特别淡的那种,(HTML or CSS)白色背景颜色比我的代码的最后一部分要低...
  5. [附源码]JAVA+ssm计算机毕业设计车险管理系统(程序+Lw)
  6. Unity内置着色器
  7. n个人围成一圈 报数3 python
  8. 改led背光有光斑_2020东莞最火改灯店,东莞奥迪A6L车灯老化改灯,奥迪改激光大灯...
  9. 基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)
  10. 为什么不建议使用存储过程了