私はこれらのデータ型を持っています:
data PointPlus = PointPlus
{ coords :: Point
, velocity :: Vector
} deriving (Eq)
data BodyGeo = BodyGeo
{ pointPlus :: PointPlus
, size :: Point
} deriving (Eq)
data Body = Body
{ geo :: BodyGeo
, pict :: Color
} deriving (Eq)
これは、私のゲームのキャラクター、敵、オブジェクトなどの基本データ型です (現在、プレイヤーと地面として 2 つの四角形しかありません:p)。
キーを押すと、キーを変えることで文字が左右に移動したり、ジャンプしたりしvelocity
ます。に を追加することで移動が行われvelocity
ますcoords
。現在、以下のように書かれています。
move (PointPlus (x, y) (xi, yi)) = PointPlus (x + xi, y + yi) (xi, yi)
私は全体ではなくPointPlus
私の一部を取っているだけです。それ以外の場合は次のようになります。Body
Body
move (Body (BodyGeo (PointPlus (x, y) (xi, yi)) wh) col) = (Body (BodyGeo (PointPlus (x + xi, y + yi) (xi, yi)) wh) col)
の最初のバージョンのmove
方が優れていますか? とにかく、move
changes のみの場合PointPlus
、 new 内でそれを呼び出す別の関数が必要Body
です。update
説明します:ゲームの状態を更新するために呼び出される関数があります。現在のゲームの状態 (Body
今のところ単一) が渡され、更新された が返されBody
ます。
update (Body (BodyGeo (PointPlus xy (xi, yi)) wh) pict) = (Body (BodyGeo (move (PointPlus xy (xi, yi))) wh) pict)
それは私をくすぐります。. _ Body
_ PointPlus
この完全な「再構築」を手動で回避する方法はありますか? のように:
update body = backInBody $ move $ pointPlus body
backInBody
もちろん、を定義する必要はありません。