【Silverlight】Farseer 引擎做的游戏

这是用 Farseer 物理引擎制作的一个小游戏。玩法特别简单:用鼠标控制白球的位置,尽量不要让白球碰到黑球。距离中心越远,得分越少。 using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; using FarseerPhysics.Dynamics; using FarseerPhysics.Factories; namespace SpeedGame { public class Ball { private FrameworkElement element = null; public Body Body { get; private set; } public Ball(Canvas canvas, World world, Color color, bool isDynamic) { Body = BodyFactory.CreateCircle(world, GameSettings.BallRadius, 1); if (isDynamic) { Body.BodyType = BodyType.Dynamic; Body.Friction = 0f; Body.Mass = 0f; /* * 0 = fully absorb the collision : dont bounce at all : inelastic collision * 1 = perfect reflection : fully bounce back : elastic collision */ Body.Restitution = 1.0f; Body.SleepingAllowed = false; } element = new Ellipse { Width = ConvertUnits.ToDisplayUnits(GameSettings.BallRadius * 2), Height = ConvertUnits.ToDisplayUnits(GameSettings.BallRadius * 2), Fill = new SolidColorBrush(color) }; //Add objects to Game content so it renders canvas.Children.Add(element); } public void Update() { //Move to correct location TranslateTransform TT = new TranslateTransform(); TT.X = ConvertUnits.ToDisplayUnits(Body.Position.X) - element.ActualWidth / 2; TT.Y = ConvertUnits.ToDisplayUnits(Body.Position.Y) - element.ActualHeight / 2; TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(TT); element.RenderTransform = transformGroup; } } }
另外还需要建立输入信息处理模块、计分模块等等。这里不贴代码了,自己到 源码 Input 文件夹下查看。
再说说建立过程中遇到的一些问题。
  1. 模拟环境和显示环境使用的长度单位不一致,需要对两者的单位进行转换。我这里使用的是 ConvertUnits 类进行转换的。
  2. Farseer 引擎默认设置物体运行速度是不能超过 64 的。可以在源码的 Settings.MaxTranslation 设置此参数。
  3. Farseer 引擎具有自动适应功能。长时间没有操作的时候可能会进入“休眠”状态。
  4. 默认物体碰撞是非弹性碰撞。可以通过设置 x.Body.Restitution 来决定是弹性碰撞(1)还是非弹性碰撞(0),或者介于两者之间。
这样说着建立一个游戏是挺简单的,但凡自己动手做起来,还是有一定的难度,并且有许多细节性问题需要考虑。有兴趣的朋友们赶快动手吧,利用物理引擎做一个属于你自己的游戏!
PS:此游戏只是纯属无聊才做出来的,有许多游戏细节都未考虑到。比如说计分策略就非常不够完善,有许多漏洞可以钻。还请朋友们能够多给意见和建议。本地运行测试请选择用 Debug 配置环境。
另:有没有研究过 Farseer 官方 Farseer Physics Engine 3.3.1 SimpleSamples Silverlight 的朋友,这个例子中是怎么自动的把 Body 转换成界面上 Element 的?
源码下载:http://files.cnblogs.com/Aimeast/SLSpeedGame.zip
Tags: 

延伸阅读

最新评论

发表评论