我刚刚开始学习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#中解决此问题的功能方法是什么?
答案 0 :(得分:2)
我认为最好的方法是使用F#dicts
和lists
。
一些简单的例子:
let items = dict [1,[playerOneTexture;...]...]
let update = items.Values
|> Seq.iter (fun t -> t |> Seq.iter (fun q -> do something here
等
F#dict
和list
功能类似于他们的C#等效功能,除非它们是不可变的