{-# 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 10 , _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 | 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 Bool -> Bool -> Bool forall a. Eq a => a -> a -> Bool == Bool False = 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 (Picture -> Picture) -> Picture -> Picture forall a b. (a -> b) -> a -> b $ (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)