gpt4 book ai didi

interface - Nim - 创建实现方法的对象序列

转载 作者:行者123 更新时间:2023-12-04 16:34:50 25 4
gpt4 key购买 nike

我想编写一个游戏,并想为多个实体使用组件模式。

在具有接口(interface)/类型类/多重继承的语言中不会有问题。

我希望某些实体是可更新的但不可渲染的,而有些则两者兼而有之。

haskell :

class Updateable a where
update :: Float -> a -> a

class Renderable a where
render :: a -> Picture

class InputHandler a where
handleInput :: Event -> a -> a

我可以创建一个可以更新的列表。
updateAll :: Updateable a => Float -> [a] -> [a]
updateAll delta objs = map (update delta) objs

在 Java/D/... 这可以通过接口(interface)实现
interface Updateable {
void update(float delta);
}

// somewhere in a method
List<Updateable> objs = ...;
for (Updateable o : objs) {
o.update(delta);
}

现在我想知道如何使用多种方法在 nim 中实现这一点。

拟合多方法的存在可以用类型表示吗?
var objs: seq[???] = @[]

编辑:添加了更多代码并修复了不正确的 Haskell 示例

最佳答案

我不确定这是否能回答你的问题,但值得一提。

如果您要根据类型将游戏对象存储在单独的列表中,您仍然可以编写很多通用逻辑。由于预读和分支预测,按类型存储对象具有更好的性能。看这个讲座,来自一个应该知道他在说什么的人:Multiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves .

例如,如果您定义了 texture proc 为你的一些对象类型,然后你可以写一个通用的 draw(t: T) = magicRenderToScreen(texture(t)) proc 这将适用于所有人。如果您正在实现资源池或任何类型的一般行为,这也很有用。

您确实必须以某种方式在渲染和更新循环中包含每个受影响的对象类型,但这在实践中通常不是什么大问题。您甚至可以使用一个简单的宏来减少冗长,因此您的渲染循环只包含类似 renderAll(players, enemies, sprites, tiles) 的内容。

通用列表在编译语言中并不简单,并且 nim 会强制您查看它,这在您开发游戏时非常有用。要拥有通用列表,您通常要么必须使用指针和动态调度,要么使用某种联合类型。我似乎记得 nim 曾经能够从父对象 ref 分派(dispatch)到正确的多方法(这将使列表能够包含多种类型并在运行时动态分派(dispatch))但老实说我不确定这是否仍然可以完毕...?

有更懂的人请告诉我们!

关于interface - Nim - 创建实现方法的对象序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com