Silverlight C# 游戏开发:草动系统(二)随风而动

简介:

上一个草动效果是完全的随机摇摆效果,并没有特定的规律,看起来不是很自然,在实际的游戏进行过程当中,玩家并不太注意是否真的和现实世界一模一样,但是作为开发者,没有理由拒绝极致,这一次咱们一起做一个风吹过的草动效果。
 


真实中的风动效果,如下示意图,是一种类似波动的形象,当然了,风完全看不到,那么为了达到这个效果,应该从一个方向吹过,然后产生摇摆。
 


问题来了,如何知道风碰到了那些草,可能最简单的方式是遍历一下所有的草,看看符合条件的就执行一下动画,但是效率不可恭维,当屏幕上超过一定数量草的时候,每次的遍历绝对是一个非常大的开销,所以可以结合以前我提出的区块式循环概念将判断操作分成块来完成,达到性能提升快速执行的效果。
区块概念如下:


将整个显示区域划分成小块,每个小块上可能没有草,可能有草,也可能有很多草,每个格子是一个List,而这些格子正好组成一个数组——元素为List的二维数组,这样做可以很清晰的知道哪些格子有哪些草,将其划分以后遍历也是非常容易。为了达到这个效果,我们写一个GrassLogic的类来组织和管理这个数组:

GrassLogic代码

  
  
  1. public class GrassLogic  
  2. {  
  3. List<Grass01>[,] GrassBuffArray;  
  4. int ArrayW;  
  5. int ArrayH;  
  6. int RangeW;  
  7. int RangeH;  
  8. public GrassLogic(int arrayW, int arrayH, int rangeW, int rangeH)  
  9. {  
  10. ArrayW = arrayW;  
  11. ArrayH = arrayH;  
  12. RangeW = rangeW;  
  13. RangeH = rangeH;  
  14. GrassBuffArray = new List<Grass01>[arrayH, arrayW];  
  15. }  
  16. public void AddGrass(Grass01 grass)  
  17. {  
  18. int ty = (int)grass.Y / (RangeH / ArrayH);  
  19. int tx = (int)grass.X / (RangeW / ArrayW);   
  20. if (GrassBuffArray[ty, tx] == null)  
  21. GrassBuffArray[ty, tx] = new List<Grass01>();  
  22. GrassBuffArray[ty, tx].Add(grass);   
  23. }  
  24. }  
 

创建这个逻辑类的时候,我们会传入数组的宽高和显示范围,用来计算草到底在什么位置,是什么归属,细心的朋友会发现grass带有了X和Y两个属性成员,我们要对Grass01控件添加相应的属性。另外我们还要为Grass01的控件增加一个动画,以前的摇摆是循环的,这次我们需要一个只执行一次的动画(故事板),打开Grass01.xaml把下面的代码添加到<UserControl.Resources>内:

Wave故事板代码

  
  
  1. <Storyboard x:Name="Ani_Wave" AutoReverse="True"> 
  2. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="LayoutRoot"> 
  3. <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
  4. <EasingDoubleKeyFrame x:Name="WaveValue" KeyTime="0:0:1" Value="10"/> 
  5.  
  6. </DoubleAnimationUsingKeyFrames> 
  7. </Storyboard> 
  8.    
  9.  
修改Grass01.xaml.cs里的代码:
Grass01类代码

  
  
  1. public Grass01()  
  2. {  
  3. InitializeComponent();  
  4. image.CacheMode = new BitmapCache();   
  5. }  
  6. public void GrassWave()  
  7. {  
  8. Ani_Wave.Begin();  
  9. }  
  10.  
  11. public double X  
  12. {  
  13. get { return Canvas.GetLeft(this); }  
  14. set { Canvas.SetLeft(this, value); }  
  15. }  
  16. public double Y  
  17. {  
  18. get { return Canvas.GetTop(this); }  
  19. set { Canvas.SetTop(this, value); Canvas.SetZIndex(this, (int)value); }  
  20. }  
  21.    
  22.  
上面的准备已经就绪,那么我们如何产生风的自然波动呢,请看下图示意:


是否有明白了呢,我们只需要做一个X的游标来标识风吹到了哪里,对此,我们需要对逻辑类做一些改造:

 

GrassLogic代码

  
  
  1. public class GrassLogic  
  2. {  
  3. List<Grass01>[,] GrassBuffArray;  
  4. int ArrayW;  
  5. int ArrayH;  
  6. int RangeW;  
  7. int RangeH;  
  8. DispatcherTimer WaveTimer = new DispatcherTimer();  
  9. public GrassLogic(int arrayW, int arrayH, int rangeW, int rangeH)  
  10. {  
  11. ArrayW = arrayW;  
  12. ArrayH = arrayH;  
  13. RangeW = rangeW;  
  14. RangeH = rangeH;  
  15. GrassBuffArray = new List<Grass01>[arrayH, arrayW];  
  16. WaveTimer.Tick += new EventHandler(WaveTimer_Tick);  
  17. WaveTimer.Interval = TimeSpan.FromMilliseconds(300);  
  18. }  
  19. int _marker = 0;  
  20.  
  21. void WaveTimer_Tick(object sender, EventArgs e)  
  22. {  
  23. _marker += 1;  
  24. if (_marker >= ArrayW)  
  25. _marker = 0;   
  26. for (int i = 0; i < ArrayH; i++)  
  27. {  
  28. List<Grass01> items = GrassBuffArray[i, _marker];  
  29. if (items == null)  
  30. continue;  
  31. foreach (var item in items)  
  32. {  
  33. item.GrassWave();  
  34. }  
  35. }  
  36. }  
  37. public void AddGrass(Grass01 grass)  
  38. {  
  39. int ty = (int)grass.Y / (RangeH / ArrayH);  
  40. int tx = (int)grass.X / (RangeW / ArrayW);   
  41. if (GrassBuffArray[ty, tx] == null)  
  42. GrassBuffArray[ty, tx] = new List<Grass01>();  
  43. GrassBuffArray[ty, tx].Add(grass);   
  44. }  
  45. public void StartWave()  
  46. {  
  47. WaveTimer.Start();  
  48. }  
  49. }  
  50.    
  51.  
加入了一个Timer来循环逻辑,按照格子逐步的推进,执行下面对应的草的动画,当推进到底的时候,从头来过,好了,基本上已经写完,可能需要在MainPage里将生成的草添加到GrassLogic逻辑中,使用AddGrass方法即可,其实这里有一些并不是很严谨的地方,例如移除之类的操作,相信各位有自己的玩法,我的方式是直接通过访问图层然后进行添加操作,移除也是如此,不过在这里不在进行这方面的讨论,请直接参看最终效果:  

源代码如下:草动系统(二)随风而动,可以通过上面的滑杆调整摆动的幅度,最高20,最低1,可以看看那种情况更加自然,人物控制使用键盘WASD

素材来自《窝窝世界》,窝窝世界是Silverlight开发的回合制MMORPG网页游戏。


本文转自nowpaper 51CTO博客,原文链接:http://blog.51cto.com/nowpaper/712376


相关文章
|
8月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
183 1
|
8月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
150 2
|
24天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
3月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
97 2
|
3月前
|
存储 分布式计算 监控
C# 创建一个分布式文件存储系统需要怎么设计??
C# 创建一个分布式文件存储系统需要怎么设计??
57 0
|
6月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
110 1
PACS源码,C#语言数字医学影像系统成品源码
|
5月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
151 0
|
6月前
|
BI 数据处理
一体化的医学实验室信息系统源码,C#LIS系统源码
面向医学实验室的一体化平台提供标本流程管理、报告发布及科室管理支持。它与HIS无缝对接,简化患者信息录入,实现检验结果实时同步。系统自动处理数据、分类样本、计算参考范围,并对异常结果预警。条码管理简化样本追踪,质控管理提升检测准确性。平台还支持数据审核发布、历史结果查询对比、灵活报表打印及统计分析等功能,辅助科室管理和试剂库存控制,加强科室间沟通协作。
一体化的医学实验室信息系统源码,C#LIS系统源码
|
7月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
91 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
6月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
63 0

相关实验场景

更多