F# 游戏编程与WPF

Ryan Cavanaugh,不是那个著名的Banjo 演奏家,而是在VSPro Tools组的一位同事,他帮助我做成了一个叫做BurnedLand的炮兵游戏。(假如您可以从中捕捉到细微的参考,那是我的荣幸。)为了玩这个游戏,当您开火的时候,您需要调整你的力量、角度,和炮弹的质量,这样会很有希望命中红罐。

替换图片

在这篇文章中,我想强调这个工程如何充分利用了下面三个方面的优势:

•F# 工程系统

•度量单位

•WPF 和数据绑定

F# 工程系统

并不是把所有的代码汇集成一个单一的工程,我把游戏的逻辑分离到一个F#库,剩下所有的UI用C# WPF应用程序来实现。由于现在的F#工程系统支持项目到项目的引用,所有的都如您期望的那样。如果您曾经在以前的MSR Research releases 尝试过多项目开发,你知道过去是多么的痛苦。

另外,检查下面美丽的新F#图标!

替换图片

 

度量单位

为了计算这些加农炮弹的弹道轨迹, 你需要把重力、速率、位置、时间等元素包含进去。

使用F# 中的度量单位来确保在编译时就能仔细检查出数学运算中的逻辑错误。(详细信息请参考Andrew的博客)

替换图片

下面是一个简单的示例。请注意一个单位为<m/s^2>的值乘以一个单位为<s>*<s>的值将得到一个单位为<m>的值。

替换图片

Windows Presentation Foundation(也就是WPF)

WPF中一个重要的功能是数据绑定。当游戏逻辑模块中的值发生变化时,您可以使用WPF中数据绑定的功能,而不是通过编程来实现更新UI,这样UI将在无人工干预的情况下实现数据同步。

举个例子,用F#编写的游戏逻辑模块,为Wind添加三个简单的属性来更全面的描述它。

// ----- Wind -----
member this.Wind with get   =m_wind
                 and  set x = m_wind <- x
                             m_PropertyChanged.Trigger(this, new PropertyChangedEventArgs( "Wind" ))
                             m_PropertyChanged.Trigger(this, new PropertyChangedEventArgs( "WindSpeed" ))
                             m_PropertyChanged.Trigger(this, new PropertyChangedEventArgs( "WindAngle" ))

member this.WindAngle = Math.Atan2(float this.Wind.Y,float this.Wind.X) * (180.0 / Math.PI)
member this.WindSpeed = String.Format( "{0:0.0} m/s" , this.Wind.Length)

通过使用WPF中的数据绑定,这些数据会被自动的更新。事实上,一旦Wind的属性发生变化,位于游戏逻辑类中的PropertyChanged事件会被触发,从而更新UI元素。

<pre class="html" name="code"><pre class="html" name="code"><!-- Wind indicator -->
 <Grid Width="{Binding DefaultBounds.Width}">
        <Border Width="60" Height="60" BorderBrush="White" CornerRadius="60" RenderTransformOrigin="0.5,0.5">
            <TextBlock Text="-->>>" HorizontalAlignment="Right" VerticalAlignment="Center"
                      FontSize="6"
                      Foreground="White" Margin="-8" />
            <Border.RenderTransform>
                 <RotateTransform Angle="{Binding WindAngle}" />
            </Border.RenderTransform>
        </Border>
   <TextBlock Text="{Binding WindSpeed}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" />
</Grid>

 

因此在WPF中这个“{BindingWindSpeed}”值确实是在调用F#的代码.

免责声明:以上所有提供的示例代码均没有任何形式的担保,不管是显示地还是隐示地,包括但不仅限于针对特定用途的适销性和/或适用性的暗示担保。所以换句话说,如果链接的源文件给你带来任何的不便或痛苦,我或Microsoft均无责任。

 

BurnedLand-v1.0.zip

原文链接:http://blogs.msdn.com/b/chrsmith/archive/2008/09/04/simple-f-game-using-wpf.aspx

 

posted @ 2011-12-30 10:29  tryfsharp  阅读(368)  评论(0编辑  收藏  举报