diff options
author | Marc Sunet <jeannekamikaze@gmail.com> | 2012-09-01 16:58:49 +0200 |
---|---|---|
committer | Marc Sunet <jeannekamikaze@gmail.com> | 2012-09-01 16:58:49 +0200 |
commit | 894ada84c5bec9181026817be25eb383b352924f (patch) | |
tree | f011f62a176d0aea39132c9413228ca476bfefa2 | |
parent | 019febf2de302a078539f16514af5fd869ced097 (diff) |
Made Collisioner an instance of Collisionable
-rw-r--r-- | Spear.lkshw | 4 | ||||
-rw-r--r-- | Spear/Collision.hs | 23 | ||||
-rw-r--r-- | Spear/Scene/GameObject.hs | 8 |
3 files changed, 24 insertions, 11 deletions
diff --git a/Spear.lkshw b/Spear.lkshw index 3191249..91f4459 100644 --- a/Spear.lkshw +++ b/Spear.lkshw | |||
@@ -1,10 +1,10 @@ | |||
1 | Version of workspace file format: | 1 | Version of workspace file format: |
2 | 1 | 2 | 1 |
3 | Time of storage: | 3 | Time of storage: |
4 | "Sat Sep 1 16:13:17 CEST 2012" | 4 | "Sat Sep 1 16:50:37 CEST 2012" |
5 | Name of the workspace: | 5 | Name of the workspace: |
6 | "Spear" | 6 | "Spear" |
7 | File paths of contained packages: | 7 | File paths of contained packages: |
8 | ["demos/simple-scene/simple-scene.cabal","Spear.cabal"] | 8 | ["demos/simple-scene/simple-scene.cabal","Spear.cabal"] |
9 | Maybe file path of an active package: | 9 | Maybe file path of an active package: |
10 | Just "demos/simple-scene/simple-scene.cabal" \ No newline at end of file | 10 | Just "Spear.cabal" \ No newline at end of file |
diff --git a/Spear/Collision.hs b/Spear/Collision.hs index 31187c9..9c538ae 100644 --- a/Spear/Collision.hs +++ b/Spear/Collision.hs | |||
@@ -33,7 +33,7 @@ data CollisionType = NoCollision | Collision | FullyContains | FullyContainedBy | |||
33 | class Collisionable a where | 33 | class Collisionable a where |
34 | collideBox :: AABB -> a -> CollisionType | 34 | collideBox :: AABB -> a -> CollisionType |
35 | collideCircle :: Circle -> a -> CollisionType | 35 | collideCircle :: Circle -> a -> CollisionType |
36 | getBox :: a -> AABB | 36 | getAABB :: a -> AABB |
37 | getCircle :: a -> Circle | 37 | getCircle :: a -> Circle |
38 | 38 | ||
39 | 39 | ||
@@ -59,7 +59,7 @@ instance Collisionable AABB where | |||
59 | boxC = min + (max-min)/2 | 59 | boxC = min + (max-min)/2 |
60 | l = norm $ min + (vec2 (x boxC) (y min)) - min | 60 | l = norm $ min + (vec2 (x boxC) (y min)) - min |
61 | 61 | ||
62 | getBox = id | 62 | getAABB = id |
63 | 63 | ||
64 | getCircle = circleFromAABB | 64 | getCircle = circleFromAABB |
65 | 65 | ||
@@ -80,11 +80,28 @@ instance Collisionable Circle where | |||
80 | sum_radii = (r1 + r2)^2 | 80 | sum_radii = (r1 + r2)^2 |
81 | sub_radii = (r1 - r2)^2 | 81 | sub_radii = (r1 - r2)^2 |
82 | 82 | ||
83 | getBox = aabbFromCircle | 83 | getAABB = aabbFromCircle |
84 | 84 | ||
85 | getCircle = id | 85 | getCircle = id |
86 | 86 | ||
87 | 87 | ||
88 | instance Collisionable Collisioner where | ||
89 | |||
90 | collideBox box (AABBCol self) = collideBox box self | ||
91 | collideBox box (CircleCol self) = collideBox box self | ||
92 | |||
93 | collideCircle circle (AABBCol self) = collideCircle circle self | ||
94 | collideCircle circle (CircleCol self) = collideCircle circle self | ||
95 | |||
96 | getAABB (AABBCol box) = box | ||
97 | getAABB (CircleCol c) = aabbFromCircle c | ||
98 | |||
99 | getCircle (AABBCol box) = circleFromAABB box | ||
100 | getCircle (CircleCol c) = c | ||
101 | |||
102 | |||
103 | |||
104 | |||
88 | aabbPoints :: AABB -> [Vector2] | 105 | aabbPoints :: AABB -> [Vector2] |
89 | aabbPoints (AABB min max) = [p1,p2,p3,p4,p5,p6,p7,p8] | 106 | aabbPoints (AABB min max) = [p1,p2,p3,p4,p5,p6,p7,p8] |
90 | where | 107 | where |
diff --git a/Spear/Scene/GameObject.hs b/Spear/Scene/GameObject.hs index 30e7d5e..b892b7d 100644 --- a/Spear/Scene/GameObject.hs +++ b/Spear/Scene/GameObject.hs | |||
@@ -167,16 +167,12 @@ goUpdate dt go = | |||
167 | 167 | ||
168 | -- | Get the game object's ith bounding box. | 168 | -- | Get the game object's ith bounding box. |
169 | goAABB :: Int -> GameObject -> AABB | 169 | goAABB :: Int -> GameObject -> AABB |
170 | goAABB i go = goAABB' $ (collisioners go) !! i | 170 | goAABB i = getAABB . flip (!!) i . collisioners |
171 | |||
172 | goAABB' col = case col of | ||
173 | (AABBCol box) -> box | ||
174 | (CircleCol circle) -> aabbFromCircle circle | ||
175 | 171 | ||
176 | 172 | ||
177 | -- | Get the game object's bounding boxes. | 173 | -- | Get the game object's bounding boxes. |
178 | goAABBs :: GameObject -> [AABB] | 174 | goAABBs :: GameObject -> [AABB] |
179 | goAABBs = fmap goAABB' . collisioners | 175 | goAABBs = fmap getAABB . collisioners |
180 | 176 | ||
181 | 177 | ||
182 | -- | Get the game object's 3D transform. | 178 | -- | Get the game object's 3D transform. |