Слайд 2: Анимация
2 Анимация (англ. animation ) – оживление изображения на экране. Задача : внутри синего квадрата 400 на 400 пикселей слева направо двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области. Привязка: состояние объекта задается координатами ( x,y) ( x, y ) ( x +20, y +20)
Слайд 3: Принцип анимации
3 рисуем объект в точке ( x,y) задержка на несколько миллисекунд стираем объект изменяем координаты ( x,y ) переходим к шагу 1 В Python все фигуры, из которых состоит рисунок, – объекты (умеют перерисовывать себя сами)! ! moveObjectBy (obj, dx, dy) смещения по осям объект
Слайд 4: Начальная картинка
4 from graph import * brushColor ( "blue" ) rectangle ( 0, 0, 400, 400 ) x = 100 y = 100 penColor ( "yellow" ) brushColor ( "yellow" ) obj = rectangle (x, y, x+ 20, y+ 20 ) run () синий квадрат начальные координаты жёлтый квадрат
Слайд 5: Движение
5 def update (): moveObject By (obj, 5, 0 ) if x Coord ( obj ) >= 380 : # если вышел close () # за границу onTimer ( update, 50 ) вызывать update каждые 50 мс x -координата
Слайд 6: Выход по Escape
6 Событие (англ. event ) – изменение состояния какого-то объекта в программе (нажатие на клавишу, щелчок мышью, перемещение или изменение размеров окна и т.п.). def keyPressed (event): if event.keycode == VK_ESCAPE: close () # закрыть окно onKey ( keyPressed ) вызывать при нажатии любой клавиши обработчик события установка обработчика события код клавиши Esc = 27
Слайд 7: Полная программа
7 from graph import * def update (): ... def keyPressed (event): ... brushColor ( "blue" ) rectangle ( 0, 0, 400, 400 ) x = 100 y = 100 penColor ( "yellow" ) brushColor ( "yellow" ) obj = rectangle (x, y, x+ 20, y+ 20 ) onKey ( keyPressed ) onTimer ( update, 50 ) run () процедуры обработка событий
Слайд 8: Задания
8 Квадрат двигается справа налево: Два квадрата двигаются в противоположных направлениях:
Слайд 9: Задания
9 Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего квадрата:
Слайд 10: Управление клавишами
10 Задача : жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш: влево – 37 вверх – 38 Esc – 27 вправо – 39 вниз – 40 Проблема : как изменять направление движения? Обработчик события : def keyPressed (event): if event.keycode == VK_LEFT: moveObjectBy ( obj, - 5, 0 ) elif event.keycode == VK_RIGHT: moveObjectBy ( obj, 5, 0 ) ... # дальше – сами... onKey ( keyPressed ) # установить обработчик =37 =39 VK_UP = 38 VK_DOWN = 40 VK_ESCAPE
Слайд 11: Задания
11 Квадрат в самом начале стоит в правом нижнем углу, и двигается при нажатии стрелок только вверх или влево: Квадрат двигается при нажатии стрелок, однако не может выйти за границы синего квадрата:
Слайд 12: Задания
12 Два квадрата, один управляется стрелками, второй – любыми другими клавишами. Оба не могут выйти за границы синего поля.
Слайд 13: Управление по требованию
Задача : жёлтый квадрат постоянно движется и меняет направление движения при нажатии клавиш-стрелок. При нажатии на пробел останавливается. Проблема : как изменять направление движения? Решение : def update (): ... moveObjectBy ( obj, 5, 0 ) ... onTimer ( update, 50 ) Что меняем? ? Здесь должны быть переменные! ! 13 d x dy
Слайд 14: Как «поймать» нажатие клавиши?
14 def keyPressed (event): global dx, dy if event.keycode == VK_LEFT : dx = -5 dy = 0 ... onKey ( keyPressed ) ? ? Как для остальных клавиш? ? Пробел: VK _ SPACE Это глобальные переменные!
Слайд 15: Полная программа
15 from graph import * def update (): ... def keyPressed (event): ... # рисуем синий квадрат x = 100 ; y = 100 dx = 0 ; dy = 0 penColor ( "yellow" ) brushColor ( "yellow" ) obj = rectangle (x, y, x+ 20, y+ 20 ) onKey ( keyPressed ) onTimer ( update, 50 ) run () процедуры обработка событий глобальные переменные
Слайд 16: Задания
« 3 » : Собрать и запустить программу. «4» : Квадрат не может выйти за границы синего квадрата, сразу останавливается при столкновении со стенкой. 16
Слайд 17: Задания
« 5 » : Квадрат отталкивается от стенок. «6»: Квадрат может ходить по диагоналям (используйте ещё 4 клавиши) и отталкивается от стенок. 17
Слайд 18: Змейка»
18 Задача : змейка состоит из головы и нескольких секций тела, постоянно движется и меняет направление движения при нажатии клавиш-стрелок. При нажатии на пробел останавливается. Проблемы : 1) как хранить данные о змейке? 2) как двигать её в нужную сторону?
Слайд 19: Как хранить змейку?
19 Змейка = массив из звеньев-квадратов snake = [obj0, obj1, obj2, obj3, obj4] a ( x, y ) snake = [] penColor ( "yellow" ) brushColor ( "yellow" ) for i in range(N): obj = rectangle ( x+i *a, y, x+i * a+a, y+a ) snake. append ( obj ) brushColor ( "green" ) цвет границы и заливки для головы остальные зелёные
Слайд 20: Как двигать змейку?
20 Каждое следующее звено перемещается на место предыдущего! ! В каком порядке перебирать звенья? ? Для k - ого звена: newCoord = coords (snake[k- 1 ]) moveObjectTo (snake[k], newCoord [ 0 ], newCoord [ 1 ]) с последнего! координаты предыдущего звена
Слайд 21: Как двигать змейку?
21 Вся змейка: def moveSnake ( xNew, yNew ): global x, y for k in range ( len (snake)- 1, 0,- 1 ): newCoord = coords (snake[k- 1 ]) moveObjectTo (snake[k], newCoord [ 0 ], newCoord [ 1 ]) moveObjectTo (snake[ 0 ], xNew, yNew) x = xNew y = yNew перебор с последнего, кроме головы двигаем голову
Слайд 22: Как двигать змейку?
22 Шаг перемещения всегда равен a ! ! Удобно так: dx, dy = –1, 0 или1 def keyPressed (event): global dx, dy if event.keycode == VK_LEFT : dx = - 1 dy = 0 ... def update (): if dx or dy : moveSnake ( x + dx *a, y + dy *a ) dy*a dx*a если оба нули, двигать не нужно!
Слайд 23: Полная программа
23 from graph import * def move Snake (xNew, yNew): ... def update (): ... def keyPressed (event): ... # рисуем синий квадрат x = 100 ; y = 100 # координаты головы dx = 0 ; dy = 0 # в начале стоит на месте a = 10 ; N = 20 # размер и количество звеньев # рисуем змейку в начальном положении onKey ( keyPressed ) onTimer ( update, 50 ) run ()
Слайд 24: Задания
« 3 » : Собрать и запустить программу. «4» : Змейка не может выйти за пределы синего квадрата ( останавливается у стенки). 24