问题标签 [yampa]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
404 浏览

debugging - Haskell/Yampa 和 HOOD 中游戏对象的调试输出

我一直坚持使用 Haskell/Yampa (=Arrows)(使用 HOOD)为我的游戏对象生成调试输出。

我的引擎基本上运行一个游戏对象列表,这些对象生成输出状态(线、圆),然后渲染。

玩家对象只是向右移动并表示为(定位的)圆圈。

mover 只是一个简单的积分器(加速度-> 速度-> 位置),我想在其中观察速度并将其作为调试输出渲染为(未定位的)线。

如何为我的游戏对象函数的内部值创建额外的图形调试输出?

实际应该发生的是在输出中,首先渲染实际对象(圆),但还要渲染额外的调试输出(运动矢量作为线)。可能我可以用 HOOD 实现这一点,但我仍然不熟悉 Haskell 并且不知道如何为我的案例采用 HOOD 教程。

0 投票
2 回答
301 浏览

haskell - 防止 Yampa/Animas 中的无限循环与 SF 相互依赖

我试图了解这种函数式反应式编程是如何工作的,但我遇到了一个问题。我正在尝试创建一个boid 模拟,但我开始的速度很慢,我现在已经将一个 boid 定义为一个函数,它采用一个起始位置并创建一个从一个位置到一个位置的信号函数,其中输入是点它正在移动,输出是当前位置:

seek 函数需要两个输入(因为循环)。当前位置和目标位置。然后它只是创建一个从当前位置指向目标位置的向量,其大小为 50,即速度。然后对速度进行积分并添加起始位置。最后,信号被一分为二,一个可以成为输出,另一个可以循环回搜索功能。

现在我可以像这样定义 boids:

这里 aBoid 向点 (500, 500) 寻找,而 bBoid 向 aBoid 寻找。

我的问题是,当我希望这两个 boids 互相寻找时。当我这样做时:

该程序只是打印:ProgramName: <<loop>>我认为这意味着它进入了一个无限循环。

我也尝试过使用这样的par功能:

这里route函数只是将每个 boid 的输出映射到另一个 boid 的输入(如zip,但偏移量为 1)

这也给出了<<loop>>信息。

我认为在处理反应式系统时,让对象依赖于彼此的状态应该是一个很常见的问题,所以我希望有一些优雅的解决方案。

我应该补充一点,我发现这个 FRP 东西非常困难并且经常令人困惑,所以我不确定我是否有道理;)

0 投票
1 回答
285 浏览

haskell - 使用 Yampa 和 yampa-glut 获取关键输入

AFRP 的整个主题听起来非常令人兴奋,我正在尝试在其中开始我自己的项目。我找到了Yampayampa-glut,这似乎是与 GLUT 的良好绑定(看起来,GLUT是唯一同时在 Windows 和 Linux 上运行的图形库)。

yampa-glut源码附带了一个简单的例子我复制过来学习了。然后我想扩展它,为关键事件添加一个简单的测试。它的完整来源在这里,除了第 23 行和 keys 函数外,没有什么新东西:

每当我按下或释放一个键时,预期的结果是外壳上的简单输出。但它没有发生,没有输出。

如果我将最后一行之前的行更改为:

然后我得到一些关键输入,但不是全部,很多都被跳过了。

我找不到对此的解释,所以我希望有人能向我解释我哪里出错了,我可以做些什么来获得键盘和鼠标按钮输入。

0 投票
1 回答
305 浏览

haskell - Yampa 中反应(感觉)功能的时差

我目前正在学习 Haskell 和 Yampa,并且对反应函数有疑问。

正如您在类型签名中看到的,感知函数的部分输出是函数的当前调用和上一次调用之间的时间差。在我看到的例子中,这个时间差是“手动”计算的,使用 IORef 来保持前一次调用的值。

您必须使用外部状态来跟踪时间差,这似乎很奇怪,为什么不在 reactimate 函数中进行此计算?IORef 是处理它的好方法吗?

0 投票
1 回答
243 浏览

haskell - 扬帕粒子场

我想在 Yampa 有一个粒子场。单个粒子应该只是沿直线移动,但取决于给定的角度。该角度和移动速度会根据玩家的速度和角度而变化。我不知道如何更好地解释,我正在开发类似这个游戏的东西。

无论如何,我现在的代码如下所示:

vel是当前速度,a是当前角度。但是粒子以奇怪的方式移动。(完整代码在这里

不幸的是,我确信我的想法是错误的,但我还没有弄清楚如何做到这一点,尤其是如何integral正确使用。

也许有人可以给我一些提示。

0 投票
1 回答
203 浏览

haskell - 扬帕值开关

我有一个事件SF Input (Event ()),代表空格键的键。我有一些gravity,每次用户释放密钥时,它都必须在1和之间切换(-1)。所以我这样做了:

但它所做的是在重复时上下切换值,直到我再次按下该键。我不知道我在哪里做错了。

完整的来源在这里,也许有人可以帮助我。

0 投票
3 回答
255 浏览

haskell - 如何解决箭头的一阶约束?

我所说的一阶约束是什么意思

首先,我将解释我所说的对箭头的一阶约束的含义:由于箭头脱糖的方式,您不能在箭头 do-notation 中需要箭头命令的地方使用本地绑定名称。

下面是一个例子来说明:

proc x -> f -< x + 1desugar toarr (\x -> x + 1) >>> f和类似地desugar proc x -> g x -< ()to arr (\x -> ()) >>> g x,其中第二个x是自由变量。GHC 用户指南解释了这一点,并说当你的箭头也是一个单子时,你可以创建一个实例ArrowApply并使用app它来解决这个问题。像,proc x -> g x -<< ()变成arr (\x -> (g x, ())) >>> app.

我的问题

Yampa 定义了accumHold这种类型的函数:a -> SF (Event (a -> a)) a. 由于箭头的这种一阶限制,我正在努力编写以下函数:

上面的定义不起作用,因为n脱糖后不在范围内。

或者,类似地这个函数,其中对的第一部分SF是要传递给的初始值accumHold

是否有一些我缺少的组合器或技巧?ArrowApply或者没有实例就不可能编写这些定义?

tl; dr:是否可以在 yampa中定义accumHoldNoiseR :: (RandomGen g, Random a) => (a,a) -> g -> SF (Event (a -> a)) a或定义?accumHold' :: SF (a,Event (a -> a)) -> a

注意:没有ArrowApplyfor 的实例SF。我的理解是,定义一个也没有意义。有关详细信息,请参阅“使用箭头编程”

0 投票
1 回答
635 浏览

haskell - 在 Yampa 中模拟弹簧/阻尼器系统

我正在尝试使用 Yampa 进行一些基本的系统仿真,就像我在 Simulink 中所做的那样。在这种情况下,我想模拟这个 simulink 教程介绍的弹簧和阻尼器系统。我编写了以下信号函数来表示系统:

feedback函数创建一个基本的反馈循环并实现如下:

哦,还有:

有了合理的正常数,我得到了一个非常不稳定的系统:

位移/时间图

我构建反馈循环或应用集成的方式是否存在明显错误?

0 投票
2 回答
509 浏览

haskell - 箭头 FRP 中的连续信号切换

我一直在使用 Haskell(尤其是 Yampa)中的 Arrowized FRP 库,但我不太清楚如何进行“连续”切换。我的意思是信号通过一个信号函数(sf下图),该函数本身就是一个信号(如图上半部分所示)。

连续切换

由于我不提前知道开关的参数是什么,所以我看不出如何将其简化为更简单的二进制开关。

如果可能的话,应该怎么做呢?我更喜欢 Yampa 代码,但对任何带箭头的 FRP 代码都很满意。我还没有尝试过其他库(例如 Sodium 或 Reactive Banana)来知道在这些情况下我是否会有同样的困惑,但我也对它们很好奇。

编辑

为了使这一点更清晰更具体,我已标记了图像;标签的可能类型有:

  • Either Int (Int -> Int)

  • 1(Int -> Int) -> (Either Int (Int -> Int) -> (Int -> Int))

  • sf 可以是:

(Either Int (Int -> Int) -> (Int -> Int)) -> Either Int (Int -> Int) -> (Int -> Int)

(例如,app)。但这仅是当标有问号的部分表示对sf. 如果它表示更复杂的开关,则类型为

(Either Int (Int -> Int) -> (Int -> Int)) -> (Int -> Int)

反而。

  • 2out几乎无关紧要。

这个想法是我希望电路表现得好像 sfapp,标记的信号f表示应用于 的函数in,并且它本身是s 和s 本身in的参数的来源。我想得到一个可以处理输入并根据这些输入动态改变其行为(构成它的信号函数)的电路。ff

一方面,在我看来sf,实际上不可能app,因为在这种情况下,我们没有ArrowApply; 但另一方面,我想通过某种形式的复杂切换可以实现相同的行为。

0 投票
1 回答
565 浏览

haskell - 对Yampa开关图感到困惑

有一些Yampa开关的图表在:

http://www.haskell.org/haskellwiki/Yampa/switch

http://www.haskell.org/haskellwiki/Yampa/rSwitch

http://www.haskell.org/haskellwiki/Yampa/kSwitch

(等等)。

我发现,switch唯一一张带有描述的图表,是最容易理解的。其他人似乎很难按照类似的符号来阅读图表。例如,尝试rSwitch使用 中使用的符号读取switch可能是:

是一个递归 SF,它总是被输入一个“in”类型的信号并返回一个“out”类型的信号。从相同类型的初始 SF 开始,但在 switch 函数(?[cond])方块之外的人)也可以通过事件(Event (SF in out)签名处的类型)传递一个新的 SF,同时满足条件(对于 '? ' 在 [cond] 方格之前)。在事件的情况下,Yampa 将使用新的 SF 而不是现有的。这个过程是递归的,因为'?' (不能从图中得到它,除了 rSwitch 的签名似乎是递归的)。

在我查看 的源代码之后rSwitch,它看起来像是switch在触发时递归地切换到相同的 init SF t(根据图中描述的内容,尽管我看不到t源代码中会触发什么特殊内容代码)。

在 Yampa Arcade 中,它dpSwitch通过代码和示例进行了解释。而关于游戏“Frag”的论文也使用了dpSwitch. 然而rSwitch,这些教程中似乎没有。所以我真的不知道如何使用r-k-串行开关,以及在什么情况下我们需要它们。