3

我正在制作一个需要在屏幕上绘制随机线条的游戏。现在看来 Random 需要一个信号才能在 0.13 中工作(我们被迫在 0.13 中工作)。那么如何获得这些随机数呢?

我从 elm-lang 网站上提供的游戏骨架开始,得到了这个:

type UserInput = { space : Bool, keys : [KeyCode] }
type Input = { timeDelta : Float, userInput : UserInput }

userInput : Signal UserInput
userInput = lift2 UserInput Keyboard.space Keyboard.keysDown

framesPerSecond = 30

delta : Signal Float
delta = lift (\t -> t / framesPerSecond) (Time.fps framesPerSecond)

input : Signal Input
input = Signal.sampleOn delta (Signal.lift2 Input delta userInput)

gameState : Signal GameState
gameState = Signal.foldp stepGame defaultGame input

stepGame : Input -> GameState -> GameState
stepGame i g =
  if g.state == Start then *Get random floats*

现在在 stepGame 中,我想绘制随机线。问题是我只能通过在 0.13 中提供信号来获得随机浮点数。我在 step 函数附近有输入信号,但是当我将标题更改为 stepGame : Signal Input -> GameState -> GameState让它无法编译时。那么如何在该函数中获取信号以获取一些随机数...我似乎找不到解决方案,这让我发疯。

4

1 回答 1

3

有两种方法可以做到这一点。这实际上取决于您需要的随机数数量是否是静态的。

随机数的静态数量

input使用以下随机数扩展您的Random.floatList

type Input = { timeDelta : Float, userInput : UserInput, randoms : [Float] }

staticNoOfFloats = 42

input : Signal Input
input = Signal.sampleOn delta (Signal.lift3 Input delta userInput (Random.floatList (always staticNoOfFloats <~ delta)))

随机数的动态数量

使用名为generator的社区库(也在此 SO 答案中概述) 。您可以使用与上述大致相同的方式来使用随机种子。该库是一个纯伪随机数生成器,基于生成一个随机数和一个将生成下一个随机数的新数。Random.rangeGenerator

为什么不在Random.floatList动态情况下使用?

通常,如果您需要随机数的动态数量,则该数量取决于程序的当前状态。因为该状态是在 内部捕获的foldp,您也在其中根据这些随机数进行更新,这使得无法使用“信号函数”,即类型的东西Signal a -> Signal b

于 2014-12-21T16:07:02.983 回答