diff options
-rw-r--r-- | Spear/Scene/GameObject.hs | 84 |
1 files changed, 45 insertions, 39 deletions
diff --git a/Spear/Scene/GameObject.hs b/Spear/Scene/GameObject.hs index 37374cc..dbe7f00 100644 --- a/Spear/Scene/GameObject.hs +++ b/Spear/Scene/GameObject.hs | |||
@@ -2,12 +2,14 @@ module Spear.Scene.GameObject | |||
2 | ( | 2 | ( |
3 | GameObject | 3 | GameObject |
4 | , GameStyle(..) | 4 | , GameStyle(..) |
5 | , AnimationSpeed | 5 | , AM.AnimationSpeed |
6 | -- * Construction | 6 | -- * Construction |
7 | , goNew | 7 | , goNew |
8 | -- * Manipulation | 8 | -- * Manipulation |
9 | , goUpdate | 9 | , goUpdate |
10 | , Spear.Scene.GameObject.setAnimationSpeed | 10 | , currentAnimation |
11 | , setAnimation | ||
12 | , setAnimationSpeed | ||
11 | , goAABB | 13 | , goAABB |
12 | -- * Rendering | 14 | -- * Rendering |
13 | , goRender | 15 | , goRender |
@@ -29,7 +31,7 @@ import Spear.Math.MatrixUtils | |||
29 | import qualified Spear.Math.Spatial2 as S2 | 31 | import qualified Spear.Math.Spatial2 as S2 |
30 | import Spear.Math.Vector2 as V2 | 32 | import Spear.Math.Vector2 as V2 |
31 | import Spear.Math.Vector3 as V3 | 33 | import Spear.Math.Vector3 as V3 |
32 | import Spear.Render.AnimatedModel as AM | 34 | import qualified Spear.Render.AnimatedModel as AM |
33 | import Spear.Render.Program | 35 | import Spear.Render.Program |
34 | import Spear.Render.StaticModel as SM | 36 | import Spear.Render.StaticModel as SM |
35 | 37 | ||
@@ -45,10 +47,9 @@ data GameStyle | |||
45 | -- | An object in the game scene. | 47 | -- | An object in the game scene. |
46 | data GameObject = GameObject | 48 | data GameObject = GameObject |
47 | { gameStyle :: GameStyle | 49 | { gameStyle :: GameStyle |
48 | , renderer :: !(Either StaticModelRenderer AnimatedModelRenderer) | 50 | , renderer :: !(Either StaticModelRenderer AM.AnimatedModelRenderer) |
49 | , collisioner :: !Collisioner | 51 | , collisioner :: !Collisioner |
50 | , transform :: M3.Matrix3 | 52 | , transform :: M3.Matrix3 |
51 | , goUpdate :: Float -> GameObject | ||
52 | } | 53 | } |
53 | 54 | ||
54 | 55 | ||
@@ -112,36 +113,56 @@ instance S2.Spatial2 GameObject where | |||
112 | 113 | ||
113 | -- | Create a new game object. | 114 | -- | Create a new game object. |
114 | goNew :: GameStyle | 115 | goNew :: GameStyle |
115 | -> Either StaticModelResource AnimatedModelResource | 116 | -> Either StaticModelResource AM.AnimatedModelResource |
116 | -> Collisioner | 117 | -> Collisioner |
117 | -> M3.Matrix3 | 118 | -> M3.Matrix3 |
118 | -> GameObject | 119 | -> GameObject |
119 | 120 | ||
120 | goNew style (Left smr) col transf = | 121 | goNew style (Left smr) col transf = |
121 | goUpdate' style (Left $ SM.staticModelRenderer smr) col transf 0 | 122 | GameObject style (Left $ SM.staticModelRenderer smr) col transf |
122 | 123 | ||
123 | goNew style (Right amr) col transf = | 124 | goNew style (Right amr) col transf = |
124 | goUpdate' style (Right $ AM.animatedModelRenderer 1 amr) col transf 0 | 125 | GameObject style (Right $ AM.animatedModelRenderer 1 amr) col transf |
125 | 126 | ||
126 | 127 | ||
127 | goUpdate' :: GameStyle | 128 | goUpdate :: Float -> GameObject -> GameObject |
128 | -> Either StaticModelRenderer AnimatedModelRenderer | 129 | goUpdate dt go = |
129 | -> Collisioner | 130 | let rend = renderer go |
130 | -> M3.Matrix3 | 131 | rend' = case rend of |
131 | -> Float | ||
132 | -> GameObject | ||
133 | goUpdate' style rend col mat dt = | ||
134 | let rend' = case rend of | ||
135 | Left _ -> rend | 132 | Left _ -> rend |
136 | Right amr -> Right $ AM.update dt amr | 133 | Right amr -> Right $ AM.update dt amr |
137 | in | 134 | in go |
138 | GameObject | 135 | { renderer = rend' |
139 | { gameStyle = style | 136 | } |
140 | , renderer = rend | 137 | |
141 | , collisioner = col | 138 | |
142 | , transform = mat | 139 | -- | Get the game object's current animation. |
143 | , goUpdate = goUpdate' style rend' col mat | 140 | currentAnimation :: Enum a => GameObject -> a |
144 | } | 141 | currentAnimation go = case renderer go of |
142 | Left _ -> toEnum 0 | ||
143 | Right amr -> AM.currentAnimation amr | ||
144 | |||
145 | |||
146 | -- | Set the game object's current animation. | ||
147 | setAnimation :: Enum a => a -> GameObject -> GameObject | ||
148 | setAnimation a go = case renderer go of | ||
149 | Left _ -> go | ||
150 | Right amr -> go { renderer = Right $ AM.setAnimation a amr } | ||
151 | |||
152 | |||
153 | -- | Set the game object's animation speed. | ||
154 | setAnimationSpeed :: AM.AnimationSpeed -> GameObject -> GameObject | ||
155 | setAnimationSpeed s go = case renderer go of | ||
156 | Left _ -> go | ||
157 | Right amr -> go { renderer = Right $ AM.setAnimationSpeed s amr } | ||
158 | |||
159 | |||
160 | -- | Get the game object's bounding box. | ||
161 | goAABB :: GameObject -> AABB | ||
162 | goAABB go = | ||
163 | case collisioner go of | ||
164 | (AABBCol box) -> box | ||
165 | (CircleCol circle) -> aabbFromCircle circle | ||
145 | 166 | ||
146 | 167 | ||
147 | -- | Render the game object. | 168 | -- | Render the game object. |
@@ -190,18 +211,3 @@ goCollide :: [GameObject] -> GameObject -> [GameObject] | |||
190 | goCollide gos go = foldl' collide' [] gos | 211 | goCollide gos go = foldl' collide' [] gos |
191 | where | 212 | where |
192 | collide' gos target = target:gos | 213 | collide' gos target = target:gos |
193 | |||
194 | |||
195 | -- | Set the game object's animation speed. | ||
196 | setAnimationSpeed :: AnimationSpeed -> GameObject -> GameObject | ||
197 | setAnimationSpeed s go = case renderer go of | ||
198 | Left _ -> go | ||
199 | Right amr -> go { renderer = Right $ AM.setAnimationSpeed s amr } | ||
200 | |||
201 | |||
202 | -- | Get the game object's bounding box. | ||
203 | goAABB :: GameObject -> AABB | ||
204 | goAABB go = | ||
205 | case collisioner go of | ||
206 | (AABBCol box) -> box | ||
207 | (CircleCol circle) -> aabbFromCircle circle | ||