F#单词列表相当于

时间:2014-07-02 07:27:31

标签: f# monogame f#-3.0 c#-to-f#

我刚刚开始学习F#,我正在使用Monogame创建一个简单的游戏来帮助自己学习该语言的各种功能。我已经启动并运行了窗口,并且基本绘图工作(我可以在屏幕上绘制一个对象)。

我目前的目标是在n层上使用不同的2D纹理绘制场景。例如,第1层可以拥有玩家,第2层可以拥有场景项目,例如树木和岩石,第3层可以拥有背景中的山脉。第n层可以有n个项目。订单在现场级别很重要,但(目前)在层级别无关紧要。

在C#中,我会使用“列表字典”执行类似下面的操作,字典键是图层,列表是在该图层上绘制的项目。然而,经过一些搜索,我一直无法找到相同的“功能”方式。当然,我很容易引入并使用.NET集合,但是在我跳转之前,我想学习功能方法。

注意,下面的代码示例是伪代码,不会编译(例如,Texture2D没有X或Y组件)。它只是为了说明一般代码流程。

public class Game
{
    var items = new Dictionary<int, List<Texture2D>>();

    public void Initialize()
    {
        items.Add(1, new List<Texture2D>());
        items.Add(2, new List<Texture2D>());
        items.Add(3, new List<Texture2D>());

        items[1].Add(playerOneTexture);
        items[3].Add(jaggedMountainsTexture);
        items[2].Add(rocksTexture);
        items[3].Add(rollingHillsTexture);
        items[1].Add(playerTwoTexture);
        items[2].Add(treeTexture);
    }

    public void Update
    {
        //Example of update (in this case, just move stuff to the right)
        foreach(var key in items.Keys)
        {
            foreach(var texture in items[key])
            {
                texture.X++;
            }
        }
    }

    public void Draw
    {
        var layers = items.Keys.ToList.Sort(); //Or other appropriate sort function
        foreach(var layer in layers)
        {
            foreach(var texture in items[layer])
            {
                DrawToScreen(texture);
            }
        }
    }
}

问:在F#中解决此问题的功能方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为最好的方法是使用F#dictslists

一些简单的例子:

let items = dict [1,[playerOneTexture;...]...]

let update = items.Values 
|> Seq.iter (fun t -> t |> Seq.iter (fun q -> do something here

F#dictlist功能类似于他们的C#等效功能,除非它们是不可变的