I’m too tired to write a proper blog post about this but I managed to port DonSyme’s Game of Life Demo that comes with the F# Distribution to Silverlight. It’s not a full port as there were some UI events that I couldn’t get to work for love nor money – I think these maybe bugs in Silverlight itself. However the game does look pretty cool. Also Silverlight currently has no way to marshal back to the UI thread which makes multithreading a bit difficult.

The game was relatively simple to port, in fact I kept the first few files, “alg.fsi”, “alg.fs” and “worker.fs” in tacked and just replaced the client.fs with the following:

#light

 

namespace SilverLife

 

open System;

open System.Collections.Generic;

open System.Windows.Browser;

open System.Threading;

open System.Windows

open System.Windows.Controls

open System.Windows.Documents

open System.Windows.Ink

open System.Windows.Input

open System.Windows.Media

open System.Windows.Media.Animation

open System.Windows.Shapes

 

type Page() = class

    inherit Canvas() as base

    member x.Page_Loaded(o : obj,  e : EventArgs) =

        let canvas = o :?> Canvas

        let gridSize = 23

       

        /// Create and configure the worker automata, ready to be placed

        /// onto a thread.

        let rec worker = Worker.mkWorker gridSize

       

        and grid =

            [| for x in 0 .. gridSize ->

                [| for y in 0 .. gridSize ->

                    let image = new Image()

                    image.Source <- new Uri("RedBloodcellOff.jpg", UriKind.Relative)

                    image.SetValue(Canvas.TopProperty, y * 14)

                    image.SetValue(Canvas.LeftProperty, x * 14)

                    canvas.Children.Add(image)

                    image |] |]

       

        and bornQueue = new Queue<Game.points>() 

        and diedQueue = new Queue<Game.points>() 

 

        // This is the refresh operation that will be invoked by the worker.

        and workerNotifyUpdates (born,died) =

            lock bornQueue (fun () -> bornQueue.Enqueue(born))

            lock diedQueue (fun () -> diedQueue.Enqueue(died))

            

            

 

        and workerThread = new Thread(start=(fun () -> worker.Start()), IsBackground = true, Priority = ThreadPriority.Lowest)

         

        worker.Updates.Add(workerNotifyUpdates)

        let dequeueAll (queue : Queue<Game.points>) image =

            while (queue.Count > 0) do

                let points = queue.Dequeue()

                List.iter (fun (x,y) -> grid.[x].[y].Source <- new Uri(image, UriKind.Relative) ) points

               

        let timer_Tick _ =

            lock bornQueue (fun () -> dequeueAll bornQueue "RedBloodcellOn.jpg")

            lock diedQueue (fun () -> dequeueAll diedQueue "RedBloodcellOff.jpg")

           

        let timer = new HtmlTimer()

        timer.Interval <- 1

        timer.Tick.Add(timer_Tick)

        timer.Enabled <- true

 

        workerThread.Start()

        ()

    member x.ClickSquare(sender : obj,  e : MouseEventArgs) = ()

end

You can see the game at the following URL (careful I’ve noticed it crashes the browser sometimes, I guess that’s what they mean by “alpha”):

http://www.strangelights.com/fsharp/silverlight/life.aspx

Of course you need the silverlight 1.1 alpha installed here’s a screen shot for those that don’t have that.

Feedback:

Feedback was imported from my only blog engine, it’s no longer possible to post feedback here.

Silverlight Cream for May 25 - http://geekswithblogs.net/wynapsetechnicalmusings/archive/2007/05/25/112762.aspx

Silverlight Cream for May 25

Game of Life in Silverlight and F# - http://blogs.msdn.com/dsyme/archive/2007/05/25/game-of-life-in-silverlight-and-f.aspx

Game of Life in Silverlight and F#

Game of Life in Silverlight and F# - http://blogs.msdn.com/walterst/archive/2007/05/27/game-of-life-in-silverlight-and-f.aspx

Game of Life in Silverlight and F#

re: Game of Life in Silverlight and F# - Richard Hein

Great stuff, I wanted to put F# and Silverlight together as well. I am looking into how to best combine this with Monorail. Cheers, Richard Hein

re: Game of Life in Silverlight and F# - Robert Pickering

Hi Richard,

Thanks for the feedback. You maybe insterested in this more detailed post I’ve just written:
http://www.strangelights.com/blog/archive/2007/05/28/1585.aspx

I’ve not actually had chance to play with the monorail stuff but I’m looking forward to see what you come up with.

Cheers,
Rob

Silverlight Examples - Michael’s Blog

During the weekend I spent some minutes to collect some of the greatest Silverlight examples. Most of

Non-Stop Mix 07 Paris - Richard J. Rothery Jr.

Robert,

Nice one F# and Silverlight!
Your are an Englishman a Paris…
I am and Amercican a Marseille…

See you at Mix 07 in Paris if you are planning to attend.

Best Regards,
Richard

【转】分享数十个silverlight示例和blog - Bryan Chow

分享几个国外的silverlight例子和blogGreatVisualStudioQuickStarts

re: Game of Life in Silverlight and F# - Sridhar Ratnakumar

I tried my best to compile, but even though I have Silverlight latest version installed I get this error -


C:\Users\srid>fsc -I “C:\Program Files\Microsoft Silverlight\2.0.30523.6” -r System.SilverLight.dll -r agclr.dll -r Microsoft.Scripting.Vestigial.dll -r System.
dll -r Microsoft.Scripting.Silverlight.dll -r Microsoft.Scripting.dll –clr-root “C:\Program Files\Microsoft Silverlight” –no-framework –no-mllib –static-lin
k fslib test.fs
Implicitly referencing ‘C:\Program Files\Microsoft Silverlight\2.0.30523.6\System.dll’…

startup(1,0): error FS0191: Unable to find the file System.SilverLight.dll in any of
C:\Program Files\Microsoft Silverlight
C:\Program Files\Microsoft Silverlight\2.0.30523.6
C:\Users\srid
C:\Program Files\FSharp-1.9.4.17\bin.

re: Game of Life in Silverlight and F# - Ray

Pretty interesting. Though, there is little to no use of F# in this example as code pretty much imperative - about just same as if it was wrote in C#…

re: Game of Life in Silverlight and F# - Robert Pickering

Hi Ray,

I agree the layer that interacts with silverlight is pretty imperative, mainly because its a UI layer, which is the sample code presented in this blog. However layers that actually drive the simulation, which come from the F# example pack are good functional style. These were distributed with F# but now need to be downloaded from:
http://code.msdn.microsoft.com/fsharpsamples

Cheers,
Rob