Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArt/taturtle.py
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArt/taturtle.py')
-rw-r--r--TurtleArt/taturtle.py74
1 files changed, 58 insertions, 16 deletions
diff --git a/TurtleArt/taturtle.py b/TurtleArt/taturtle.py
index 12882db..ac72bdb 100644
--- a/TurtleArt/taturtle.py
+++ b/TurtleArt/taturtle.py
@@ -34,6 +34,7 @@ from tacanvas import wrap100, COLOR_TABLE
from sprites import Sprite
from tautils import (debug_output, data_to_string, round_int, get_path,
image_to_base64)
+from TurtleArt.talogo import logoerror
SHAPES = 36
DEGTOR = pi / 180.
@@ -138,7 +139,10 @@ class Turtles:
self._active_turtle.set_color(0)
self._active_turtle.set_shade(50)
self._active_turtle.set_gray(100)
- self._active_turtle.set_pen_size(5)
+ if self.turtle_window.coord_scale == 1:
+ self._active_turtle.set_pen_size(5)
+ else:
+ self._active_turtle.set_pen_size(1)
self._active_turtle.reset_shapes()
self._active_turtle.set_heading(0.0)
self._active_turtle.set_pen_state(False)
@@ -148,13 +152,34 @@ class Turtles:
self._active_turtle.hide()
self.set_turtle(self._default_turtle_name)
+ def get_turtle_x(self, turtle_name):
+ if turtle_name not in self.dict:
+ debug_output('%s not found in turtle dictionary' % (turtle_name),
+ self.turtle_window.running_sugar)
+ raise logoerror("#syntaxerror")
+ return self.dict[turtle_name].get_x()
+
+ def get_turtle_y(self, turtle_name):
+ if turtle_name not in self.dict:
+ debug_output('%s not found in turtle dictionary' % (turtle_name),
+ self.turtle_window.running_sugar)
+ raise logoerror("#syntaxerror")
+ return self.dict[turtle_name].get_y()
+
+ def get_turtle_heading(self, turtle_name):
+ if turtle_name not in self.dict:
+ debug_output('%s not found in turtle dictionary' % (turtle_name),
+ self.turtle_window.running_sugar)
+ raise logoerror("#syntaxerror")
+ return self.dict[turtle_name].get_heading()
+
def set_turtle(self, turtle_name, colors=None):
''' Select the current turtle and associated pen status '''
if turtle_name not in self.dict:
# if it is a new turtle, start it in the center of the screen
self._active_turtle = self.get_turtle(turtle_name, True, colors)
self._active_turtle.set_heading(0.0, False)
- self._active_turtle.set_xy((0.0, 0.0), False, pendown=False)
+ self._active_turtle.set_xy(0.0, 0.0, share=False, pendown=False)
self._active_turtle.set_pen_state(True)
elif colors is not None:
self._active_turtle = self.get_turtle(turtle_name, False)
@@ -202,7 +227,10 @@ class Turtle:
self._pen_shade = 50
self._pen_color = 0
self._pen_gray = 100
- self._pen_size = 5
+ if self._turtles.turtle_window.coord_scale == 1:
+ self._pen_size = 5
+ else:
+ self._pen_size = 1
self._pen_state = True
self._pen_fill = False
self._poly_points = []
@@ -327,6 +355,15 @@ class Turtle:
return
self._heading %= 360
+ self._update_sprite_heading()
+
+ if self._turtles.turtle_window.sharing() and share:
+ event = 'r|%s' % (data_to_string([self._turtles.turtle_window.nick,
+ round_int(self._heading)]))
+ self._turtles.turtle_window.send_event(event)
+
+ def _update_sprite_heading(self):
+ ''' Update the sprite to reflect the current heading '''
i = (int(self._heading + 5) % 360) / (360 / SHAPES)
if not self._hidden and self.spr is not None:
try:
@@ -334,11 +371,6 @@ class Turtle:
except IndexError:
self.spr.set_shape(self._shapes[0])
- if self._turtles.turtle_window.sharing() and share:
- event = 'r|%s' % (data_to_string([self._turtles.turtle_window.nick,
- round_int(self._heading)]))
- self._turtles.turtle_window.send_event(event)
-
def set_color(self, color=None, share=True):
''' Set the pen color for this turtle. '''
# Special case for color blocks
@@ -422,7 +454,8 @@ class Turtle:
self._turtles.turtle_window.running_sugar)
return
- self._turtles.turtle_window.canvas.set_pen_size(self._pen_size)
+ self._turtles.turtle_window.canvas.set_pen_size(
+ self._pen_size * self._turtles.turtle_window.coord_scale)
if self._turtles.turtle_window.sharing() and share:
event = 'w|%s' % (data_to_string([self._turtles.turtle_window.nick,
@@ -462,8 +495,12 @@ class Turtle:
if self._turtles.turtle_window.sharing() and share:
shared_poly_points = []
for p in self._poly_points:
- shared_poly_points.append(
- (self._turtles.screen_to_turtle_coordinates(p)))
+ x, y = self._turtles.turtle_to_screen_coordinates(
+ (p[1], p[2]))
+ if p[0] in ['move', 'line']:
+ shared_poly_points.append((p[0], x, y))
+ elif p[0] in ['rarc', 'larc']:
+ shared_poly_points.append((p[0], x, y, p[3], p[4], p[5]))
event = 'F|%s' % (data_to_string(
[self._turtles.turtle_window.nick,
shared_poly_points]))
@@ -482,7 +519,7 @@ class Turtle:
self.spr.set_layer(TURTLE_LAYER)
self._hidden = False
self.move_turtle_spr((self._x, self._y))
- self.set_heading(self._heading)
+ self.set_heading(self._heading, share=False)
if self.label_block is not None:
self.label_block.spr.set_layer(TURTLE_LAYER + 1)
@@ -518,6 +555,8 @@ class Turtle:
return
self._heading %= 360
+ self._update_sprite_heading()
+
if self._turtles.turtle_window.sharing() and share:
event = 'r|%s' % (data_to_string([self._turtles.turtle_window.nick,
round_int(self._heading)]))
@@ -555,12 +594,15 @@ class Turtle:
int(distance)]))
self._turtles.turtle_window.send_event(event)
- def set_xy(self, pos, share=True, pendown=True):
+ def set_xy(self, x, y, share=True, pendown=True, dragging=False):
old = self.get_xy()
-
try:
- xcor = pos[0] * self._turtles.turtle_window.coord_scale
- ycor = pos[1] * self._turtles.turtle_window.coord_scale
+ if dragging:
+ xcor = x
+ ycor = y
+ else:
+ xcor = x * self._turtles.turtle_window.coord_scale
+ ycor = y * self._turtles.turtle_window.coord_scale
except (TypeError, ValueError):
debug_output('bad value sent to %s' % (__name__),
self._turtles.turtle_window.running_sugar)