我正在写一个Hubnet应用程序,我希望每个客户端的视图依赖于我能看到的客户端变量乌龟的海龟。特别是我想隐藏所有海龟,而不是在她的客户海龟身上。
我设法通过检查Hubnet控制中心中的“客户端上的镜像2D视图”框并添加以下代码来实现此功能
ask turtles[hubnet-send-override [user-id] of self turtles "hidden?" [true]]
ask turtles[hubnet-send-override [user-id] of self [turtlesicansee] of self "hidden?" [false]]
虽然目前似乎有效,但我对代码有两个问题:
1)如果我可以在第二行中获取turtlesicansee的补充(并将false切换为true),则第一行是多余的。有没有办法做到这一点,有效地说我想隐藏所有海龟而不是turtlesicansee?
2)我不确定第二个陈述中的量化。我想告诉每个海龟(客户),她能看到的唯一海龟是HER turtlesicansee的乌龟。这是我得到的吗?让我感到困惑的部分原因是我要求海龟发送覆盖信息,但我真的不明白为什么这条消息来自哪个乌龟很重要(但我还没弄明白如何在没有问乌龟命令)
无论如何,有人可以帮我这个吗?
答案 0 :(得分:2)
关于补充和补充第一行的必要性(告诉每个客户隐藏所有的海龟)
首先,我假设...... 1)模型中的每只乌龟都与一个hubnet客户端(学生)相关联 2)模型中没有其他海龟或各种海龟。 3)代理商" turtlesicansee"是一个随时间变化的乌龟变量
鉴于这些假设,获得turtlesicansee补充的一种方法是
let onesicantsee turtles with [ not member? self turtlesicansee ]
这将创建一个临时变量与turtlesicansee的补充。
所以,你可以通过说:
来做更少冗余的两个命令ask turtles[
let onesicantsee turtles with [ not member? self turtlesicansee ]
hubnet-send-override user-id turtlesicansee "hidden?" [false]
hubnet-send-override user-id onesicantsee "hidden?" [true]
]
但是,在客户端设置覆盖(至少在我的理解/心理模型中)并不昂贵。它实际上并没有导致某些事情发生,它设置了一个"过滤器"在下一个显示更新。所以,你的原始代码并不是那么糟糕。你需要操纵所有海龟的过滤器行为,你的方法实际上可能比我在这里写的更快。
关于"逻辑"的问题HubNet的命令在这里,以及你的一部分让我感到困惑的一部分......"注意。我同意,这很奇怪。 " hubnet-send-override"命令可以在ask-turtles区块之外发出。但在这种情况下(在大多数情况下)你需要个性化"过滤器"通过使用他们的用户ID和他们的turtlesicansee变量到每个乌龟(学生)。因此,在问龟中执行命令会依次为每个学生设置这些变量的范围。 [这有意义吗?]