{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
module Graphics.WorldTurtle.Internal.Turtle
( TurtleData
, defaultTurtle
, drawTurtle
, heading
, position
, representation
, penDown
, speed
, rotationSpeed
, Graphics.WorldTurtle.Internal.Turtle.scale
, penColor
, penSize
, visible
) where
import Control.Lens
import Graphics.WorldTurtle.Shapes
import Graphics.Gloss.Data.Color
import Graphics.Gloss.Data.Picture
import qualified Graphics.Gloss.Data.Picture as G (scale)
import qualified Graphics.WorldTurtle.Internal.Coords as P
data TurtleData = TurtleData
{ TurtleData -> Float
_heading :: !Float
, TurtleData -> Point
_position :: !P.Point
, TurtleData -> Picture
_representation :: !Picture
, TurtleData -> Bool
_penDown :: !Bool
, TurtleData -> Float
_speed :: !Float
, TurtleData -> Float
_rotationSpeed :: Float
, TurtleData -> Float
_scale :: !Float
, TurtleData -> Color
_penColor :: !Color
, TurtleData -> Float
_penSize :: !Float
, TurtleData -> Bool
_visible :: !Bool
}
$(makeLenses ''TurtleData)
defaultTurtle :: TurtleData
defaultTurtle :: TurtleData
defaultTurtle = TurtleData :: Float
-> Point
-> Picture
-> Bool
-> Float
-> Float
-> Float
-> Color
-> Float
-> Bool
-> TurtleData
TurtleData
{ _heading :: Float
_heading = Float
90
, _position :: Point
_position = (Float
0, Float
0)
, _representation :: Picture
_representation = Color -> Color -> Picture
turtleArrow Color
black Color
blue
, _penDown :: Bool
_penDown = Bool
True
, _speed :: Float
_speed = Float
200
, _rotationSpeed :: Float
_rotationSpeed = Float
720
, _scale :: Float
_scale = Float
1
, _penColor :: Color
_penColor = Color
black
, _penSize :: Float
_penSize = Float
2
, _visible :: Bool
_visible = Bool
True
}
drawTurtle :: TurtleData -> Picture
drawTurtle :: TurtleData -> Picture
drawTurtle TurtleData
t
| Bool -> Bool
not (TurtleData
t TurtleData -> Getting Bool TurtleData Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool TurtleData Bool
Lens' TurtleData Bool
visible) = Picture
blank
| Bool
otherwise = let (Float
x, Float
y) = TurtleData -> Point
_position TurtleData
t
s :: Float
s = TurtleData -> Float
_scale TurtleData
t
in Float -> Float -> Picture -> Picture
translate Float
x Float
y
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Picture -> Picture
rotate (Float
360 Float -> Float -> Float
forall a. Num a => a -> a -> a
- TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
heading)
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
G.scale Float
s Float
s
(TurtleData
t TurtleData -> Getting Picture TurtleData Picture -> Picture
forall s a. s -> Getting a s a -> a
^. Getting Picture TurtleData Picture
Lens' TurtleData Picture
representation)