Silverlight C# 游戏开发:草动系统(一)简单的草动

简介:

昨天晚上在银光进化论谈聊到以前MU的草动效果,Goods尤其觉得很好,正巧我以前做过草动的系统,可以作为经验总结一下,最近一直纠结文章标题,正好借此发挥一下,抛砖引玉:)

以前写的草动系统都是3D的,这次写2D的确实有一些麻烦,整理思路用了很久,好在Silverlight提供了很好的动画支持,很方便的就实现了一个简单的草动效果。

首先很简单,建立一个Silverlight4的项目:GrassTest01

工程的.Web项目叫GrassShow.Web,我想以后可能还有GrassTest02,03,04……

准备好地面和草(资源来自:《窝窝世界》)


创建一个控件叫Grass01,将图片添加到控件中,我的Blend已经过期,只好使用代码来实现这个过程,请参看代码:

 

Grass01控件代码

  
  
  1. <UserControl x:Class="GrassTest01.Grass01" 
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  6. mc:Ignorable="d" 
  7. d:DesignHeight="300" d:DesignWidth="400"> 
  8. <UserControl.Resources> 
  9. <Storyboard x:Name="Ani_Def" RepeatBehavior="Forever" AutoReverse="True"> 
  10. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="LayoutRoot"> 
  11. <EasingDoubleKeyFrame KeyTime="0" Value="1.621"/> 
  12. <EasingDoubleKeyFrame KeyTime="0:0:1" Value="-1.839"/> 
  13. </DoubleAnimationUsingKeyFrames> 
  14. </Storyboard> 
  15. </UserControl.Resources> 
  16.  
  17. <Canvas x:Name="LayoutRoot"> 
  18. <Canvas.RenderTransform> 
  19. <CompositeTransform/> 
  20. </Canvas.RenderTransform> 
  21. <Image x:Name="image" Source="/GrassTest01;component/Res/Grass01.png" Canvas.Left="-25" Canvas.Top="-77" RenderTransformOrigin="0.5,0.9"> 
  22. </Image> 
  23. </Canvas> 
  24. </UserControl> 
 

上述代码其实使用Blend很容易实现,可惜对于我来说只有使用这个暴力方法了:)
需要特别说明两个部分,一个是动画摇摆部分:动画摇摆幅度可以通过修改DoubleAnimationUsingKeyFrames中的EasingDoubleKeyFrame来修改。另外一个是摇摆的主体,本来我想直接摇动Image,结果发现不太直观,尤其是RenderTransformOrigin的对齐,所以我直接将摇摆的动画设置到LayoutRoot,这样从根点就可以看到效果了,这是一个非常好的方法,原点可以将很多的资源元素产生的偏移点问题解决。


由于动画不会自动启动,需要在Grass01.xaml.cs中添加如下代码:

Grass01 类

  
  
  1. public partial class Grass01 : UserControl  
  2. {  
  3. public Grass01()  
  4. {  
  5. InitializeComponent();  
  6. Ani_Def.BeginTime = TimeSpan.FromSeconds(MainPage._PointRandom.NextDouble());  
  7. Ani_Def.Begin();   
  8. }  
  9.  
  10. }  
 

需要特别说明的是Ani_Def.BeginTime,随机了一个启动时间,为了更好的模拟草的随机性,而MainPage._PointRandom是一个静态的随机种子,让随机性更高。
然后就是生成,这个比较简单就是种草而已,只需要在MainPage.xaml.cs中加入代码:

代码

  
  
  1. public static Random _PointRandom = new Random((int)DateTime.Now.Ticks);  
  2. public MainPage()  
  3. {  
  4. InitializeComponent();  
  5. Image Image = new Image();  
  6. LayoutRoot.Children.Add(Image);  
  7. Image.Source = new BitmapImage(new Uri(@"/GrassTest01;component/Res/Map01.jpg", UriKind.Relative));  
  8. for (int i = 0; i < 300; i++)  
  9. {  
  10. Grass01 g1 = new Grass01();  
  11. LayoutRoot.Children.Add(g1);  
  12. Canvas.SetLeft(g1, _PointRandom.Next(50,800));  
  13. int y_PointRandom.Next(50,600);  
  14. Canvas.SetTop(g1,y );  
  15. Canvas.SetZIndex(g1, y);  
  16. }  
  17.  
  18. }   
  19.    
  20.  
我随便生成了300颗草,先看看效果:
 

动起来效果还是不错的,随机性很强,有“微风”感,可是CPU咱们可真不可恭维,简直是噩梦,相信某些“老板”看了这个效果就直接枪毙了Silverlight,什么东西啊,一个小小的草动效果就这样,开什么玩笑开发大型游戏?想想也是,咱们还是放弃算了,玩这个真的没前途。。。。
其实呢,并不是如此,只需要开启GPU加速,胜利的女神就开始向你招手了,需要添加两行代码:

1、打开Grass01.xaml.cs,添加image.CacheMode = new BitmapCache();,这里的image是你的草的Image名称,可以是任何名称

2、打开.html或者.aspx,就是承载页面找到object标签添加代码,<param name="enableGPUAcceleration" value="true"/>

这下运行再看看。

 

微风仍然吹过,看起来还是那么平静,效果似乎达到了哦:)想了解这方面更多的请参考深蓝色右手有关的GPU加速文章
我发现很多的效果并不是需要很多的代码来堆积,有的时候,使用简单的代码就能达到想要的效果,其实并不复杂,有可能仅仅是灵光一闪而已。
本次的源代码在这里下载:点击这里下载源代码

展示效果如下:(小人使用键盘WASD控制)

 

PS:小人的基础系统也不是很复杂,我取出了自己引擎中的一套实现方法,大部分开发手法都在过往的文章中写过,继续欢迎对Silverlight技术研究的朋友共同探讨,对于有一定水平的朋友欢迎加入“银光进化论谈”群9675769,加入条件有限制请了解后申请http://www.cnblogs.com/nowpaper/archive/2010/07/12/1775887.html



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

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