diff --git a/prelude.ld b/prelude.ld index 817d3c5..937f687 100644 --- a/prelude.ld +++ b/prelude.ld @@ -1062,7 +1062,7 @@ let turtle_init = #{ :position (0, 0) & let's call this the origin for now :heading 0 & this is straight up :pendown? true - :color colors :white + :pencolor colors :white :penwidth 1 :visible? true } @@ -1112,7 +1112,10 @@ fn render_turtle! () -> { then { let (r, g, b, a) = turtle_color add_call! ((:fill, r, g, b, a)) - let #{heading, :position (x, y), ...} = state + let #{heading + :pencolor (pen_r, pen_g, pen_b, pen_a) + :position (x, y) + ...} = state let first = mult ((0, 1), turtle_radius) let (x1, y1) = first let (x2, y2) = rotate (first, turtle_angle) @@ -1127,7 +1130,7 @@ fn render_turtle! () -> { add_call! ((:vertex, x3, y3)) add_call! ((:endShape)) & there's a happy bug here: the stroke will be the same width as the pen width. Keep this for now. Consider also showing the pen colour here? - add_call! ((:stroke, 0)) + add_call! ((:stroke, pen_r, pen_g, pen_b, pen_a)) add_call! ((:line, 0, 0, x1, y1)) add_call! ((:pop)) :ok @@ -1246,6 +1249,11 @@ fn goto! { ((x, y)) -> goto! (x, y) } +fn setheading! { + "Sets the turtle's heading. The angle is specified in turns, with 0 pointing up. Increasing values rotate the turtle counter-clockwise." + (heading as :number) -> add_command! ((:setheading, heading)) +} + fn heading/vector { "Takes a turtle heading, and returns a unit vector of that heading." (heading) -> { @@ -1258,8 +1266,10 @@ fn heading/vector { fn apply_command { "Takes a turtle state and a command and calculates a new state." (state, command) -> match command with { - (:goto, (x, y)) -> assoc (state, :position, (neg (x), y)) - (:home) -> assoc (state, :position, (0, 0)) + (:goto, (x, y)) -> assoc (state, :position, (x, y)) + (:home) -> do state > + assoc (_, :position, (0, 0)) > + assoc (_, :heading, 0) (:clear) -> assoc (state, :position, (0, 0)) (:right, turns) -> update (state, :heading, add (_, turns)) (:left, turns) -> update (state, :heading, sub (_, turns)) @@ -1279,6 +1289,7 @@ fn apply_command { (:pendown) -> assoc (state, :pendown?, true) (:penwidth, pixels) -> assoc (state, :penwidth, pixels) (:pencolor, color) -> assoc (state, :pencolor, color) + (:setheading, heading) -> assoc (state, :heading, heading) } } @@ -1454,6 +1465,7 @@ pkg Prelude { sentence & lists strings set & sets set? & sets + setheading! & turtles show & strings sin & math slice & lists tuples strings