gpt4 book ai didi

animation - 如何使用 core.async 防止动画重叠?

转载 作者:行者123 更新时间:2023-12-02 10:21:00 25 4
gpt4 key购买 nike

我有这个循环处理角色的动画 - set-image! 只需要一个键并显示适当的图像。

(defn main-animation-loop []
(go (while true
(set-image! :normal)
(<! (timeout 8000))
(set-image! :blink)
(<! (timeout 150)))))

每隔一段时间,角色就需要做一些特殊的 Action 。这应该能够中断主动画:

(defn dance! []
(go (set-image! :look-left)
(<! (timeout 1000))
(set-image! :look-right)
(<! (timeout 1000))
(set-image! :wave)
(<! (timeout 2000))))

在舞蹈 Action 发生时暂停主要动画的好方法是什么?

最佳答案

在 CSP 风格编程中,将控制 channel 传递给事件循环是很常见的,这样您至少可以告诉它们何时停止。在这种情况下,如果有一个控制 channel 转到 main-animation-loop并且您将其副本发送给 dance! ,那么舞蹈可以告诉我们main-animation-loop适本地暂停和取消暂停。或者停止它然后再次启动它(传递相同的控制 channel ,以防其他人正在使用它)。

我使用这样的模式来检查每次事件循环中的消息:

(go (while (not= control-chan
(second (async/alts! [control-chan (async/timeout arg)])))
(do-stuff-here))

这会检查是否是超时或控制 channel 导致了中断。

(defn main-animation-loop [control-chan]
(go (while (not= control-chan
(second (async/alts! [control-chan (async/timeout 150)])))
(set-image! :normal)
(<! (timeout 8000))
(set-image! :blink))))

(defn dance! [control-chan]
(go (!> control-chan :stop)
(set-image! :look-left)
(<! (timeout 1000))
(set-image! :look-right)
(<! (timeout 1000))
(set-image! :wave)
(<! (timeout 2000))
(main-animation-loop control-chan)))

通过将相同的 channel 传递给两个函数,您可以允许它们相互通信。 main-animation-loop只要它收到的所有消息都来自超时 channel ,就会一直循环。一旦它看到其中一个来自控制 channel 而不是超时,它就会停止。这允许 dance!通过向控制 channel 发送任何消息来告诉它停止。在类似的代码中,我经常让主事件循环检查消息的内容,并且执行的不仅仅是停止,尽管在这种情况下停止就足够了,因为 dance!只需再次启动事件循环即可。

关于animation - 如何使用 core.async 防止动画重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102210/

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