From e85dc20a4869c91faa3869695d2d19bfe07f9abc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 9 Mar 2010 22:36:22 +0100 Subject: Nice tank-border collision detection --- src/Collision.hs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/Collision.hs (limited to 'src/Collision.hs') diff --git a/src/Collision.hs b/src/Collision.hs new file mode 100644 index 0000000..d29738a --- /dev/null +++ b/src/Collision.hs @@ -0,0 +1,41 @@ +module Collision ( collisionTankBorder + ) where + +import Game + +import Data.Fixed +import Data.Ratio + +tankWidth :: Micro +tankWidth = 0.95 + +tankLength :: Micro +tankLength = 0.95 + +collisionTankBorder :: Micro -> Micro -> Tank -> Tank +collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy} + where + dir = (fromRational . toRational . tankDir $ tank)*pi/180 + cosd = fromRational (round ((cos dir)*1000000)%1000000) + sind = fromRational (round ((sin dir)*1000000)%1000000) + + points = [ (tankLength/2, tankWidth/2) + , (-tankLength/2, tankWidth/2) + , (-tankLength/2, -tankWidth/2) + , (tankLength/2, -tankWidth/2) + ] + + rotp (x, y) = (cosd*x - sind*y, sind*x + cosd*y) + transp (x, y) = (x + tankX tank, y + tankY tank) + + pointst = map (transp . rotp) points + minx = minimum $ map fst pointst + maxx = maximum $ map fst pointst + miny = minimum $ map snd pointst + maxy = maximum $ map snd pointst + + dx = if minx < 0 then (-minx) else if maxx > lw then (-maxx+lw) else 0 + dy = if miny < 0 then (-miny) else if maxy > lh then (-maxy+lh) else 0 + + newx = (tankX tank) + dx + newy = (tankY tank) + dy -- cgit v1.2.3