2017-11-12 12 views
-1

ゲームでは、アニメーションを使用したいので、リストから画像を選び、次の画像に移動したい。しかし、そのために私は考えられない1つの機能の中で2つのことをする必要があります。パターンマッチ内の複数のアクションHaskell

getPicture :: [IO Picture] -> Int -> IO Picture 
getPicture a i | i < length a = (!!) i a && getPicture a (i+1) 
       | otherwise = (!!) i a && getPicture a (0) 

もちろん、私は次の部分に進むこと&&を使用することはできませんが、これを実行する可能性があった場合、私は不思議でしたか?

+1

私は '(!!)ia'ビットが何をすべきか分かりませんが、2つの異なるビットが同じ戻り値を持つ限り、doブロックを使って絶対に2つのことを行うことができます – Zpalmtree

+1

(!!)iaはリストaから要素iを選ぶ。 – BaasBartMans

+1

もちろん、あなたはaから要素を取ることができますが、それで何をしていますか?画像を出力し、変数にバインドしたいですか? letまたはwhereを使用して変数をバインドすることができます。 – Zpalmtree

答えて

0

いつも再帰的にgetPictureと呼んでいるように、すべての写真を順番に欲しいと思うように見えます。また、最初の絵に戻る基本ケースもあります。 getPictures :: [IO Picture] -> IO [Picture]はより適切な署名のように見えますか?シーケンス内のすべての画像を取得するだけで、手動でiを追跡する必要はありません。

幸いにも、sequenceControl.Monadであり、これはあなたにとってまさにこれを行うことができます。私たちはcycleを投げ、「先頭に戻る」部分に対応します。

do 
    pictures <- cycle <$> sequence getPictures 
    … -- animate the pictures as you wish 

もちろん、私はあなたが実際に望むかもしれないものを推測しています。たとえば、これはすべての画像(フレーム?)をメモリにロードしたままにします。

+0

私はアニメーションを模倣するために写真を絶えず切り替えたい – BaasBartMans

関連する問題