素朴な質問:
Elm で互いに依存するシグナルのペアを定義する方法はありますか?
前文:
私は小さな Cookie クリッカー スタイルのブラウザー ゲームを作成しようとしています。このゲームでは、プレーヤーがリソースを収集し、それらを使って自律的なリソース収集構造を購入し、購入するほど高価になります。これは、(gathered
プレーヤーが収集したspent
リソースの量)、(プレーヤーが既に費やしたリソースの量)、およびcost
(アップグレードのコスト) という 3 つの関連するシグナルを意味します。
実装は次のとおりです。
module Test where
import Mouse
import Time
port gather : Signal Bool
port build : Signal String
costIncrement = constant 50
cost = foldp (+) 0 <| keepWhen canAfford 0 <| sampleOn build costIncrement
nextCost = lift2 (+) cost costIncrement
spent = foldp (+) 0 <| merges [ sampleOn build cost ]
gathered = foldp (+) 0 <| merges [ sampleOn gather <| constant 1, sampleOn tick tickIncrement ]
balance = lift round <| lift2 (-) gathered spent
canAfford = lift2 (>) balance <| lift round nextCost
tickIncrement = foldp (+) 0 <| sampleOn cost <| constant 0.01
tick = sampleOn (every Time.millisecond) <| constant True
main = lift (flow down) <| combine [ lift asText balance, lift asText canAfford, lift asText spent, lift asText gathered, lift asText nextCost ]
これは正常にコンパイルされますが、上記の適切なポートにメッセージを送信するために適切なボタンが接続された HTML ファイルに埋め込むと、エラーが発生します
s2 is undefined
Open the developer console for more details.
問題は、書かれているように、にcost
依存しcanAfford
、 に依存しbalance
、 に依存しspent
、 に依存しているcost
ようです。
コストラインを次のように変更すると
...
cost = foldp (+) 0 <| sampleOn build costIncrement
...
期待どおりに機能し始めます(プレーヤーが負のリソースに費やすことが許可されていることを除いて、これは避けたいことです)。
何か案は?