Реакция Черепашки на щелчки и перемещения мыши

Сделаем так, чтобы Черепашка начинала ползти после щелчка мыши:

from turtle import *

def click(x,y):
	fd(100)
	
onscreenclick(click)	

done()

onscreenclick — указание выполнить команду после щелчка мышью на экране. Команда(функция), которая будет выполнена по щелчку, обязательно должна принять два значения: x,y — координаты щелчка. Передачу параметров в команду(функцию) мы разбирали, когда рисовали фигуры разного размера.

Попробуйте изменить fd(100) на fd(1000) и fd(10). Что меняется?
Однако, такой вариант нельзя считать приемлемым: мы не можем управлять Черепашкой, т.к. после щелчка она проползает определенное расстояние и останавливается. Сделаем так, чтобы Черепашка после щелчка ползла без остановки и при этом мы могли бы ей управлять.

1. Подумайте, почему fd(1000) не подходит. Чем плох этот способ?

Для начала научим Черепашку плавно ползти вправо

from turtle import *

def move():
	fd(1)
	ontimer(move,30)

move()

done()

Команда ontimer позволяет выполнить команду(функцию) через некоторое время. В данном случае — через 30 мс (в одной секунде 1000 мс).
Первый вызов команды(функции) move мы выполняем сразу при запуске программы. Последующие происходят автоматически.
Теперь, чтобы Черепашка начинала ползти после щелчка, нужно перенести первый вызов команды(функции) move внутрь другой команды, выполняющейся по щелчку:

from turtle import *

def click(x,y):
	move()
	
def move():
	fd(1)
	ontimer(move,30)
	
onscreenclick(click)	

done()

Теперь попробуем изменять скорость. Самый простой (и неправильный) — щелкать несколько раз. Тогда Черепашка едет все быстрее и быстрее, но через несколько щелчков очередного ускорения уже не происходит.

2. Подумайте, почему Черепашка начинает двигаться быстрее.
3. Подумайте, почему через несколько щелчков Черепашка перестает ускоряться.
4. Какие способы вы можете предложить для изменения скорости, кроме этого? (Подсказка: есть еще три варианта влиять на скорость)
Не читайте дальше, пока не подумаете.

Достаточно подумали?
Давайте разберем.
Обратим внимание на цифры, которые есть в программе: fd(1) и ontimer(…,30). Первая, fd(1) — это размер «шага» черепашки. При его увеличении кратно увеличивается скорость (т.е. увеличиваете шаг в два раза — в два раза увеличивается скорость). Попробуйте поставить значения 2,3,5,10 или похожие. Попробуйте и 0.5, 0.1, 0.9.
Это и есть самый правильный способ изменения скорости.
А вот то значение, которое стоит в команде ontimer менять не стоит. На первый взгляд при изменении этого значения хорошо видно, как меняется скорость. Но есть два существенных момента, из-за которых мы не будем так управлять скоростью. Попробуйте такой вариант:

from turtle import *

def click(x,y):
	move()
	
def move():
	fd(10)
	ontimer(move,100)
		
onscreenclick(click)	

done()

100 мс (милисекунд) между кадрами — это слишком много. Стали заметны паузы между шагами и Черепашка заметно дергается. Это означает, что существует предел, больше которого нельзя делать паузу между кадрами — значит не получится замедлять Черепашку до любой скорости. Попробуйте найти максимальное значение, при котором рывки не заметны.
Но и в другую сторону мы не можем менять значение произвольно! На первый взгляд, если сделать 0, то Черепашка будет двигаться довольно быстро. Но в этом случае скорость движения Черепашки будет зависеть от того, сколько действий мы выполняем каждый кадр. И при «торможение» и рывки будут заметны даже при 10 Черепашках.
Оптимальное значение — 30мс, это позволяет рисовать примерно 30 кадров в секунду (1000/30 = 33).
Конечно, Черепашка медлительна сама по себе, поскольку это не игровой фреймворк. Ждать от нее высокой скорости не стоит. Через несколько уроков мы начнем использовать Tkinter, который тоже не является игровым фреймворком, но в несколько раз быстрее, чем Черепашка. А дальше нас ждет Kivy, который будет быстрее, потому что предназначен для создания игр.
А пока вернемся к управлению Черепашкой.

5. Научите Черепашку двигаться вниз.
6. Научите Черепашку двигаться влево.
7. Научите Черепашку двигаться вверх.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *