一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(三)动态光影

简介:   通常来说,只要谈到影子及影子制作,首先想到的不外乎3D。游戏中的影子设计大致可分为硬实现和软实现两种,比如像“游戏影子制作技术”这篇文章所谈到3D游戏影子制作方案Projective Shadow、Shadow Map以及Shadow Volume均属于硬实现。

  通常来说,只要谈到影子及影子制作,首先想到的不外乎3D。游戏中的影子设计大致可分为硬实现和软实现两种,比如像“游戏影子制技术”这篇文章所谈到3D游戏影子制作方案Projective ShadowShadow 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中实现透视和扭曲变形不外乎两种方案:TransformGroupPlaneProjection。本节中我选择使用后者来实现目标:

 
 
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透视效果都可轻松实现:

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

  本节源码下载地址:Demo2.rar

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

目录
相关文章
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
284 8
|
人工智能 前端开发 开发工具
NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践
.NET技术自2000年推出以来,在软件开发领域扮演着关键角色。本文从核心优势出发,探讨其统一多语言平台、强大工具集、跨平台能力及丰富生态系统的价值;随后介绍.NET在企业级应用、Web开发、移动应用、云服务及游戏领域的创新实践;最后分析性能优化、容器化、AI集成等方面的挑战与机遇,展望.NET技术的未来发展与潜力。
347 2
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
278 0
|
搜索推荐 C# Windows
一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)
一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)
648 0
|
XML API 数据格式
十九、.net core使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口
使用SoapCore实现在.net core平台下开发webservice;以及使用HttpClientFactory动态访问webservice。首先,需要在包项目下面引用SoapCore:
1965 0
十九、.net core使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口
|
存储 程序员 定位技术
使用 .NET 标记游戏地图关键坐标点
本文以天涯明月刀 OL 游戏的云上之城探索玩法为例,介绍如何使用 .NET 在游戏地图中标记大量关键坐标点。
445 0
使用 .NET 标记游戏地图关键坐标点
.net实现动态验证码
绪论:本文是.net实现动态验证码的显示,需使用到一般处理程序(ashx)
481 0
.net实现动态验证码
|
开发框架 .NET
.net 动态修改web.config 中appSettings节点中的值
.net 动态修改web.config 中appSettings节点中的值
319 0
|
API 数据库 关系型数据库
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这时候就在想能不能实现动态的选择使用哪种实现呢?如果可以的话那么我只需要在配置文件中进行相应的配置即可获取到正确的实现方法的调用,这样的话岂不快哉!今天我们就来一起探讨下实现这种需求的几种实现方式吧。
2168 0
|
SQL JSON 前端开发
.NET+Ajax+ashx 实现Echarts图表动态交互
前言:   使用Echarts展示图表效果,在这里只做了四种案例:折线、柱状、圆形、雷达。当初是一位朋友用到Echarts展示数据,他没有太多时间弄,所以我就帮他搞出来,当初刚接触的时候也是一头雾水,不知道该怎么下手,网上类似的案例有也不多,并且不是自己想要的效果。
2043 0