@@ -99,11 +99,11 @@ class Application:
9999
100100 maximum_scale = 1.6
101101 minimum_scale = 0.6
102+ count = 0
102103
103104 def __init__ (self , w , h , file ):
104- global icon_count
105- self .index = icon_count
106- icon_count += 1
105+ self .index = Application .count
106+ Application .count += 1
107107
108108 self .selected = False
109109 self .icon = Polygon ()
@@ -164,7 +164,7 @@ def touched(self, touch):
164164 return touch .x > x and touch .x < x + w and touch .y > y and touch .y < y + h
165165
166166 def update (self , move_angle ):
167- angle_per_icon = 2 * math .pi / icon_count
167+ angle_per_icon = 2 * math .pi / Application . count
168168 self .angle = angle_per_icon * self .index + move_angle
169169
170170 self .angle %= 2 * math .pi
@@ -250,27 +250,12 @@ def launch(self):
250250 machine .reset ()
251251
252252
253- icon_count = 0
253+ icons = [
254+ Application (60 , 60 , file ) for file in os .listdir ()
255+ if file .endswith (".py" ) and file not in ("main.py" , "secrets.py" )]
254256
255-
256- files = [
257- file
258- for file in os .listdir ()
259- if file .endswith (".py" ) and file not in ("main.py" , "secrets.py" )
260- ]
261- w = 60
262- h = 60
263- icons = [Application (w , h , x ) for x in files ]
264-
265- num_icons = len (icons )
266-
267- sx , sy = 0 , 0
268- ex , ey = 0 , 0
269- st , et = None , None
270- touch_ms = 0
271- touch_dist = 0
272- touch_speed = 0
273- touch_dir = 0
257+ touch_start_x = 0
258+ touch_start_time = None
274259tap = False
275260
276261move_angle = 0
@@ -299,48 +284,46 @@ def launch(self):
299284
300285 touch .poll ()
301286
302- if touch .state and st is None :
303- st = time .ticks_ms ()
304- sx , sy = touch .x , touch . y
287+ if touch .state and touch_start_time is None :
288+ touch_start_time = time .ticks_ms ()
289+ touch_start_x = touch .x
305290 tap = True
306291
307292 elif touch .state :
308- ex , ey = touch .x , touch .y
309-
310- et = time .ticks_ms ()
311- touch_ms = et - st # et phone home
312- # get the x distance between the touch start and current touch
313- touch_dist = abs (sx - ex )
314- # Get the touch direction bounded to -1, 0, +1, for easy multiply later
315- touch_dir = max (min (1 , sx - ex ), - 1 )
293+ # Get the duration of the touch in milliseconds
294+ touch_ms = time .ticks_ms () - touch_start_time
295+
296+ # Get the x distance between the touch start and current touch
297+ touch_dist = touch_start_x - touch .x
298+
316299 # Calculate the touch speed, speed = distance / time
317300 touch_speed = touch_dist / touch_ms
318- touch_speed *= 2
319301
320- # Any movement at all should cancel our tap action
321- if touch_dist > 4 :
302+ # Any movement should cancel our tap action
303+ if abs ( touch_dist ) > 4 :
322304 tap = False
323305
324306 # If a touch is under this minimal distance it counts as a "stop spinning, darn it"
325- if touch_dist > 10 :
307+ if abs ( touch_dist ) > 10 :
326308 # Apply the touch speed with the direction multiplier from above
327- move -= math .radians (touch_speed * touch_dir )
328- if touch_speed > 1 :
309+ move -= math .radians (touch_speed )
310+ if abs ( touch_speed ) > 0.5 :
329311 friction = 0.98 # Normal friction ( the closer this is to 1 the longer it will take to slow down )
330312 else :
331313 friction = 0.8
314+
332315 else :
333316 # Pick the one you like best
334317 # move = 0 # Stop abruptly
335318 friction = 0.7 # Apply a braking friction
336319 else :
337- st = None
320+ touch_start_time = None
338321
339322 move_angle += move # Apply the movement distance, this is in degrees and needs finagled to follow your finger
340- move_angle %= 2 * math .pi # Wrap to 0-359
323+ move_angle %= 2 * math .pi # Wrap at 360 degrees (in radians)
341324 move *= friction # Apply friction, this will slowly decrease "move" when there's no touch, to slow the spin down
342325
343- # Pre-calculate the scales and angles
326+ # Pre-calculate the scales and angles for sorting.
344327 for icon in icons :
345328 icon .update (move_angle )
346329
0 commit comments