通常来说,只要谈到影子及影子制作,首先想到的不外乎3D。游戏中的影子设计大致可分为硬实现和软实现两种,比如像“游戏影子制作技术”这篇文章所谈到3D游戏影子制作方案Projective Shadow、Shadow Map以及Shadow Volume均属于硬实现。硬实现的效果最逼真,相对的运算量也较高;而对于Silverlight开发2.5D网游来说,我们通常会采用折中的软实现去表述场景中的动态光影效果。精致的光影能让玩家充分体验到空间立体感,当然也是2.5D网游所不可或缺的条件之一。

Silverlight 2.5D网游中的光影效果软实现主要采用模拟仿真方法,传统的处理方案大致有三种:

一)垂直照射的固定圆影。我们可以假想当角色被头顶上的光源所照射时会产生圆形光影,游戏中我们仅需一个圆影素材,根据角色的占地比例进行缩放匹配,2.5D立体效果立刻显现(此方案性能最佳):

二)基于纸娃娃系统的动态光影。原理也很简单,就是将影子作为角色纸娃娃的部件之一根据角色的实时动作与其他部件进行动态组合。以增加美术的工作量为代价换取程序设计简单化(此方案性能一般):

三)动作同步映射的动态光影。与上一种方法所达到的效果一致,区别在于此方案我们无需额外的影子图片资源,而是通过Silverlight内置的WriteableBitmap配合上OpacityMask(透明蒙版)来实现,比如类似如下逻辑:

                WriteableBitmap writeableBitmap  =   new  WriteableBitmap(role.OverallWidth, role.OverallHeight);
                writeableBitmap.Render(role.Entity,  null );
                writeableBitmap.Invalidate();
                Rectangle rectangle  =   new  Rectangle() { Width  =  role.OverallWidth, Height  =  role.OverallHeight, Fill  =   new  SolidColorBrush(Colors.Black) };
                rectangle.OpacityMask  =   new  ImageBrush() { ImageSource  =  writeableBitmap };

大致思路是首先创建一个角色最大可能面积时的尺寸作为宽、高的WriteableBitmap对象;然后将该角色的实体部分(除去名字、血条等的外形部分)绘入WriteableBitmap中;最后再将该WriteableBitmap作为与其尺寸一致的黑色矩形的透明蒙版图像源。将整个逻辑置入角色的动作切帧方法(事件)中,一个黑黝黝的实时影子便会横空出世。当然,此时的影子还需要按照假想的场景光源位置进行偏移才能达到最终的模拟仿真效果。在Silverlight中实现透视和扭曲变形不外乎两种方案:TransformGroup和PlaneProjection。本节中我选择使用后者来实现目标:

                    shadow.Projection  =   new  PlaneProjection() {
                        GlobalOffsetX  =   - p.X  +  shadow.Center.X,
                        GlobalOffsetY  =   - p.Y  +  shadow.Center.Y,
                        LocalOffsetX  =   - 48 ,
                        LocalOffsetY  =   92 ,
                        RotationX  =   86 ,
                        RotationY  =   7.6
                    };
                    shadow.Opacity  =   0.5 ;

PlaneProjection的变换参数多达12个,相当强大,任意基于平面的3D透视效果都可轻松实现(此方案最真实,相应的内存占用多且性能较差):

其实,对纸娃娃系统或真实的3D模型来说,合理的运用动态光影,同时兼具性能与体验是非常值得研究的环节。比如《星辰变》的处理手法,仅对主角玩家进行时时的动态光影渲染,而其他所有角色,包括NPC、玩家、怪物等则均采用简单的基本圆影,不失为优秀的设计方案:

最后需要指出的是,如果计划为游戏添加全局的阴影开关/切换功能,建议编写一个单独的阴影管理器作为所有角色影子的存放和管理容器,而不是将影子内置到角色控件中。本节源码我对场景部分进行了重构,层次更显分明。最底层为背景地图,采用400*400切片依据主角所处位置动态加载,相关参数为屏幕分辨率(通过调用Javascript的 screen.width 和 screen.height函数获取)以及OOB模式时的窗口尺寸;往上一层便是阴影层,角色移动及动作变换时都会触发与其ID一致的影子同步行动,当然前提是该角色在以主角为中心的屏幕范围内(Visible);再往上一层便是场景空间层(Space),一切角色、动画、遮挡等均处于该层中,毕竟它们需要交互彼此之间的Z层次关系。

本节源码请到目录中下载

在线演示地址:http://silverfuture.cn

原文链接: http://www.cnblogs.com/alamiye010/archive/2011/02/26/1966006.html

转载于:https://my.oschina.net/chen106106/blog/43603

Silverlight 2.5D RPG游戏技巧与特效处理:(三)动态光影相关推荐

  1. Silverlight 2.5D RPG游戏技巧与特效处理(Game Effects):目录

    以当下主流的2.5D RPG客户端品质游戏特效为借鉴,以最大程度控制性能损失为前提,将Silverlight游戏资源占用最小化,综合效果及用户体验最优化,即本系列作者想要向大家讲解的核心技术知识. 本 ...

  2. Silverlight 2.5D RPG游戏技巧与特效处理:(二十一)自定义路径动画

    一直在想应该用什么作为<Silverlight 2.5D RPG游戏技巧与特效处理系列教程>的终结,既要实用而不拖泥带水:又要通用而不哗众取宠.于是一不小心便成就了我一个未了心愿:一切基于 ...

  3. Silverlight 2.5D RPG游戏技巧与特效处理:自定义路径动画

    一直在想应该用什么作为<Silverlight 2.5D RPG游戏技巧与特效处理系列教程>的终结,既要实用而不拖泥带水:又要通用而不哗众取宠.于是一不小心便成就了我一个未了心愿:一切基于 ...

  4. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统

    Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手  来源: 博客园  发布时间: 2011-04-19 11:18  阅读: 1282 次  推荐: 0 ...

  5. Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画

    或许大家依旧对上一节中的"黑夜"及"梦回过去"记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供D ...

  6. Silverlight 2.5D RPG游戏技巧与特效处理:HLSL渲染动画

    或许大家依旧对上一节中的"黑夜"及"梦回过去"记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供D ...

  7. 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画...

    或许大家依旧对上一节中的"黑夜"及"梦回过去"记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供D ...

  8. Silverlight 2.5D RPG游戏技巧与特效处理:(十二)魔法系统

    全球首款Silverlight – MMORPG:<<窝窝世界>>震撼登场!伴着与XNA合体后的Silverlight 5 强势发布,一波Silverlight网游研发海啸即将 ...

  9. 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(十二)魔法系统

    世界首款Silverlight – MMORPG:<<窝窝世界>>震撼登场!伴着与XNA合体后的Silverlight 5 强势发布,一波Silverlight网游研发海啸即将 ...

  10. Silverlight 2.5D RPG游戏技巧与特效处理:(十五)任务剧情

    任务是贯穿游戏剧情发展的核心线索,具有极强的多元性.组合性.循环性与随机性:它的设计原则浓缩起来便是:触发-执行-完成.别小看这短短6个字,里面的学问可大了,由什么触发.如何触发的,因素很多:怎样执行 ...

最新文章

  1. 枚举算法 C语言 试题,求代码:如图大体思路是,用枚举法,一个个的试,碰到非的情况从...
  2. Fire uva 11624
  3. Nginx打开目录浏览功能(autoindex)以及常见问题解决方案
  4. 电子信息工程班徽设计_蜻蜓AI说专业:与5G时代息息相关的电子信息工程专业怎么样?...
  5. python xlwt xlrd 写入一行_自己总结python用xlrd\xlwt读写excel
  6. [js] document.domain的作用是什么?它有什么限制?
  7. linux内存机制的virt,关于linux:转载理解virt-res-shr之间的关系
  8. 来!把 5000 微信好友头像拼成一张图!
  9. C语言之perror()与sterror()用法(十九)
  10. 用 new 还是用 alloc/init
  11. Orcad CIS本地库添加器件
  12. Linux搭建Weblogic集群
  13. python能做什么有趣的东西-Python 里itchat 模块能实现什么有趣的东西?
  14. dart语言和flutter学习——Dart语言学习
  15. PS设置图片为透明背景简单操作
  16. IMX6ULL 学习bug记载
  17. pdf服务器签章系统,PDF离线签章工具使用方法
  18. 【人生苦短,我学 Python】基础篇——字典(Day10)
  19. 一台计算机多个屏幕,一台电脑多个显示器,屏幕远程控制
  20. 计算机主机配置图示,2020台式电脑组装配置单图

热门文章

  1. 【惠普打印机有线连接实现扫描功能】
  2. 在excel中如何筛选重复数据_Excel表格技巧—如何在 Excel 中查找重复值
  3. 统计复用系统为什么避免不了排队
  4. 大咖论道,共建中国金融信创生态蓝图
  5. 计算机网络知识点笔记
  6. 物联网在智慧农业中的应用
  7. Spring Boot 2.2 首个里程碑版本 M1 发布
  8. Uncaught SyntaxError: Unexpected token ' in JSON at position 1
  9. 付费系列 4 - 双障碍和双触碰期权 PDE 有限差分
  10. 升级 Node 版本教程