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

简介:

随风而动是一种感觉,能够很好的展现就已经可以,很多朋友提出了各种方法可以使得随风而动更加自然,相信都能够实现,而且效果比我的还好,写此文之目的就是开拓一下思路,能够用一些简单的方法,组合出来让人兴奋的效果,而这次,咱们让草跟着鼠标而动,仿佛是有一个无形的手在拨开草丛:)

这次我们仍然还是使用网格的区块划分,判定鼠标的经过路线,然后对草产生拨动的逻辑,请参看示意图:

这样看起来好像很简单,同样还是为了增加效率,只是对应网格上的草才会执行逻辑,鼠标移动那里就会触发,我管这个叫触动(touch),所以为了达到相应的效果,首先要对Grass01控件的动画进行改造,添加如下的代码到XAML当中的UserControl.Resources当中,这是一段touch效果的动画

Ani_Touch代码

  
  
  1. <Storyboard x:Name="Ani_Touch" AutoReverse="False"> 
  2. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="LayoutRoot"> 
  3. <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
  4. <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="-1.839"/> 
  5. <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.1"/> 
  6. <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0"/> 
  7. </DoubleAnimationUsingKeyFrames> 
  8. </Storyboard> 
 

然后为Grass01控件增加公用GrassTouch()方法,这个方法里仅仅加入了Ani_Touch.Begin()的执行。

现在针对于整个的逻辑添加对应的行为,我们可以参照上一篇的方法,再写一套Touch的逻辑比如叫GrassTouchLogic实现,但是那不是很麻烦了吗?我们发现网络数据的组成方法和基础的功能和GrassLogic很一致,所以,我们以继承GrassLogic,获得它的特性,这样仅仅将一些需要的操作数据写成protected的就可以了。

现在实现一个GrassLogicTouch的类,从GrassLogic继承:

GrassLogicTouch类代码

  
  
  1. public class GrassLogicTouch : GrassLogic  
  2. {  
  3. DispatcherTimer TouchTimer = new DispatcherTimer();  
  4.  
  5. public GrassLogicTouch(int arrayW, int arrayH, int rangeW, int rangeH)  
  6. :base(arrayW, arrayH, rangeW, rangeH)  
  7. {  
  8. TouchTimer.Tick += new EventHandler(TouchTimer_Tick);  
  9. TouchTimer.Interval = TimeSpan.FromMilliseconds(10);  
  10. }  
  11.  
  12. void TouchTimer_Tick(object sender, EventArgs e)  
  13. {  
  14. TouchTimer.Stop();  
  15. }  
  16.  
  17. public void ITouchGrass(Point pt)  
  18. {  
  19. if (!TouchTimer.IsEnabled)  
  20. {  
  21. TouchTimer.Start();  
  22. if (pt.X > RangeW || pt.Y > RangeH || pt.X < 0 || pt.Y < 0)  
  23. return;  
  24. int tx = (int)pt.X / (base.RangeW / base.ArrayW);  
  25. int ty = (int)pt.Y / (base.RangeH / base.ArrayH);  
  26. List<Grass01> items = GrassBuffArray[ty, tx];  
  27. if (items != null)  
  28. {  
  29. foreach (var item in items)  
  30. {  
  31. item.GrassTouch();  
  32. }  
  33. }  
  34. }  
  35. }  
  36. }  
  37.    
  38.  
这里其实很简单,我们使用ITouchGrass来完成触动逻辑,传入的参数就是鼠标的坐标点,但是为了避免鼠标移动的过于频繁,而造成不停的触发事件,我们加入了一个间隔为10毫秒TouchTimer来控制,达到在10毫秒内再触发的时候是无效的,这个方法一般用于类似鼠标双击的判定,但是很好用,能够降低鼠标产生的额外开销,可以修改这个值看看效果。

现在对MainPage进行一下修改:

_GrassLogic从GrassLogic变成GrassLogicTouch类

构造函数中_GrassLogic.StartWave();去掉

加入鼠标的移动事件:


 
 
  1. this.MouseMove += new MouseEventHandler(MainPage_MouseMove);  
  2.  
  3. void MainPage_MouseMove(object sender, MouseEventArgs e)  
  4. {  
  5. _GrassLogic.ITouchGrass(e.GetPosition(_Image));  
  6. }  
  7.  

很好,可能还有一些小的修改,但是大体上就只有这些,然后运行一下看看吧:

源代码下载地址在这里:草动系统(三)随鼠而动

到此草动效果已经写,也许还有更多丰富的效果,比如人走过的时候会触动草,使用技能的时候会触动草,这样的延伸之效果完全取决我们的想象力,好的事物并不一定复杂,复杂的事物不一定就是好,当我们写下长长代码的时候,是否静下心来想想这些有趣的小玩意呢?细节决定成败,至此特别向深蓝色右手表示深切的感谢,让我们将Silverlight之光炫耀起来。



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

相关文章
|
5月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
164 1
|
5月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
96 2
|
14天前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
47 2
|
14天前
|
存储 分布式计算 监控
C# 创建一个分布式文件存储系统需要怎么设计??
C# 创建一个分布式文件存储系统需要怎么设计??
25 0
|
3月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
PACS源码,C#语言数字医学影像系统成品源码
|
2月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
60 0
|
4月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
76 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
3月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
36 0
|
3月前
|
C#
C#中使用IntPtr.Size属性来判断当前系统是32位还是64位
这段代码首先检查 `IntPtr.Size`的值,如果是4,则输出"当前系统是32位";如果是8,则输出"当前系统是64位";如果都不是,就输出"未知系统位数"。
45 0
|
5月前
|
存储 运维 BI
基于C#-VC-MSSQL开发的全套PACS系统源码 3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升医疗水平的目地;
62 1
基于C#-VC-MSSQL开发的全套PACS系统源码  3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用